PageSourceSearch

https://www.wesfarmers.com.au/ResourcePackages/Wesfarmers/assets/dist/js/app.js?package=Wesfarmers

js wesfarmers.com.au collected 2026-10-02 07:19:10 UTC 108,287 bytes, 1,302 lines download raw bytes

1if (!window.location.origin) {
2	window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
3}
4// define jQuery
5jQuery(function ($) {
6	'use strict';
7	var accordion = {
8
9		init: function () {
10			// accordion
11			//$('.accordion ul li h3').on('click', function () {
12			$('.accordion button').on('click', function () {
13
14				$(this).toggleClass('active');
15				$(this).next().slideToggle('400');
16			});
17		}
18	};
19	var contactOptions = {
20
21		elemContact: '.ddlContact',
22		elemDivision: '.ddlDivision',
23		allContacts: null,
24
25		reset: function () {
26
27			var blank = $(this.elemContact + ' option').first();
28			$(this.elemContact + ' option').remove();
29			blank.appendTo(this.elemContact);
30		},
31
32		bind: function () {
33
34			$(this.elemDivision).on('change', function () {
35				contactOptions.reset();
36				var sel = $(this).find(':selected').val();
37				//TODO: streamline this function
38				var opts = contactOptions.allContacts.filter(function (index) {
39					return (index === 0 || $(this).attr('class') === sel);
40				});
41				$.each(opts, function (i, j) {
42					$(j).appendTo(contactOptions.elemContact);
43				});
44				//$(contactOptions.elemContact + ' option').first().attr("selected", "selected");
45			});
46		},
47
48		init: function () {
49			this.allContacts = $(this.elemContact + ' option');
50			this.reset();
51			this.bind();
52		}
53	};
54	var btt = {
55
56		bind: function () {
57
58			$(document).on('click touch', '#btt', function (e) {
59				e.preventDefault;
60				$('html, body').animate({ scrollTop: 0 }, 700);
61				return false;
62			});
63		},
64
65		eventListeners: function () {
66
67			$(window).scroll(function () {
68
69				$('#btt').css('bottom', Math.max(30, $('footer').outerHeight() - ($(document).height() - $(window).scrollTop() - $(window).height())));
70
71				if ($(window).scrollTop() > 200) {
72					$('#btt').fadeIn(300);
73				}
74				else {
75					$('#btt').fadeOut(300);
76				}
77
78			});
79
80		},
81
82		init: function () {
83
84			$('#btt').fadeOut(300);
85			btt.bind();
86			btt.eventListeners();
87		}
88	};
89	var burgerElems = {
90
91		elms: {
92			burgerButton: $('#burger-button')
93		},
94
95		burgerFunction: function () {
96			burgerElems.elms.burgerButton.on('click', function (e) {
97				e.preventDefault();
98				$(this).toggleClass('is-active');
99				$('#main').toggleClass('overlay');
100				$('.nav-wrapper').toggleClass('mbl-active');
101				if ($(this).hasClass('is-active')) {
102					$('.global-sub').removeClass('is-active');
103					$('.global-sub-nav.is-active').slideToggle('400').removeClass('is-active');
104				}
105			});
106		},
107
108		eventListeners: function () {
109			if ($('#burger-button').length > 0) {
110				burgerElems.burgerFunction();
111			}
112		},
113		init: function () {
114			burgerElems.eventListeners();
115		}
116	};
117	var contentNav = {
118
119		$window: $(window),
120
121		desktopWidth: 1280,
122
123		mobile: {
124
125			$toggle: $('.content-nav.mobile-nav .mbl-content-nav'),
126			proxyToggle: null,
127			isListening: false,
128
129			init: function () {
130				this.proxyToggle = $.proxy(this.toggleHandler, this);
131			},
132
133			listen: function () {
134				if (!this.isListening) {
135					this.isListening = true;
136					this.$toggle.on('click touch', this.proxyToggle);
137				}
138			},
139
140			cancel: function () {
141				if (this.isListening) {
142					this.isListening = false;
143					this.$toggle.off('click touch', this.proxyToggle);
144				}
145			},
146
147			toggleHandler: function (e) {
148				e.preventDefault();
149				$(e.target).toggleClass('is-active');
150			}
151		},
152
153
154		desktop: {
155			$toggle: $('.content-nav.desktop-nav .dropdown'),
156
157			proxyToggle: null,
158			isListening: false,
159
160			init: function () {
161				this.proxyToggle = $.proxy(this.toggleHandler, this);
162				
163				$(".content-nav.desktop-nav .sub-nav li").addClass("is-active");
164			},
165
166			listen: function () {
167
168				if (!this.isListening) {
169					this.isListening = true;
170					this.$toggle.on('click touch', this.proxyToggle);
171				}
172			},
173
174			cancel: function () {
175				if (this.isListening) {
176					this.isListening = false;
177					this.$toggle.off('click touch', this.proxyToggle);
178				}
179			},
180
181			toggleHandler: function (e) {
182
183
184				var $el = $(e.target);
185				var $drop = $el.closest('.dropdown');
186				// var isActive = $drop.hasClass('is-active');
187
188				if (!$el.is('a') && !$el.hasClass('toggle')) {
189					// console.log('first if condition')
190					e.preventDefault();
191					if($el.hasClass('sub-nav-dropdown')) {
192						// console.log('arrow is clicked');
193						$el.siblings('a').toggleClass('active');
194					}
195					else {
196						$el.toggleClass('is-active');
197					}
198				}
199				else if ($el.hasClass('toggle')) {
200					const listIndex = $(e.target).parent().index()-1;
201					// console.log(this.$toggle[listIndex])
202					this.$toggle[listIndex].classList.toggle('is-active');
203				}
204			}
205		},
206
207
208		init: function () {
209			this.desktop.init();
210			this.mobile.init();
211
212			this.$window.on('resize orientationchange', $.proxy(this.resize, this));
213			this.resize();
214		},
215
216
217		resize: function () {
218			if (this._getInnerWidth() >= this.desktopWidth) {
219				this.desktop.listen();
220				this.mobile.cancel();
221			}
222			else {
223				this.mobile.listen();
224				this.desktop.cancel();
225			}
226		},
227
228		_getInnerWidth: function () {
229			return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
230		}
231
232	};
233
234
235
236	/* globals Foundation: false */
237	var footerPos = {
238
239		elms: {
240			footer: $('footer'),
241			body: $('body')
242		},
243
244		footerFunction: function () {
245
246		},
247
248		eventListeners: function () {
249			var footerHeight = footerPos.elms.footer.height() + 80;
250			var bodyHeight = footerPos.elms.body.height();
251			var windowHeight = $(window).height();
252
253			if (Foundation.MediaQuery.atLeast('medium')) {
254				$('#main').css('padding-bottom', footerHeight);
255				if (bodyHeight < windowHeight) {
256					$('body').addClass('ftr-fix');
257				}
258			}
259		},
260		init: function () {
261			footerPos.eventListeners();
262		}
263	};
264	var headerScroll = {
265
266		elms: {
267
268		},
269
270		headerFunction: function () {
271
272		},
273
274		eventListeners: function () {
275			//caches a jQuery object containing the header element
276			var body = $('body');
277			var header = $('header');
278			var headerHeight = header.height();
279			$(window).scroll(function () {
280				var scroll = $(window).scrollTop();
281
282				if (scroll >= 100) {
283					body.addClass('sticky-header');
284				} else {
285					body.removeClass('sticky-header');
286				}
287			});
288		},
289		init: function () {
290			headerScroll.eventListeners();
291		}
292	};
293	/* globals doT: false */
294	var historyTimeline = {
295
296		renderTemplate: null,
297		template: '{{~ it :i}}<div class="year"><div class="midline"></div><span class="ylabel">{{=i.year}}</span>{{~ i.items :i}}<a href="{{=i.Url}}" class="day {{=i.positionOverride}}"><div class="wrapper {{? !i.Image }}no-image{{?}}">{{? i.Image }}<div class="image {{=i.Class}}"><img src="{{=i.Image}}" /></div>{{?}}<div class="copy"><span class="tag">{{=i.Category}}</span><h2>{{=i.Title}}</h2><span class="date">{{=i.Moment.format("MMM YYYY")}}</span></div></div></a>{{~}}</div>{{~}}',
298
299		renderData: function (timeline, data, queryCategory) {
300			if (queryCategory) {
301				var ret = [];
302				$(data).each(function (i, d) {
303					if (d.Category === queryCategory) {
304						ret.push(d);
305					}
306				});
307				data = ret;
308			} else {
309
310			}
311
312			var groups = {};
313			$.each(data, function (i, item) {
314				item.Moment = moment(item.Date, 'DD/MM/YYYY', true);
315				var year = item.Moment.year();
316				//console.log(year);
317				if (groups[year]) {
318					groups[year].push(item);
319				} else {
320					groups[year] = [item];
321				}
322			});
323
324			var dataByYear = $.map(groups, function (itemsForYear, year) {
325				return {
326					year: year,
327					items: itemsForYear
328				};
329			});
330			var layoutClass = 'center-left';
331			$.each(groups, function (k, v) {
332				if ($(this).length < 2) {
333					var retClass = setClass();
334				}
335				v[0].positionOverride = retClass;
336			});
337
338			function setClass() {
339
340				if (layoutClass === 'center-left') {
341					layoutClass = 'center-right';
342				}
343				else {
344					layoutClass = 'center-left';
345				}
346				return layoutClass;
347
348			}
349			dataByYear.sort(function (a, b) {
350				if (a.year > b.year) {
351					return -1;
352				} else if (a.year < b.year) {
353					return 1;
354				} else {
355					return 0;
356				}
357
358			});
359			//append the html
360			var result = this.renderTemplate(dataByYear);
361			$('.timeline', timeline).append(result);
362			//ensure all the heights of the pods match
363			timeline.imagesLoaded().always(function (instance) {
364				timeline.find(".year .day .wrapper").matchHeight();
365			});
366
367
368		},
369		buildFilter: function (timeline, data) {
370			var categories = [];
371
372			$.each(data, function (index, value) {
373				if ($.inArray(value.Category, categories) == -1) {
374					//var insert = '<a href="#">' + value.Category + '</a>';
375					categories.push(value.Category);
376				}
377			});
378			var cList = $('.timeline-filter');
379			$.each(categories, function (i) {
380				var filterBtn = $('<a/>').text(categories[i]).attr('data-name', categories[i]).attr('class', 'filter-btn').attr('href', '?cat=' + categories[i]).appendTo(cList);
381				var filterOptions = $('<option>').text(categories[i]).attr('data-path', '?cat=' + categories[i]).appendTo('.mbl-filter');
382			});
383			$('.filter-btn').each(function () {
384				var pageQuery = window.location.search.substring(1).split('=');
385				var queryCategory = pageQuery[1];
386				if ($(this).data('name') == queryCategory) {
387					$('.filter-btn').removeClass('active');
388					$(this).addClass('active');
389				}
390			});
391		},
392		disable: function (timeline) {
393			//$('.load-more', timeline).hide();
394		},
395		filterCategory: function (catagoryName) {
396
397		},
398
399		init: function () {
400			this.initTemplates();
401			this.initEvents();
402		},
403
404		initTemplates: function () {
405			this.renderTemplate = doT.template(this.template);
406		},
407
408		initEvents: function () {
409			var pageQuery = window.location.search.substring(1).split('=');
410
411			var queryCategory = pageQuery[1];
412			// if(document.location.search.length) {
413			// 	if (queryCategory !== '') {
414			// 		$('.timeline').removeClass('show-all');
415			// 	}
416			// } else {
417			//     // no query string exists
418			// }
419
420
421			$('[data-history]').each(function (i, timeline) {
422
423				var timeline = $(timeline);
424
425				var loadUrl = timeline.data('url');
426				$.ajax({
427					url: loadUrl,
428					type: 'GET',
429					dataType: 'json',
430					success: function (data) {
431						historyTimeline.renderData(timeline, data, queryCategory);
432						historyTimeline.buildFilter(timeline, data);
433					},
434					error: function () {
435						console.log('Could not load content.');
436					}
437				});
438			});
439			//had to add js function for anchor onclick - fixes a bug in small screen
440			$(document).on('click', 'a.filter-btn', function (e) {
441				window.location = window.location.origin + window.location.pathname + $(this).attr('href');
442				e.preventDefault();
443			});
444			//Mobile drop down version
445			$('.mbl-filter').on('change', function () {
446				var dataID = $(this).find(':selected').val();
447				window.location = window.location.origin + window.location.pathname + $(this).find(':selected').attr('data-path');
448			});
449		}
450	};
451
452	var gmap = {
453
454		init: function () {
455			// handles google maps
456			if ($('.g-map').length > 0) {
457				var pinSmall = '/assets/img/icons/icon-pin.png';
458				$('.g-map').each(function () {
459					var myCenter = new google.maps.LatLng($(this).data('lat'), $(this).data('lon'));
460					var locationElement = $(this)[0];
461					function initialize() {
462						var mapProp = {
463							center: myCenter,
464							zoom: 17,
465							mapTypeId: google.maps.MapTypeId.ROADMAP
466						};
467						var map = new google.maps.Map(locationElement, mapProp);
468						var marker = new google.maps.Marker({
469							icon: pinSmall,
470							position: myCenter
471						});
472						marker.setMap(map);
473					}
474					google.maps.event.addDomListener(window, 'load', initialize);
475				});
476			}
477		}
478
479	};
480	var matchHeightElms = {
481
482		elms: {
483			promoBox: $('.promo')
484		},
485
486		matchHeightFunction: function () {
487			$('.promo').matchHeight();
488		},
489
490		eventListeners: function () {
491			if ($('.promo').length > 0) {
492				matchHeightElms.matchHeightFunction();
493			}
494		},
495
496		init: function () {
497			matchHeightElms.eventListeners();
498			// filters min height
499			if ($('.filter-wrapper').length > 0) {
500				var groupMinHeight = $('.group-select').height();
501				$('.group').css('min-height', groupMinHeight);
502			}
503		}
504	};
505	var mobileNav = {
506		$window: $(window),
507		$main: $('#main'),
508		$columns: $('nav .global-sub .columns'),
509
510		$burgerBtn: $('#burger-button'),
511		$mblBack: $('nav .mbl-back'),
512		$globalSub: $('nav .global-sub'),
513		$navWrapper: $('.nav-wrapper'),
514
515		$btns: $('nav .global > li > a, .util > li > a'),
516		$btnsExpand: $('nav .global-sub .sub-title'),
517		$btnsSubExpand: $('nav .global-sub-nav .sub-nav a'),
518		$subExpand: $('nav .global-sub-nav .sub-nav'),
519		$searchField: $('nav .global-search #gbl-srch, nav .global-search #gbl-srch-sbmt'),
520
521		desktopWidth: 1280,
522		proxyClick: null,
523		proxyToggleExpand: null,
524		proxyClose: null,
525		proxyBack: null,
526		proxySubToggleExpand: null,
527		proxyFocus: null,
528
529		activeClass: 'is-active',
530
531		isListening: false,
532
533		init: function () {
534			this.proxyToggleExpand = $.proxy(this.toggleExpand, this);
535			this.proxyClick = $.proxy(this.click, this);
536			this.proxyClose = $.proxy(this.close, this);
537			this.proxyBack = $.proxy(this.back, this);
538			this.proxySubToggleExpand = $.proxy(this.subToggleExpand, this);
539			this.proxyFocus = $.proxy(this.focus, this);
540
541			this.$window.on('resize orientationchange', $.proxy(this.resize, this));
542
543			this.resize();
544		},
545
546
547		focus: function (e) {
548			// stop tab focus outside of navigation being open
549			if (e.keyCode === 9 && !this.$navWrapper.hasClass('mbl-active')) {
550				e.preventDefault();
551			}
552		},
553
554		resize: function () {
555			if (this._getInnerWidth() < this.desktopWidth) {
556				this.listen();
557			}
558			else {
559				this.cancel();
560				this.close();
561			}
562		},
563
564		listen: function () {
565			if (!this.isListening) {
566				this.isListening = true;
567				this.$btns.on('click touch', this.proxyClick);
568				this.$btnsExpand.on('click touch', this.proxyToggleExpand);
569				this.$mblBack.on('click touch', this.proxyBack);
570				this.$main.on('click touch', this.proxyClose);
571				this.$btnsSubExpand.on('click touch', this.proxySubToggleExpand);
572				this.$window.on('keydown', this.proxyFocus);
573			}
574		},
575
576		cancel: function () {
577			if (this.isListening) {
578				this.isListening = false;
579				this.$btns.off('click touch', this.proxyClick);
580				this.$btnsExpand.off('click touch', this.proxyToggleExpand);
581				this.$mblBack.off('click touch', this.proxyBack);
582				this.$main.off('click touch', this.proxyClose);
583				this.$btnsSubExpand.off('click touch', this.proxySubToggleExpand);
584				//this.$searchField.off('focus', this.proxyFocus);
585				this.$window.off('keydown', this.proxyFocus);
586			}
587		},
588
589		back: function (e) {
590			e.preventDefault();
591			this.$globalSub.removeClass(this.activeClass);
592			this.$columns.removeClass(this.activeClass);
593		},
594
595		close: function (e) {
596			if (e !== undefined && this.$navWrapper.hasClass('mbl-active')) { e.preventDefault(); }
597			this.$burgerBtn.removeClass(this.activeClass);
598			this.$navWrapper.removeClass('mbl-active');
599			this.$main.removeClass('overlay');
600			this.$columns.removeClass(this.activeClass);
601			this.$subExpand.removeClass(this.activeClass);
602		},
603
604		click: function (e) {
605
606			var $target = $(e.target),
607				$parent = $target.closest('li'),
608				$el = $target.next('.global-sub');
609			if (!$el.hasClass(this.activeClass)) {
610				$el.addClass(this.activeClass);
611			}
612			if (!$parent.hasClass('exc')) {
613				e.preventDefault();
614				return false;
615			}
616		},
617
618		toggleExpand: function (e) {
619			e.preventDefault();
620			var $target = $(e.target),
621				$parent = $target.closest('.columns'),
622				isActive = $parent.hasClass(this.activeClass);
623			// close any active sub menus
624			this.$columns.removeClass(this.activeClass);
625			// open 
626			if (!isActive) {
627				$parent.addClass(this.activeClass);
628			}
629		},
630
631		subToggleExpand: function (e) {
632			e.preventDefault();
633			var $target = $(e.target),
634				$parent = $target.closest('.sub-nav'),
635				isActive = $parent.hasClass(this.activeClass);
636			// close any active sub menus
637			this.$subExpand.removeClass(this.activeClass);
638			// open 
639			if (!isActive) {
640				$parent.addClass(this.activeClass);
641			}
642
643		},
644
645		_getInnerWidth: function () {
646			return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
647		}
648	};
649	var navOverlay = {
650
651		$window: $(window),
652		$body: $('body'),
653		$main: $('#main'),
654		desktopWidth: 1280,
655		classes: '.in-large .global > li:not(.exc), .in-large .util > li:not(.exc)',
656		$el: $('.in-large .global > li:not(.exc), .in-large .util > li:not(.exc)'),
657		overlayClassname: 'overlay',
658		proxyToggle: null,
659		resizeProxy: null,
660		isListening: false,
661
662		init: function () {
663			this.proxyToggle = $.proxy(this.toggleOverlay, this);
664			this.resizeProxy = $.proxy(this.resize, this);
665			this.$window.on('resize orientationchange', this.resizeProxy);
666
667			this.resize();
668		},
669
670		resize: function () {
671			if (this._getInnerWidth() >= this.desktopWidth) {
672				this.listen();
673			}
674			else {
675				this.cancel();
676			}
677		},
678
679		listen: function () {
680			if (!this.isListening) {
681				this.isListening = true;
682				this.$el.on('mouseover', this.proxyToggle);
683				this.$el.on('mouseleave', this.proxyToggle);
684			}
685		},
686
687		cancel: function () {
688			if (this.isListening) {
689				this.isListening = false;
690				this.$el.off('mouseover', this.proxyToggle);
691				this.$el.off('mouseleave', this.proxyToggle);
692				this.$main.removeClass(this.overlayClassname);
693			}
694		},
695
696		toggleOverlay: function (e) {
697			if (e.type == 'mouseover') {
698				this.$main.addClass(this.overlayClassname);
699			}
700			else {
701				this.$main.removeClass(this.overlayClassname);
702			}
703		},
704
705
706		_getInnerWidth: function () {
707			return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
708		},
709
710	};
711	var socialFeed = {
712
713		init: function () {
714			$('.social-feed-container').socialfeed({
715				// FACEBOOK
716				// facebook:{
717				//     accounts: ['@james.burnage.1'],  //Array: Specify a list of accounts from which to pull wall posts
718				//     limit: 2,                                   //Integer: max number of posts to load
719				//     access_token: '151427878576646|3b9addff68d31adbce8dce001
719512a024'  //String: "APP_ID|APP_SECRET"
720				// },
721
722				// TWITTER
723				twitter: {
724					accounts: ['@WesfarmersArts', '@Wesfarmers'],                      //Array: Specify a list of accounts from which to pull tweets
725					limit: 2,                                   //Integer: max number of tweets to load
726					consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB',          //String: consumer key. make sure to have your app read-only
727					consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only
728				},
729
730				// VK
731				// vk:{
732				//     accounts: ['@125936523','#teslamotors'],    //Array: Specify a list of accounts from which to pull posts
733				//     limit: 2,                                   //Integer: max number of posts to load
734				//     source: 'all'                               //String: VK API post filter. Possible values: "Owner","Others","all","suggests"
735				// },
736
737				// GOOGLEPLUS
738				// google:{
739				//      accounts: ['#teslamotors'],                //Array: Specify a list of accounts from which to pull posts
740				//      limit: 2,                                  //Integer: max number of posts to load
741				//      access_token: 'YOUR_GOOGLE_PLUS_ACCESS_TOKEN'//String: G+ access token
742				//  },
743
744				// INSTAGRAM
745				instagram: {
746					accounts: ['@wesfarmersarts'],  //Array: Specify a list of accounts from which to pull posts
747					limit: 2,                                   //Integer: max number of posts to load
748					client_id: 'a74146c788fb4729a5961dfa63ed9628',       //String: Instagram client id (option if using access token)
749					access_token: '2980903097.1677ed0.64f3ea4924334a8aa3b208c7a507c366' //String: Instagram access token
750				},
751
752				// PINTEREST
753
754				pinterest: {
755					accounts: ['@me'],   //Array: Specify a list of accounts from which to pull posts
756					//@me to pull your pins
757					//@user/board to pull pins from a user board
758					limit: 2,                                   //Integer: max number of posts to load
759					access_token: 'AVQMYZu0lSviPESW366xeRv2ip3xFDYqDE4mqCpC5JU6MuAv5wAAAAA' //String: Pinterest client id
760				},
761
762				//RSS
763				rss: {
764					urls: ['https://www.smashingmagazine.com/feed/'], //Array: Specifiy a list of rss feed from which to pull posts
765					limit: 2                                      //Integer: max number of posts to load for each url
766				},
767
768				// GENERAL SETTINGS
769				length: 400,                                     //Integer: For posts with text longer than this length, show an ellipsis.
770				show_media: true,                                //Boolean: if false, doesn't display any post images
771				media_min_width: 300,                           //Integer: Only get posts with images larger than this value
772				//update_period: 5000,                            //Integer: Number of seconds before social-feed will attempt to load new posts.
773				template: "tweet.html",                         //String: Filename used to get the post template.
774				template_html:                                  //String: HTML used for each post. This overrides the 'template' filename option
775					'<div class="social-feed-element {{? !it.moderation_passed}}hidden{{?}}" dt-create="{{=it.dt_create}}" social-feed-id = "{{=it.id}}"> \
776                <div class="content"> \
777                    <a class="pull-left" href="{{=it.author_link}}" target="_blank"> \
778                        <img class="media-object" src="{{=it.author_picture}}"> \
779                    </a> \
780                    <div class="media-body"> \
781                        <p> \
782                            <i class="fa fa-{{=it.social_network}}"></i> \
783                            <span class="author-title">{{=it.author_name}}</span> \
784                            <span class="muted pull-right"> {{=it.time_ago}}</span>   \
785                        </p> \
786                        <div class="text-wrapper"> \
787                            <p class="social-feed-text">{{=it.text}}</p> \
788                        </div> \
789                    </div> \
790                </div> \
791                {{=it.attachment}} \
792            </div>',
793
794
795				//date_format: "LLL",                              //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/)
796				moderation: function (content) {                 //Function: if returns false, template will have class hidden
797					return (content.text) ? content.text.indexOf('fuck') == -1 : true;
798				},
799				callback: function () {                          //Function: This is a callback function which is evoked when all the posts are collected and displayed
800					console.log("All posts collected!");
801				}
802			});
803
804			// The .each() method is unnecessary here:
805			$(".twitter-feed").each(function () {
806				var twtHandle = $(this).data("handle");
807				$(this).find('h2').text(twtHandle.substring(1)); // remove first char (replaced in css)
808				$(this).socialfeed({
809					// TWITTER
810					twitter: {
811						accounts: [twtHandle],
812						//accounts: queryTags,                      //Array: Specify a list of accounts from which to pull tweets
813						limit: 4,                                   //Integer: max number of tweets to load
814						consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB',          //String: consumer key. make sure to have your app read-only
815						consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only
816					},
817
818					// GENERAL SETTINGS
819					length: 400,                                     //Integer: For posts with text longer than this length, show an ellipsis.
820					show_media: true,                                //Boolean: if false, doesn't display any post images
821					media_min_width: 300,                           //Integer: Only get posts with images larger than this value
822					//update_period: 5000,                            //Integer: Number of seconds before social-feed will attempt to load new posts.
823					template: "tweet.html",                         //String: Filename used to get the post template.
824					template_html:                                  //String: HTML used for each post. This overrides the 'template' filename option 
825						'<div class="twitter-feed-element {{? !it.moderation_passed}}hidden{{?}}" dt-create="{{=it.dt_create}}" social-feed-id = "{{=it.id}}"> \
826                    <div class="content"> \
827                        <a href="{{=it.link}}" target="_blank"> \
828                            <div class="media-body"> \
829                                <p class="date-time">Post {{=it.time_ago}}</p> \
830                                <div class="text-wrapper"> \
831                                    <p class="social-feed-text">{{=it.text}}</p> \
832                                </div> \
833                            </div> \
834                        </a> \
835                    </div> \
836                </div>',
837
838					//date_format: "LLL",                              //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/)
839					moderation: function (content) {                 //Function: if returns false, template will have class hidden
840						return (content.text) ? content.text.indexOf('fuck') == -1 : true;
841					},
842					callback: function () {                          //Function: This is a callback function which is evoked when all the posts are collected and displayed
843						console.log("All posts collected!");
844					}
845				});
846			});
847
848		}
849	};
850	var stickyFooter = {
851		$window: $(window),
852		$body: $('body'),
853		$header: $('header'),
854		$main: $('#main'),
855		$wrapper: $('#wrapper'),
856		$footer: $('footer'),
857
858		desktopWidth: 1280,
859		proxyResize: null,
860
861		activeClass: 'is-active',
862
863		isListening: false,
864
865		init: function () {
866			this.proxyResize = $.proxy(this.resize, this);
867			this.listen();
868			this.resize();
869		},
870
871
872		resize: function () {
873			var nH = this._getInnerHeight() - this.$footer.outerHeight(),
874				cH = this.$header.outerHeight(true) + this.$main.outerHeight(),
875				footerHeight = this.$footer.height();
876			this.$body.height('100%');
877
878			console.log(this.$header.height(), this.$header.outerHeight(true));
879			if (nH > cH) {
880				if (!this.$footer.hasClass('sticky-footer')) {
881					this.$footer.addClass('sticky-footer');
882				}
883			}
884			else {
885				if (this.$footer.hasClass('sticky-footer')) {
886					this.$footer.removeClass('sticky-footer');
887				}
888			}
889		},
890
891		listen: function () {
892			if (!this.isListening) {
893				this.isListening = true;
894				this.$window.on('resize orientationchange', this.proxyResize);
895			}
896		},
897
898		cancel: function () {
899			if (this.isListening) {
900				this.isListening = false;
901				this.$window.off('resize orientationchange', this.proxyResize);
902			}
903		},
904
905
906		_getInnerHeight: function () {
907			return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
908		}
909
910	};
911
912
913
914	var stickyHeader = {
915		$window: $(window),
916		$body: $('body'),
917		//$header : $('header'),
918		desktopWidth: 1280,
919		lastWidth: 0,
920		proxyScroll: null,
921		scrollPos: 1,
922		stickyClassname: 'sticky-header',
923		resizeClassname: 'resize', // stops all transitions on resize
924		isListening: false,
925		t: 0,
926
927		init: function () {
928			this.proxyScroll = $.proxy(this.onscroll, this);
929			this.$window.on('resize orientationchange', $.proxy(this.resize, this));
930			this.lastWidth = this.$window.width();
931			this.resize();
932		},
933
934		resize: function (e) {
935			var w = this._getInnerWidth();
936			if (w >= this.desktopWidth) {
937				this.listen();
938			}
939			else {
940				this.cancel();
941			}
942
943			if (this.lastWidth !== w) {
944				// add class to remove transition effects during resize
945				if (!this.$body.hasClass(this.resizeClassname)) {
946					this.$body.addClass(this.resizeClassname);
947				}
948				// on complete removes resize class
949				clearTimeout(this.t);
950				this.t = setTimeout($.proxy(this.resizeComplete, this), 500);
951			}
952			this.lastWidth = w;
953		},
954
955		listen: function () {
956			if (!this.isListening) {
957				this.isListening = true;
958				this.$window.on('scroll', this.proxyScroll);
959			}
960		},
961
962		cancel: function (e) {
963			if (this.isListening) {
964				this.isListening = false;
965				this.$window.off('scroll', this.scrollProxy);
966			}
967		},
968
969		onscroll: function (e) {
970			if (this.$window.scrollTop() > this.scrollPos) {
971				if (!this.$body.hasClass(this.stickyClassname)) {
972					this.$body.addClass(this.stickyClassname);
973				}
974			}
975			else {
976				if (this.$body.hasClass(this.stickyClassname)) {
977					this.$body.removeClass(this.stickyClassname);
978				}
979			}
980		},
981
982		resizeComplete: function () {
983			clearTimeout(this.t);
984			if (this.$body.hasClass(this.resizeClassname)) {
985				this.$body.removeClass(this.resizeClassname);
986			}
987		},
988
989
990		_getInnerWidth: function () {
991			return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
992		},
993
994
995
996	};
997
998	var tableElems = {
999
1000		elms: $('.main table'),
1001
1002		tableFunction: function () {
1003			tableElems.elms.each(function () {
1004				var $this = $(this),
1005					parent = $this.parent();
1006				if (!parent.hasClass('table')) {
1007					$this.wrap('<div class="table"/>');
1008				}
1009			});
1010		},
1011
1012		eventListeners: function () {
1013			if (tableElems.elms.length > 0) {
1014				tableElems.tableFunction();
1015			}
1016		},
1017		init: function () {
1018			tableElems.eventListeners();
1019		}
1020	};
1021	// The .each() method is unnecessary here:
1022
1023
1024	// $( '.twitter-panel' ).each(function() {
1025	//   var twtHandle = $(this).data('handle'),
1026	//         $this = $(this);
1027
1028	//   //$this.find('h2').text(twtHandle.substring(1)); // remove first char (replaced in css)
1029
1030	//   $this.socialfeed({
1031	//         // TWITTER
1032	//         twitter:{
1033	//             accounts: [ twtHandle ], 
1034	//             //accounts: queryTags,                      //Array: Specify a list of accounts from which to pull tweets
1035	//             limit: 1,                                   //Integer: max number of tweets to load
1036	//             consumer_key: 'Q4zFXZwmO2uD1Ru4aCilYwTnB',          //String: consumer key. make sure to have your app read-only
1037	//             consumer_secret: 'iTzc234DGCNprwXkDkS0xQcc9nGkABTClQGOZ4er9Y7WkaMHur',//String: consumer secret key. make sure to have your app read-only
1038	//          },
1039
1040	//         // GENERAL SETTINGS
1041	//         length:400,                                     //Integer: For posts with text longer than this length, show an ellipsis.
1042	//         show_media:false,                                //Boolean: if false, doesn't display any post images
1043	//         media_min_width: 300,                           //Integer: Only get posts with images larger than this value
1044	//         //update_period: 5000,                            //Integer: Number of seconds before social-feed will attempt to load new posts.
1045	//         template: 'tweet.html',                         //String: Filename used to get the post template.
1046	//         template_html:                                 //String: HTML used for each post. This overrides the 'template' filename option
1047
1048	//                     '<p class="date-time">Post {{=it.time_ago}}</p> \
1049	//                     <div class="text-wrapper"> \
1050	//                         <a href="{{=it.link}}" target="_blank"> \
1051	//                             <p class="social-feed-text">{{=it.text}}</p> \
1052	//                         </a> \
1053	//                     </div>',
1054
1055	//         //date_format: "LLL",                              //String: Display format of the date attribute (see http://momentjs.com/docs/#/displaying/format/)
1056	//         moderation: function(content) {                 //Function: if returns false, template will have class hidden
1057	//             return  (content.text) ? content.text.indexOf('fuck') == -1 : true;
1058	//         },
1059	//         callback: function() {                          //Function: This is a callback function which is evoked when all the posts are collected and displayed
1060	//             console.log('All posts collected!');
1061	//         }
1062	//     });
1063	// });
1064
1065	//  ***********************
1066	//  $$ Document ready
1067	//  ***********************
1068	(function ($) {
1069		$(function () {
1070			window.windowWidth = window.innerWidth;
1071			window.windowHeight = window.innerHeight;
1072
1073			window.isiPhone = navigator.userAgent.toLowerCase().indexOf('iphone');
1074			window.isiPad = navigator.userAgent.toLowerCase().indexOf('ipad');
1075			window.isiPod = navigator.userAgent.toLowerCase().indexOf('ipod');
1076			window.isFirefox = (navigator.userAgent.toLowerCase().indexOf('firefox') > -1);
1077
1078			window.tablet = 768;
1079			window.tabletWide = 1024;
1080			window.desktop = 1280;
1081
1082
1083
1084			// Add functions here
1085
1086			headerScroll.init();
1087			footerPos.init();
1088			navOverlay.init();
1089			mobileNav.init();
1090
1091			accordion.init();
1092
1093			socialFeed.init();
1094
1095			burgerElems.init();
1096			contentNav.init();
1097			historyTimeline.init();
1098
1099			// stickyHeader.init(); 
1100			// stickyFooter.init();
1101			mediaGallery.init();
1102			tableElems.init();
1103			contactOptions.init();
1104			btt.init();
1105
1106			$(function () {
1107				$('.fit-video').fitVids();
1108			});
1109			$(function () {
1110				$('.panel .image img').lazy({
1111					effect: "fadeIn",
1112					effectTime: 300,
1113					threshold: 75
1114				});
1115				$('.panel .copy').matchHeight();
1116			});
1117			if ($(window).width() <= 1280) {
1118				$('.nav-wrapper').addClass('in-mobile');
1119				$('.nav-wrapper').removeClass('in-large');
1120			} else {
1121				$('.nav-wrapper').removeClass('in-mobile');
1122				$('.nav-wrapper').addClass('in-large');
1123			}
1124			$(function () {
1125				$(document).on('click touch', '.gallery-filter .trigger', function () {
1126					$(this).toggleClass('active');
1127					$(this).next().toggleClass('active');
1128				});
1129			});
1130			$(function () {
1131				$(document).on('click touch', '.asx-header .button', function () {
1132					$(this).toggleClass('active');
1133					//$(this).next().toggleClass('active');
1134				})
1135			});
1136			$(function () {
1137				$(document).on('click touch', '.tnc', function () {
1138					var $chk = $(this).find('input[type=checkbox]');
1139					$chk.prop('checked', $chk.is(':checked') ? false : true);
1140				})
1141			});
1142		});
1143
1144		//TODO TIDY THIS INTO PARTIAL
1145		var stickyHeaders = (function () {
1146
1147			var $stickies,
1148				$offset;
1149
1150			var load = function (stickies, target, offset) {
1151
1152				$offset = offset || 0;
1153
1154				if (typeof stickies === "object" && stickies instanceof jQuery && stickies.length > 0) {
1155
1156					$stickies = stickies.each(function () {
1157
1158						var $thisSticky = $(this);
1159
1160						$thisSticky
1161							.data('originalPosition', $thisSticky.offset().top)
1162							.data('originalHeight', $thisSticky.outerHeight());
1163					});
1164
1165					target.off("scroll.stickies").on("scroll.stickies", function (event) {
1166						_whenScrolling(event);
1167					});
1168				}
1169			};
1170
1171			var _whenScrolling = function (event) {
1172
1173				var $scrollTop = $(event.currentTarget).scrollTop() + $offset;
1174
1175				$stickies.each(function (i) {
1176
1177					var $thisSticky = $(this),
1178						$stickyPosition = $thisSticky.data('originalPosition'),
1179						$newPosition,
1180						$nextSticky;
1181
1182					if ($stickyPosition <= $scrollTop) {
1183
1184						$newPosition = Math.max(0, $scrollTop - $stickyPosition);
1185						$nextSticky = $stickies.eq(i + 1);
1186
1187						if ($nextSticky.length > 0) {
1188
1189							$newPosition = Math.min($newPosition, ($nextSticky.data('originalPosition') - $stickyPosition) - $thisSticky.data('originalHeight'));
1190						}
1191
1192					} else {
1193
1194						$newPosition = 0;
1195					}
1196
1197					$thisSticky.css('transform', 'translateY(' + $newPosition + 'px)');
1198
1199					//could just as easily use top instead of transform
1200					//$thisSticky.css('top', $newPosition + 'px');
1201				});
1202			};
1203
1204			return {
1205				load: load
1206			};
1207		})();
1208
1209		$(window).on('load', function () {
1210			if ($(window).width() >= 1025) {
1211				stickyHeaders.load($(".ylabel"), $(window), 100);
1212			}
1213			if ($(window).width() >= 770) {
1214				$('.wrapper.no-image').each(function () {
1215					var $prevItemHeight = $(this).parent().prev('.day').height();
1216					$(this).height($prevItemHeight);
1217				});
1218			}
1219		});
1220
1221		$(document).foundation();
1222	})(jQuery);
1223
1224
1225	//  ***********************
1226	//  $$ Smart resize
1227	//  ***********************
1228	(function ($, sr) {
1229		var debounce = function (func, threshold, execAsap) {
1230			var timeout;
1231			return function debounced() {
1232				var obj = this,
1233					args = arguments;
1234				function delayed() {
1235					if (!execAsap) {
1236						func.apply(obj, args);
1237					}
1238					timeout = null;
1239				}
1240				if (timeout) {
1241					clearTimeout(timeout);
1242				} else if (execAsap) {
1243					func.apply(obj, args);
1244				}
1245				timeout = setTimeout(delayed, threshold || 200);
1246			};
1247		};
1248		jQuery.fn[sr] = function (fn) {
1249			return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr);
1250		};
1251	})(jQuery, 'smartresize'); // End smartresize
1252
1253	var resizeTimer;
1254	$(window).smartresize(function () {
1255		window.newWindowWidth = window.innerWidth;
1256		window.newWindowHeight = window.innerHeight;
1257
1258		var newWindowWidthResult = newWindowWidth * 0.66,
1259			$navWrapper = $('.nav-wrapper');
1260
1261		window.windowWidth = window.innerWidth;
1262		window.windowHeight = window.innerHeight;
1263		if ($(window).width() < 1024) { // changed to 1280
1264			footerPos.init();
1265		}
1266		if ($(window).width() <= 1280) { // changed to 1280
1267			$navWrapper.addClass('in-mobile');
1268			$navWrapper.removeClass('in-large');
1269		} else {
1270			$navWrapper.removeClass('in-mobile');
1271			$navWrapper.addClass('in-large');
1272			if ($navWrapper.hasClass('mbl-active')) {
1273				$navWrapper.removeClass('mbl-active');
1274				$('.burger-button').removeClass('is-active');
1275				$('#main').removeClass('overlay');
1276			}
1277		}
1278		if ($(window).width() >= 760) { // changed to 1280
1279			$('.wrapper.no-image').each(function () {
1280				var $prevItemHeight = $(this).parent().prev('.day').height();
1281				$(this).height($prevItemHeight);
1282			});
1283		}
1284		if ($('.mg-grid').length > 0) {
1285			$('.mg-grid li').removeAttr('style');
1286		}
1287
1288		// JIRA: WESF-20
1289		// Only apply the resize fix if not in Sitefinity editor
1290		if ($('.sfPageEditor').length == 0) {
1291			$('body').addClass('resize');
1292			clearTimeout(resizeTimer);
1293			resizeTimer = setTimeout(function () {
1294				$('body').removeClass('resize');
1295				// Run code here, resizing has "stopped"        
1296			}, 250);
1297		}
1298	});
1299});// jQuery end
1300// no writing in this file
1301
1302//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBvbHlmaWxscy5qcyIsImpxdWVyeS1zdGFydC5qcyIsImNvbXBvbmVudHMvYzA3X2FjY29yZGlvbi5qcyIsImNvbXBvbmVudHMvY29udGFjdE9wdGlvbnMuanMiLCJnbG9iYWwvYnR0LmpzIiwiZ2xvYmFsL2J1cmdlcnRpbWUuanMiLCJnbG9iYWwvY29udGVudC1uYXYuanMiLCJnbG9iYWwvZm9vdGVyLmpzIiwiZ2xvYmFsL2hlYWRlclNjcm9sbC5qcyIsImdsb2JhbC9oaXN0b3J5LmpzIiwiZ2xvYmFsL2xvY2F0aW9ucy5qcyIsImdsb2JhbC9tYXRjaEhlaWdodC5qcyIsImdsb2JhbC9tb2JpbGUtbmF2LmpzIiwiZ2xvYmFsL25hdi1vdmVybGF5LmpzIiwiZ2xvYmFsL3NvY2lhbC1mZWVkLmpzIiwiZ2xvYmFsL3N0aWNreS1mb290ZXIuanMiLCJnbG9iYWwvc3RpY2t5LWhlYWRlci5qcyIsImdsb2JhbC90YWJsZXMuanMiLCJnbG9iYWwvdHdpdHRlci1wYW5lbC5qcyIsImRvYy1yZWFkeS5qcyIsInJlc2l6ZS1ldmVud
1302HMuanMiLCJqcXVlcnktZW5kLmpzIiwiYXBwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6RUE7QUFDQTtBQ0RBIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImlmICghd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIH
1302dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICh3aW5kb3cubG9jYXRpb24ucG9ydCA/ICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0OiAnJyk7XHJcbn0iLCIvLyBkZWZpbmUgalF1ZXJ5XHJcbmpRdWVyeShmdW5jdGlvbigkKXtcclxuJ3VzZSBzdHJpY3QnOyIsInZhciBhY2NvcmRpb24gPSB7XHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHQgICAvLyBhY2NvcmRpb25cclxuICAgICAgIC8vJCgnLmFjY29yZGlvbiB1bCBsaSBoMycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgIFx0JCgnLmFjY29yZGlvbiBidXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgIFx0XHRcclxuICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICQodGhpcykubmV4dCgpLnNsaWRlVG9nZ2xlKCc0MDAnKTtcclxuICAgICAgICB9KTtcclxuXHR9XHJcbn07IiwidmFyIGNvbnRhY3RPcHRpb25zID0ge1xyXG5cclxuXHRlbGVtQ29udGFjdDogJy5kZGxDb250YWN0JywgXHJcblx0ZWxlbURpdmlzaW9uOiAnLmRkbERpdmlzaW9uJywgXHJcblx0YWxsQ29udGFjdHM6IG51bGwsIFxyXG5cclxuXHRyZXNldDogZnVuY3Rpb24oKSB7IFxyXG5cclxuXHRcdHZhciBibGFuayA9ICQodGhpcy5lbGVtQ29udGFjdCArICcgb3B0aW9uJykuZmlyc3QoKTtcclxuXHRcdCQodGhpcy5lbGVtQ29udGFjdCArICcgb3B0aW9uJykucmVtb3ZlKCk7IFxyXG5cdFx0YmxhbmsuYXBwZW5kVG8odGhpcy5lbGVtQ29udGFjdCk7IFxyXG5cdH0sIFxyXG5cclxuXHRiaW5kOiBmdW5jdGlvbigpIHtcclxuXHJcblx0XHQkKHRoaXMuZWxlbURpdmlzaW9uKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7ICBcclxuXHRcdFx0Y29udGFjdE9wdGlvbnMucmVzZXQoKTtcclxuXHRcdFx0dmFyIHNlbCA9ICQodGhpcykuZmluZCgnOnNlbGVjdGVkJykudmFsKCk7IFxyXG5cdFx0XHQvL1RPRE86IHN0cmVhbWxpbmUgdGhpcyBmdW5jdGlvblxyXG5cdFx0XHR2YXIgb3B0cyA9IGNvbnRhY3RPcHRpb25zLmFsbENvbnRhY3RzLmZpbHRlcihmdW5jdGlvbihpbmRleCkgeyBcclxuXHRcdFx0XHRyZXR1cm4gKGluZGV4ID09PSAwIHx8ICQodGhpcykuYXR0cignY2xhc3MnKSA9PT0gc2VsKTtcclxuXHRcdFx0fSk7IFxyXG5cdFx0XHQkLmVhY2gob3B0cywgZnVuY3Rpb24oaSxqKSB7IFxyXG5cdFx0XHRcdCQoaikuYXBwZW5kVG8oY29udGFjdE9wdGlvbnMuZWxlbUNvbnRhY3QpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8kKGNvbnRhY3RPcHRpb25zLmVsZW1Db250YWN0ICsgJyBvcHRpb24nKS5maXJzdCgpLmF0dHIoXCJzZWxlY3RlZFwiLCBcInNlbGVjdGVkXCIpO1xyXG5cdFx0fSk7XHJcblx0fSwgXHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyAgXHJcblx0XHR0aGlzLmFsbENvbnRhY3RzID0gJCh0aGlzLmVsZW1Db250YWN0ICsgJyBvcHRpb24nKTsgXHJcblx0XHR0aGlzLnJlc2V0KCk7XHJcblx0XHR0aGlzLmJpbmQoKTtcclxuXHR9IFxyXG59OyIsInZhciBidHQgPSB7XHJcblxyXG5cdGJpbmQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdFxyXG5cdFx0JChkb2N1bWVudCkub24oJ2NsaWNrIHRvdWNoJywnI2J0dCcsIGZ1bmN0aW9uIChlKSB7IFxyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0O1xyXG5cdFx0XHQkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAwfSwgNzAwKTsgXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuICAgICAgXHR9KTtcclxuXHR9LFxyXG5cclxuXHRldmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7ICBcclxuXHJcblx0XHQkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCkgeyBcclxuXHJcblx0ICAgIFx0JCgnI2J0dCcpLmNzcygnYm90dG9tJywgTWF0aC5tYXgoMzAsICQoJ2Zvb3RlcicpLm91dGVySGVpZ2h0KCkgLSAoJChkb2N1bWVudCkuaGVpZ2h0KCkgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSAkKHdpbmRvdykuaGVpZ2h0KCkpKSk7IFxyXG5cclxuXHQgICAgXHRpZiAoJCh3aW5kb3cpLnNjcm9sbFRvcCgpID4gMjAwKSBcclxuXHQgICAgXHR7IFxyXG5cdCAgICBcdFx0JCgnI2J0dCcpLmZhZGVJbigzMDApO1xyXG5cdCAgICBcdH0gXHJcblx0ICAgIFx0ZWxzZSBcclxuXHQgICAgXHR7XHJcblx0ICAgIFx0XHQkKCcjYnR0JykuZmFkZU91dCgzMDApO1xyXG5cdCAgICBcdH1cclxuXHJcblx0ICAgIH0pO1xyXG5cclxuXHR9LCBcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7ICBcclxuXHJcblx0XHQkKCcjYnR0JykuZmFkZU91dCgzMDApO1xyXG5cdFx0YnR0LmJpbmQoKTtcclxuXHRcdGJ0dC5ldmVudExpc3RlbmVycygpOyBcclxuXHR9XHJcbn07ICIsInZhciBidXJnZXJFbGVtcyA9IHtcclxuXHJcblx0ZWxtczoge1xyXG5cdFx0YnVyZ2VyQnV0dG9uOiAkKCcjYnVyZ2VyLWJ1dHRvbicpXHJcblx0fSxcclxuXHJcblx0YnVyZ2VyRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0YnVyZ2VyRWxlbXMuZWxtcy5idXJnZXJCdXR0b24ub24oJ2NsaWNrJywgZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdCQoJyNtYWluJykudG9nZ2xlQ2xhc3MoJ292ZXJsYXknKTtcclxuXHRcdFx0JCgnLm5hdi13cmFwcGVyJykudG9nZ2xlQ2xhc3MoJ21ibC1hY3RpdmUnKTtcclxuXHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoJ2lzLWFjdGl2ZScpKSB7XHJcblx0XHRcdFx0JCgnLmdsb2JhbC1zdWInKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdFx0JCgnLmdsb2JhbC1zdWItbmF2LmlzLWFjdGl2ZScpLnNsaWRlVG9nZ2xlKCc0MDAnKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdGlmICgkKCcjYnVyZ2VyLWJ1dHRvbicpLmxlbmd0aCA+IDApIHtcclxuXHQgICAgICAgIGJ1cmdlckVsZW1zLmJ1cmdlckZ1bmN0aW9uKCk7XHJcblx0ICAgIH1cclxuXHR9LFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdGJ1cmdlckVsZW1zLmV2ZW50TGlzdGVuZXJzKCk7XHJcblx0fVxyXG59OyIsInZhciBjb250ZW50TmF2ID0ge1xyXG5cclxuXHQkd2luZG93OiAkKHdpbmRvdyksXHJcblxyXG5cdGRlc2t0b3BXaWR0aCA6IDEyODAsXHJcblxyXG5cdG1vYmlsZSA6IHtcclxuXHJcblx0XHQkdG9nZ2xlOiAkKCcuY29udGVudC1uYXYubW9iaWxlLW5hdiAubWJsLWNvbnRlbnQtbmF2JyksXHJcblx0XHRwcm94eVRvZ2dsZSA6IG51bGwsXHJcblx0XHRpc0xpc3RlbmluZzpmYWxzZSxcclxuXHJcblx0XHRpbml0IDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHR0aGlzLnByb3h5VG9nZ2xlID0gJC5wcm94eSh0aGlzLnRvZ2dsZUhhbmRsZXIsIHR
1302oaXMpO1x0XHRcdFxyXG5cdFx0fSxcclxuXHJcblx0XHRsaXN0ZW4gOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSB0cnVlO1x0XHJcblx0XHRcdFx0dGhpcy4kdG9nZ2xlLm9uKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlUb2dnbGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGNhbmNlbCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gZmFsc2U7XHRcdFxyXG5cdFx0XHRcdHRoaXMuJHRvZ2dsZS5vZmYoJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eVRvZ2dsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dG9nZ2xlSGFuZGxlciA6IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0JChlLnRhcmdldCkudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuXHRkZXNrdG9wIDoge1xyXG5cdFx0JHRvZ2dsZTogJCgnLmNvbnRlbnQtbmF2LmRlc2t0b3AtbmF2IC5kcm9wZG93bicpLFxyXG5cclxuXHRcdHByb3h5VG9nZ2xlIDogbnVsbCxcclxuXHRcdGlzTGlzdGVuaW5nOmZhbHNlLFxyXG5cclxuXHRcdGluaXQgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHRoaXMucHJveHlUb2dnbGUgPSAkLnByb3h5KHRoaXMudG9nZ2xlSGFuZGxlciwgdGhpcyk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSB0cnVlO1x0XHRcclxuXHRcdFx0XHR0aGlzLiR0b2dnbGUub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eVRvZ2dsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0Y2FuY2VsIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRpZiAodGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFx0XHJcblx0XHRcdFx0dGhpcy4kdG9nZ2xlLm9mZignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5VG9nZ2xlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0b2dnbGVIYW5kbGVyIDogZnVuY3Rpb24gKGUpIHtcclxuXHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgJGVsID0gJChlLnRhcmdldCksXHJcblx0XHRcdFx0JGRyb3AgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuZHJvcGRvd24nKSxcclxuXHRcdFx0XHRpc0FjdGl2ZSA9ICRkcm9wLmhhc0NsYXNzKCdpcy1hY3RpdmUnKTtcclxuXHRcdFx0XHRcclxuXHRcdFx0aWYgKCEkZWwuaXMoJ2EnKSl7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcclxuXHRcdFx0XHR0aGlzLiR0b2dnbGUucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cclxuXHRcdFx0XHRpZiAoIWlzQWN0aXZlKSB7XHJcblx0XHRcdFx0XHQkZHJvcC5hZGRDbGFzcygnaXMtYWN0aXZlJyk7IFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0fSxcclxuXHJcblxyXG5cdGluaXQgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHR0aGlzLmRlc2t0b3AuaW5pdCgpO1xyXG5cdFx0dGhpcy5tb2JpbGUuaW5pdCgpO1xyXG5cclxuXHRcdHRoaXMuJHdpbmRvdy5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgJC5wcm94eSh0aGlzLnJlc2l6ZSwgdGhpcykpO1xyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblxyXG5cdHJlc2l6ZSA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICh0aGlzLl9nZXRJbm5lcldpZHRoKCkgPj0gdGhpcy5kZXNrdG9wV2lkdGggKSB7XHJcblx0XHRcdHRoaXMuZGVza3RvcC5saXN0ZW4oKTtcclxuXHRcdFx0dGhpcy5tb2JpbGUuY2FuY2VsKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5tb2JpbGUubGlzdGVuKCk7XHJcblx0XHRcdHRoaXMuZGVza3RvcC5jYW5jZWwoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuICAgIF9nZXRJbm5lcldpZHRoIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsgXHJcbiAgICB9XHJcblx0XHJcbn07XHJcblxyXG5cclxuIiwiLyogZ2xvYmFscyBGb3VuZGF0aW9uOiBmYWxzZSAqL1xyXG52YXIgZm9vdGVyUG9zID0ge1xyXG5cclxuXHRlbG1zOiB7XHJcblx0XHRmb290ZXI6ICQoJ2Zvb3RlcicpLFxyXG5cdFx0Ym9keTogJCgnYm9keScpXHJcblx0fSxcclxuXHJcblx0Zm9vdGVyRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cclxuXHR9LFxyXG5cclxuXHRldmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgZm9vdGVySGVpZ2h0ID0gZm9vdGVyUG9zLmVsbXMuZm9vdGVyLmhlaWdodCgpICsgODA7XHJcblx0XHR2YXIgYm9keUhlaWdodCA9IGZvb3RlclBvcy5lbG1zLmJvZHkuaGVpZ2h0KCk7XHJcblx0XHR2YXIgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG5cdFx0XHJcblx0XHRpZiAoRm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoJ21lZGl1bScpKSB7XHJcblx0XHRcdCQoJyNtYWluJykuY3NzKCdwYWRkaW5nLWJvdHRvbScsIGZvb3RlckhlaWdodCk7XHJcblx0XHRcdGlmIChib2R5SGVpZ2h0IDwgd2luZG93SGVpZ2h0KSB7XHJcblx0XHRcdFx0JCgnYm9keScpLmFkZENsYXNzKCdmdHItZml4Jyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkgeyBcclxuXHRcdGZvb3RlclBvcy5ldmVudExpc3RlbmVycygpO1xyXG5cdH1cclxufTsiLCJ2YXIgaGVhZGVyU2Nyb2xsID0ge1xyXG5cclxuXHRlbG1zOiB7XHJcblxyXG5cdH0sXHJcblxyXG5cdGhlYWRlckZ1bmN0aW9uOiBmdW5jdGlvbigpIHtcclxuXHJcblx0fSxcclxuXHJcblx0ZXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICAvL2NhY2hlcyBhIGpRdWVyeSBvYmplY3QgY29udGFpbmluZyB0aGUgaGVhZGVyIGVsZW1lbnRcclxuXHQgICAgdmFyIGJvZHkgPSAkKCdib2R5Jyk7XHJcblx0ICAgIHZhciBoZWFkZXIgPSAkKCdoZWFkZXInKTtcclxuXHQgICAgdmFyIGhlYWRlckhlaWdodCA9IGhlYWRlci5oZWlnaHQoKTtcclxuXHQgICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpIHtcclxuXHQgICAgICAgI
1302HZhciBzY3JvbGwgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcblxyXG5cdCAgICAgICAgaWYgKHNjcm9sbCA+PSAxMDApIHtcclxuXHQgICAgICAgICAgICBib2R5LmFkZENsYXNzKCdzdGlja3ktaGVhZGVyJyk7XHJcblx0ICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2xhc3MoJ3N0aWNreS1oZWFkZXInKTtcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSk7XHJcblx0fSxcclxuXHRpbml0OiBmdW5jdGlvbigpIHsgXHJcblx0XHRoZWFkZXJTY3JvbGwuZXZlbnRMaXN0ZW5lcnMoKTtcclxuXHR9XHJcbn07IiwiLyogZ2xvYmFscyBkb1Q6IGZhbHNlICovXHJcbnZhciBoaXN0b3J5VGltZWxpbmUgPSB7XHJcblxyXG5cdHJlbmRlclRlbXBsYXRlOiBudWxsLFxyXG5cdHRlbXBsYXRlOiAne3t+IGl0IDppfX08ZGl2IGNsYXNzPVwieWVhclwiPjxkaXYgY2xhc3M9XCJtaWRsaW5lXCI+PC9kaXY+PHNwYW4gY2xhc3M9XCJ5bGFiZWxcIj57ez1pLnllYXJ9fTwvc3Bhbj57e34gaS5pdGVtcyA6aX19PGEgaHJlZj1cInt7PWkuVXJsfX1cIiBjbGFzcz1cImRheSB7ez1pLnBvc2l0aW9uT3ZlcnJpZGV9fVwiPjxkaXYgY2xhc3M9XCJ3cmFwcGVyIHt7PyAhaS5JbWFnZSB9fW5vLWltYWdle3s/fX1cIj57ez8gaS5JbWFnZSB9fTxkaXYgY2xhc3M9XCJpbWFnZSB7ez1pLkNsYXNzfX1cIj48aW1nIHNyYz1cInt7PWkuSW1hZ2V9fVwiIC8+PC9kaXY+e3s/fX08ZGl2IGNsYXNzPVwiY29weVwiPjxzcGFuIGNsYXNzPVwidGFnXCI+e3s9aS5DYXRlZ29yeX19PC9zcGFuPjxoMj57ez1pLlRpdGxlfX08L2gyPjxzcGFuIGNsYXNzPVwiZGF0ZVwiPnt7PWkuTW9tZW50LmZvcm1hdChcIk1NTSBZWVlZXCIpfX08L3NwYW4+PC9kaXY+PC9kaXY+PC9hPnt7fn19PC9kaXY+e3t+fX0nLFxyXG5cclxuICBcdHJlbmRlckRhdGE6IGZ1bmN0aW9uKHRpbWVsaW5lLCBkYXRhLCBxdWVyeUNhdGVnb3J5KSB7XHJcbiAgXHRcdGlmIChxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdHZhciByZXQgPSBbXTtcclxuXHRcdFx0JChkYXRhKS5lYWNoKGZ1bmN0aW9uKGksZCkge1xyXG5cdFx0XHRcdGlmIChkLkNhdGVnb3J5ID09PSBxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdFx0XHRyZXQucHVzaChkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRkYXRhID0gcmV0O1xyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGdyb3VwcyA9IHt9O1x0XHRcclxuXHRcdCQuZWFjaChkYXRhLCBmdW5jdGlvbihpLCBpdGVtKSB7XHJcblx0XHQgICAgaXRlbS5Nb21lbnQgPSBtb21lbnQoaXRlbS5EYXRlLCAnREQvTU0vWVlZWScsIHRydWUpO1xyXG5cdFx0ICAgIHZhciB5ZWFyID0gaXRlbS5Nb21lbnQueWVhcigpO1xyXG5cdFx0ICAgIC8vY29uc29sZS5sb2coeWVhcik7XHJcblx0XHQgICAgaWYoZ3JvdXBzW3llYXJdKSB7XHJcblx0XHQgICAgICAgIGdyb3Vwc1t5ZWFyXS5wdXNoKGl0ZW0pO1xyXG5cdFx0ICAgIH0gZWxzZSB7XHJcblx0XHQgICAgICAgIGdyb3Vwc1t5ZWFyXSA9IFtpdGVtXTtcclxuXHRcdCAgICB9XHJcblx0XHR9KTtcclxuXHJcblx0XHR2YXIgZGF0YUJ5WWVhciA9ICQubWFwKGdyb3VwcywgZnVuY3Rpb24oaXRlbXNGb3JZZWFyLCB5ZWFyKSB7XHJcblx0XHQgICAgcmV0dXJuIHtcclxuXHRcdCAgICBcdHllYXI6IHllYXIsXHJcblx0XHQgICAgXHRpdGVtczogaXRlbXNGb3JZZWFyXHJcblx0XHQgICAgfTtcclxuXHRcdH0pO1xyXG5cdFx0dmFyIGxheW91dENsYXNzID0gJ2NlbnRlci1sZWZ0JztcclxuXHRcdCQuZWFjaChncm91cHMsIGZ1bmN0aW9uKGssIHYpIHtcclxuXHRcdFx0aWYgKCQodGhpcykubGVuZ3RoIDwgMikge1xyXG5cdFx0XHRcdHZhciByZXRDbGFzcyA9IHNldENsYXNzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dlswXS5wb3NpdGlvbk92ZXJyaWRlID0gcmV0Q2xhc3M7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0ZnVuY3Rpb24gc2V0Q2xhc3MoKSB7XHRcdFx0XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAobGF5b3V0Q2xhc3MgPT09ICdjZW50ZXItbGVmdCcpIHtcclxuXHRcdFx0XHRsYXlvdXRDbGFzcyA9ICdjZW50ZXItcmlnaHQnOyBcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRsYXlvdXRDbGFzcyA9ICdjZW50ZXItbGVmdCc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGxheW91dENsYXNzO1xyXG5cdFx0XHRcclxuXHRcdH1cclxuXHRcdGRhdGFCeVllYXIuc29ydChmdW5jdGlvbihhLGIpIHtcclxuXHRcdFx0aWYgKGEueWVhciA+IGIueWVhcikge1xyXG5cdFx0XHRcdHJldHVybiAtMTtcclxuXHRcdFx0fSBlbHNlIGlmIChhLnllYXIgPCBiLnllYXIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHQgICAgXHJcblx0XHR9KTtcclxuXHRcdC8vYXBwZW5kIHRoZSBodG1sXHJcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZW5kZXJUZW1wbGF0ZShkYXRhQnlZZWFyKTtcclxuXHRcdCQoJy50aW1lbGluZScsIHRpbWVsaW5lKS5hcHBlbmQocmVzdWx0KTtcclxuXHRcdC8vZW5zdXJlIGFsbCB0aGUgaGVpZ2h0cyBvZiB0aGUgcG9kcyBtYXRjaFxyXG5cdFx0dGltZWxpbmUuaW1hZ2VzTG9hZGVkKCkuYWx3YXlzKCBmdW5jdGlvbiggaW5zdGFuY2UgKSB7XHRcdFx0XHJcblx0XHRcdHRpbWVsaW5lLmZpbmQoXCIueWVhciAuZGF5IC53cmFwcGVyXCIpLm1hdGNoSGVpZ2h0KCk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0fSxcclxuXHRidWlsZEZpbHRlcjogZnVuY3Rpb24odGltZWxpbmUsIGRhdGEpIHtcclxuXHRcdHZhciBjYXRlZ29yaWVzID0gW107XHJcblxyXG5cdFx0JC5lYWNoKGRhdGEsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xyXG5cdFx0ICAgIGlmICgkLmluQXJyYXkodmFsdWUuQ2F0ZWdvcnksIGNhdGVnb3JpZXMpPT0tMSkge1xyXG5cdFx0ICAgICAgICAvL3ZhciBpbnNlcnQgPSAnPGEgaHJlZj1cIiNcIj4nICsgdmFsdWUuQ2F0ZWdvcnkgKyAnPC9hPic7XHJcblx0XHQgICAgICAgIGNhdGVnb3JpZXMucHVzaCh2YWx1ZS
13025DYXRlZ29yeSk7XHJcblx0XHQgICAgfVxyXG5cdFx0fSk7XHJcblx0ICAgIHZhciBjTGlzdCA9ICQoJy50aW1lbGluZS1maWx0ZXInKTtcclxuXHQgICAgJC5lYWNoKGNhdGVnb3JpZXMsIGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0dmFyIGZpbHRlckJ0biA9ICQoJzxhLz4nKS50ZXh0KGNhdGVnb3JpZXNbaV0pLmF0dHIoJ2RhdGEtbmFtZScsIGNhdGVnb3JpZXNbaV0pLmF0dHIoJ2NsYXNzJywgJ2ZpbHRlci1idG4nKS5hdHRyKCdocmVmJywgJz9jYXQ9JyArIGNhdGVnb3JpZXNbaV0pLmFwcGVuZFRvKGNMaXN0KTtcclxuXHRcdFx0dmFyIGZpbHRlck9wdGlvbnMgPSAkKCc8b3B0aW9uPicpLnRleHQoY2F0ZWdvcmllc1tpXSkuYXR0cignZGF0YS1wYXRoJywgJz9jYXQ9JyArY2F0ZWdvcmllc1tpXSkuYXBwZW5kVG8oJy5tYmwtZmlsdGVyJyk7XHJcblx0XHR9KTtcclxuXHRcdCQoJy5maWx0ZXItYnRuJykuZWFjaChmdW5jdGlvbigpe1xyXG5cdFx0XHR2YXIgcGFnZVF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoJz0nKTtcclxuXHRcdFx0dmFyIHF1ZXJ5Q2F0ZWdvcnkgPSBwYWdlUXVlcnlbMV07XHJcblx0XHRcdGlmICgkKHRoaXMpLmRhdGEoJ25hbWUnKSA9PSBxdWVyeUNhdGVnb3J5KSB7XHJcblx0XHRcdFx0JCgnLmZpbHRlci1idG4nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblx0ZGlzYWJsZTogZnVuY3Rpb24odGltZWxpbmUpXHJcblx0e1xyXG5cdFx0Ly8kKCcubG9hZC1tb3JlJywgdGltZWxpbmUpLmhpZGUoKTtcclxuXHR9LFxyXG5cdGZpbHRlckNhdGVnb3J5OiBmdW5jdGlvbihjYXRhZ29yeU5hbWUpIHtcclxuXHJcblx0fSxcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7XHJcblx0XHR0aGlzLmluaXRUZW1wbGF0ZXMoKTtcclxuXHRcdHRoaXMuaW5pdEV2ZW50cygpO1xyXG5cdH0sXHJcblxyXG5cdGluaXRUZW1wbGF0ZXM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5yZW5kZXJUZW1wbGF0ZSA9IGRvVC50ZW1wbGF0ZSh0aGlzLnRlbXBsYXRlKTtcclxuXHR9LFxyXG5cclxuXHRpbml0RXZlbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBwYWdlUXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgnPScpO1xyXG5cclxuXHRcdHZhciBxdWVyeUNhdGVnb3J5ID0gcGFnZVF1ZXJ5WzFdO1xyXG5cdFx0Ly8gaWYoZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLmxlbmd0aCkge1xyXG5cdFx0Ly8gXHRpZiAocXVlcnlDYXRlZ29yeSAhPT0gJycpIHtcclxuXHRcdC8vIFx0XHQkKCcudGltZWxpbmUnKS5yZW1vdmVDbGFzcygnc2hvdy1hbGwnKTtcclxuXHRcdC8vIFx0fVxyXG5cdFx0Ly8gfSBlbHNlIHtcclxuXHRcdC8vICAgICAvLyBubyBxdWVyeSBzdHJpbmcgZXhpc3RzXHJcblx0XHQvLyB9XHJcblxyXG5cclxuXHRcdCQoJ1tkYXRhLWhpc3RvcnldJykuZWFjaChmdW5jdGlvbihpLCB0aW1lbGluZSkge1xyXG5cclxuXHRcdFx0dmFyIHRpbWVsaW5lID0gJCh0aW1lbGluZSk7XHJcblxyXG5cdFx0XHR2YXIgbG9hZFVybCA9IHRpbWVsaW5lLmRhdGEoJ3VybCcpO1xyXG5cdFx0XHQkLmFqYXgoe1xyXG5cdFx0XHRcdHVybDogbG9hZFVybCxcclxuXHRcdFx0XHR0eXBlOiAnR0VUJyxcclxuXHRcdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRcdHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRcdFx0XHRoaXN0b3J5VGltZWxpbmUucmVuZGVyRGF0YSh0aW1lbGluZSwgZGF0YSwgcXVlcnlDYXRlZ29yeSk7XHJcblx0XHRcdFx0XHRoaXN0b3J5VGltZWxpbmUuYnVpbGRGaWx0ZXIodGltZWxpbmUsIGRhdGEpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdDb3VsZCBub3QgbG9hZCBjb250ZW50LicpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdC8vaGFkIHRvIGFkZCBqcyBmdW5jdGlvbiBmb3IgYW5jaG9yIG9uY2xpY2sgLSBmaXhlcyBhIGJ1ZyBpbiBzbWFsbCBzY3JlZW5cclxuXHRcdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdhLmZpbHRlci1idG4nICwgZnVuY3Rpb24oZSkge1xyXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgJCh0aGlzKS5hdHRyKCdocmVmJyk7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0pO1xyXG5cdCAgICAvL01vYmlsZSBkcm9wIGRvd24gdmVyc2lvblxyXG5cdCAgICAkKCcubWJsLWZpbHRlcicpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcclxuXHQgICAgICAgIHZhciBkYXRhSUQgPSAkKHRoaXMpLmZpbmQoJzpzZWxlY3RlZCcpLnZhbCgpO1xyXG5cdCAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICQodGhpcykuZmluZCgnOnNlbGVjdGVkJykuYXR0cignZGF0YS1wYXRoJyk7XHJcblx0ICAgIH0pO1xyXG5cdH1cclxufTtcclxuIiwidmFyIGdtYXAgPSB7ICBcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIC8vIGhhbmRsZXMgZ29vZ2xlIG1hcHNcclxuICAgICAgaWYgKCQoJy5nLW1hcCcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB2Y
1302XIgcGluU21hbGwgPSAnL2Fzc2V0cy9pbWcvaWNvbnMvaWNvbi1waW4ucG5nJztcclxuICAgICAgICAkKCcuZy1tYXAnKS5lYWNoKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICB2YXIgbXlDZW50ZXI9bmV3IGdvb2dsZS5tYXBzLkxhdExuZygkKHRoaXMpLmRhdGEoJ2xhdCcpLCAkKHRoaXMpLmRhdGEoJ2xvbicpKTtcclxuICAgICAgICAgIHZhciBsb2NhdGlvbkVsZW1lbnQgPSAkKHRoaXMpWzBdO1xyXG4gICAgICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICAgICAgdmFyIG1hcFByb3AgPSB7XHJcbiAgICAgICAgICAgICAgY2VudGVyOm15Q2VudGVyLFxyXG4gICAgICAgICAgICAgIHpvb206MTcsXHJcbiAgICAgICAgICAgICAgbWFwVHlwZUlkOmdvb2dsZS5tYXBzLk1hcFR5cGVJZC5ST0FETUFQXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGxvY2F0aW9uRWxlbWVudCxtYXBQcm9wKTtcclxuICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xyXG4gICAgICAgICAgICAgIGljb246IHBpblNtYWxsLFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOm15Q2VudGVyXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYXJrZXIuc2V0TWFwKG1hcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGREb21MaXN0ZW5lcih3aW5kb3csICdsb2FkJywgaW5pdGlhbGl6ZSk7XHJcbiAgICAgICAgfSk7IFxyXG4gICAgICB9IFxyXG5cdH1cclxuXHJcbn07IiwidmFyIG1hdGNoSGVpZ2h0RWxtcyA9IHtcclxuXHJcblx0ZWxtczoge1xyXG5cdFx0cHJvbW9Cb3g6ICQoJy5wcm9tbycpXHJcblx0fSxcclxuXHJcblx0bWF0Y2hIZWlnaHRGdW5jdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHQkKCcucHJvbW8nKS5tYXRjaEhlaWdodCgpO1xyXG5cdH0sXHJcblxyXG5cdGV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdGlmICgkKCcucHJvbW8nKS5sZW5ndGggPiAwKSB7XHJcblx0ICAgICAgICBtYXRjaEhlaWdodEVsbXMubWF0Y2hIZWlnaHRGdW5jdGlvbigpO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0bWF0Y2hIZWlnaHRFbG1zLmV2ZW50TGlzdGVuZXJzKCk7XHJcblx0XHQvLyBmaWx0ZXJzIG1pbiBoZWlnaHRcclxuXHRcdGlmICgkKCcuZmlsdGVyLXdyYXBwZXInKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHZhciBncm91cE1pbkhlaWdodCA9ICQoJy5ncm91cC1zZWxlY3QnKS5oZWlnaHQoKTtcclxuXHRcdFx0JCgnLmdyb3VwJykuY3NzKCdtaW4taGVpZ2h0JywgZ3JvdXBNaW5IZWlnaHQpO1xyXG5cdFx0fVxyXG5cdH1cclxufTsiLCJ2YXIgbW9iaWxlTmF2ID0ge1xyXG5cdCR3aW5kb3c6ICQod2luZG93KSxcclxuXHQkbWFpbiA6ICQoJyNtYWluJyksXHJcblx0JGNvbHVtbnMgOiQoJ25hdiAuZ2xvYmFsLXN1YiAuY29sdW1ucycpLFxyXG5cclxuXHQkYnVyZ2VyQnRuIDogJCgnI2J1cmdlci1idXR0b24nKSxcclxuXHQkbWJsQmFjazogJCgnbmF2IC5tYmwtYmFjaycpLFxyXG5cdCRnbG9iYWxTdWIgOiAkKCduYXYgLmdsb2JhbC1zdWInKSxcclxuXHQkbmF2V3JhcHBlciA6ICQoJy5uYXYtd3JhcHBlcicpLFxyXG5cclxuXHQkYnRucyA6ICQoJ25hdiAuZ2xvYmFsID4gbGkgPiBhLCAudXRpbCA+IGxpID4gYScpLFx0XHJcblx0JGJ0bnNFeHBhbmQgOiAkKCduYXYgLmdsb2JhbC1zdWIgLnN1Yi10aXRsZScpLFxyXG5cdCRidG5zU3ViRXhwYW5kIDogJCgnbmF2IC5nbG9iYWwtc3ViLW5hdiAuc3ViLW5hdiBhJyksXHJcblx0JHN1YkV4cGFuZDogJCgnbmF2IC5nbG9iYWwtc3ViLW5hdiAuc3ViLW5hdicgKSxcclxuXHQkc2VhcmNoRmllbGQ6ICQoJ25hdiAuZ2xvYmFsLXNlYXJjaCAjZ2JsLXNyY2gsIG5hdiAuZ2xvYmFsLXNlYXJjaCAjZ2JsLXNyY2gtc2JtdCcpLFxyXG5cclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdHByb3h5Q2xpY2sgOiBudWxsLFxyXG5cdHByb3h5VG9nZ2xlRXhwYW5kIDogbnVsbCxcclxuXHRwcm94eUNsb3NlIDogbnVsbCxcclxuXHRwcm94eUJhY2sgOiBudWxsLFxyXG5cdHByb3h5U3ViVG9nZ2xlRXhwYW5kOm51bGwsXHJcblx0cHJveHlGb2N1cyA6IG51bGwsXHJcblxyXG5cdGFjdGl2ZUNsYXNzOidpcy1hY3RpdmUnLFxyXG5cclxuXHRpc0xpc3RlbmluZzpmYWxzZSxcclxuXHRcclxuXHRpbml0OiBmdW5jdGlvbigpIHsgXHJcblx0XHR0aGlzLnByb3h5VG9nZ2xlRXhwYW5kID0gJC5wcm94eSh0aGlzLnRvZ2dsZUV4cGFuZCwgdGhpcyk7XHJcblx0XHR0aGlzLnByb3h5Q2xpY2sgPSAkLnByb3h5KHRoaXMuY2xpY2ssIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eUNsb3NlID0gJC5wcm94eSh0aGlzLmNsb3NlLCB0aGlzKTtcclxuXHRcdHRoaXMucHJveHlCYWNrID0gJC5wcm94eSh0aGlzLmJhY2ssIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eVN1YlRvZ2dsZUV4cGFuZCA9ICQucHJveHkodGhpcy5zdWJUb2dnbGVFeHBhbmQsIHRoaXMpO1xyXG5cdFx0dGhpcy5wcm94eUZvY3VzID0gJC5wcm94eSh0aGlzLmZvY3VzLCB0aGlzKTtcclxuXHJcblx0XHR0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsICQucHJveHkodGhpcy5yZXNpemUsIHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblxyXG5cdGZvY3VzIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdC8vIHN0b3AgdGFiIGZvY3VzIG91dHNpZGUgb2YgbmF2aWdhdGlvbiBiZWluZyBvcGVuXHJcblx0XHRpZiAoZS5rZXlDb2RlID09PSA5ICYmICF0aGlzLiRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpICB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZXNpemUgOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRpZiAodGhpcy5fZ2V0SW5uZXJXaWR0aCgpIDwgdGhpcy5kZXNrdG9wV2lkdGggKSB7XHJcblx0XHRcdHRoaXMubGlzdGVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIFxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLmNhbmNlbCgpO1xyXG5cdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0bGlzdGVuIDogZnVuY3Rpb24gKCkge1x0XHJcblx0XHRpZiAoIXRoaXMuaXNMaXN0ZW5pbmcpIHtcdFx0XHRcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IHRydWU7XHJcblx0XHRcdHRoaXMuJGJ0bnMub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eUNsaWNrKTtcclxuXHRcdFx0dGhpcy4kYn
1302Ruc0V4cGFuZC5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5VG9nZ2xlRXhwYW5kKTtcdFx0XHRcclxuXHRcdFx0dGhpcy4kbWJsQmFjay5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5QmFjayk7XHJcblx0XHRcdHRoaXMuJG1haW4ub24oJ2NsaWNrIHRvdWNoJywgdGhpcy5wcm94eUNsb3NlKTtcclxuXHRcdFx0dGhpcy4kYnRuc1N1YkV4cGFuZC5vbignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5U3ViVG9nZ2xlRXhwYW5kKTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdrZXlkb3duJywgdGhpcy5wcm94eUZvY3VzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYW5jZWwgOiBmdW5jdGlvbiAoKSB7IFxyXG5cdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IGZhbHNlO1x0XHJcblx0XHRcdHRoaXMuJGJ0bnMub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlDbGljayk7XHJcblx0XHRcdHRoaXMuJGJ0bnNFeHBhbmQub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlUb2dnbGVFeHBhbmQpO1x0XHRcdFxyXG5cdFx0XHR0aGlzLiRtYmxCYWNrLm9mZignY2xpY2sgdG91Y2gnLCB0aGlzLnByb3h5QmFjayk7XHJcblx0XHRcdHRoaXMuJG1haW4ub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlDbG9zZSk7XHJcblx0XHRcdHRoaXMuJGJ0bnNTdWJFeHBhbmQub2ZmKCdjbGljayB0b3VjaCcsIHRoaXMucHJveHlTdWJUb2dnbGVFeHBhbmQpO1xyXG5cdFx0XHQvL3RoaXMuJHNlYXJjaEZpZWxkLm9mZignZm9jdXMnLCB0aGlzLnByb3h5Rm9jdXMpO1xyXG5cdFx0XHR0aGlzLiR3aW5kb3cub2ZmKCdrZXlkb3duJywgdGhpcy5wcm94eUZvY3VzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRiYWNrIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcdFxyXG5cdFx0dGhpcy4kZ2xvYmFsU3ViLnJlbW92ZUNsYXNzKHRoaXMuYWN0aXZlQ2xhc3MpO1xyXG5cdFx0dGhpcy4kY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHR9LFxyXG5cclxuXHRjbG9zZSA6IGZ1bmN0aW9uIChlKSB7IFxyXG5cdFx0aWYgKGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLiRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XHJcbiAgICBcdHRoaXMuJGJ1cmdlckJ0bi5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuICAgIFx0dGhpcy4kbmF2V3JhcHBlci5yZW1vdmVDbGFzcygnbWJsLWFjdGl2ZScpO1xyXG5cdCAgICB0aGlzLiRtYWluLnJlbW92ZUNsYXNzKCdvdmVybGF5Jyk7XHJcblx0ICAgIHRoaXMuJGNvbHVtbnMucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHR0aGlzLiRzdWJFeHBhbmQucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0fSxcclxuXHJcblx0Y2xpY2sgOiBmdW5jdGlvbiAoZSkge1x0XHJcblx0XHRcdFxyXG5cdFx0dmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KSwgXHJcblx0XHQkcGFyZW50ID0gJHRhcmdldC5jbG9zZXN0KCdsaScpLFxyXG5cdFx0JGVsID0gJHRhcmdldC5uZXh0KCcuZ2xvYmFsLXN1YicpO1xyXG5cdFx0aWYgKCEkZWwuaGFzQ2xhc3ModGhpcy5hY3RpdmVDbGFzcykgKSB7XHJcblx0XHRcdCRlbC5hZGRDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdH1cdFx0XHRcdFxyXG5cdFx0aWYgKCEkcGFyZW50Lmhhc0NsYXNzKCdleGMnKSl7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZUV4cGFuZCA6IGZ1bmN0aW9uIChlKSB7XHRcclxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcdFx0XHJcblx0XHR2YXIgJHRhcmdldCA9ICQoZS50YXJnZXQpLFx0XHRcdFxyXG5cdFx0XHQkcGFyZW50ID0gJHRhcmdldC5jbG9zZXN0KCcuY29sdW1ucycpLFxyXG5cdFx0XHRpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHQvLyBjbG9zZSBhbnkgYWN0aXZlIHN1YiBtZW51c1xyXG5cdFx0dGhpcy4kY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdC8vIG9wZW4gXHJcblx0XHRpZiAoIWlzQWN0aXZlKSB7XHJcblx0XHRcdCRwYXJlbnQuYWRkQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHRcdFx0XHRcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRzdWJUb2dnbGVFeHBhbmQgOiBmdW5jdGlvbiAoZSkge1xyXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1x0XHRcclxuXHRcdHZhciAkdGFyZ2V0ID0gJChlLnRhcmdldCksXHJcblx0XHRcdCRwYXJlbnQgPSAkdGFyZ2V0LmNsb3Nlc3QoJy5zdWItbmF2JyksXHJcblx0XHRcdGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTtcclxuXHRcdC8vIGNsb3NlIGFueSBhY3RpdmUgc3ViIG1lbnVzXHJcblx0XHR0aGlzLiRzdWJFeHBhbmQucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7XHJcblx0XHQvLyBvcGVuIFxyXG5cdFx0aWYgKCFpc0FjdGl2ZSkge1xyXG5cdFx0XHQkcGFyZW50LmFkZENsYXNzKHRoaXMuYWN0aXZlQ2xhc3MpO1x0XHRcdFx0XHJcblx0XHR9XHJcblxyXG5cdH0sXHJcblxyXG4gICAgX2dldElubmVyV2lkdGggOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOyBcclxuICAgIH1cclxufTsiLCJ2YXIgbmF2T3ZlcmxheSA9IHtcclxuXHJcblx0JHdpbmRvdzogJCh3aW5kb3cpLFxyXG5cdCRib2R5IDogJCgnYm9keScpLFxyXG5cdCRtYWluIDogJCgnI21haW4nKSxcclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdGNsYXNzZXMgOiAnLmluLWxhcmdlIC5nbG9iYWwgPiBsaTpub3QoLmV4YyksIC5pbi1sYXJnZSAudXRpbCA+IGxpOm5vdCguZXhjKScsXHJcblx0JGVsIDogJCgnLmluLWxhcmdlIC5nbG9iYWwgPiBsaTpub3QoLmV4YyksIC5pbi1sYXJnZSAudXRpbCA+IGxpOm5vdCguZXhjKScpLFxyXG5cdG92ZXJsYXlDbGFzc25hbWU6J292ZXJsYXknLFxyXG5cdHByb3h5VG9nZ2xlIDogbnVsbCxcdFxyXG5cdHJlc2l6ZVByb3h5Om51bGwsXHJcblx0aXNMaXN0ZW5pbmc6ZmFsc2UsXHJcblx0XHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGhpcy5wcm94eVRvZ2dsZSA9ICQucHJveHkodGhpcy50b2dnbGVPdmVybGF5LCB0aGlzKTtcclxuXHRcdHRoaXMucmVzaXplUHJveHkgPSAkLnByb3h5KHRoaXMucmVzaXplLCB0aGlzKTtcclxuXHRcdHRoaXMuJHdpbmRvdy5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5yZXNpemVQcm94eSk
13027XHJcblxyXG5cdFx0dGhpcy5yZXNpemUoKTsgXHJcblx0fSxcclxuXHJcblx0cmVzaXplIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0aWYgKHRoaXMuX2dldElubmVyV2lkdGgoKSA+PSB0aGlzLmRlc2t0b3BXaWR0aCApIHtcclxuXHRcdFx0dGhpcy5saXN0ZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNhbmNlbCgpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcdFx0XHJcblx0XHRcdHRoaXMuJGVsLm9uKCdtb3VzZW92ZXInLCB0aGlzLnByb3h5VG9nZ2xlICk7XHJcblx0XHRcdHRoaXMuJGVsLm9uKCdtb3VzZWxlYXZlJywgdGhpcy5wcm94eVRvZ2dsZSApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGNhbmNlbCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICh0aGlzLmlzTGlzdGVuaW5nKSB7XHJcblx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFxyXG5cdFx0XHR0aGlzLiRlbC5vZmYoJ21vdXNlb3ZlcicsIHRoaXMucHJveHlUb2dnbGUgKTtcclxuXHRcdFx0dGhpcy4kZWwub2ZmKCdtb3VzZWxlYXZlJywgdGhpcy5wcm94eVRvZ2dsZSApO1xyXG5cdFx0XHR0aGlzLiRtYWluLnJlbW92ZUNsYXNzKHRoaXMub3ZlcmxheUNsYXNzbmFtZSk7XHRcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHR0b2dnbGVPdmVybGF5IDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmIChlLnR5cGUgPT0gJ21vdXNlb3ZlcicpIHtcclxuXHRcdFx0dGhpcy4kbWFpbi5hZGRDbGFzcyh0aGlzLm92ZXJsYXlDbGFzc25hbWUpO1x0XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy4kbWFpbi5yZW1vdmVDbGFzcyh0aGlzLm92ZXJsYXlDbGFzc25hbWUpO1x0XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblxyXG4gICAgX2dldElubmVyV2lkdGggOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOyBcclxuICAgIH0sXHJcblxyXG59OyIsInZhciBzb2NpYWxGZWVkID0geyAgXHJcblxyXG5cdGluaXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICQoJy5zb2NpYWwtZmVlZC1jb250YWluZXInKS5zb2NpYWxmZWVkKHtcclxuICAgICAgICAgICAgLy8gRkFDRUJPT0tcclxuICAgICAgICAgICAgLy8gZmFjZWJvb2s6e1xyXG4gICAgICAgICAgICAvLyAgICAgYWNjb3VudHM6IFsnQGphbWVzLmJ1cm5hZ2UuMSddLCAgLy9BcnJheTogU3BlY2lmeSBhIGxpc3Qgb2YgYWNjb3VudHMgZnJvbSB3aGljaCB0byBwdWxsIHdhbGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgIGxpbWl0OiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgIGFjY2Vzc190b2tlbjogJzE1MTQyNzg3ODU3NjY0NnwzYjlhZGRmZjY4ZDMxYWRiY2U4ZGNlMDAxNTEyYTAyNCcgIC8vU3RyaW5nOiBcIkFQUF9JRHxBUFBfU0VDUkVUXCJcclxuICAgICAgICAgICAgLy8gfSxcclxuXHJcbiAgICAgICAgICAgIC8vIFRXSVRURVJcclxuICAgICAgICAgICAgdHdpdHRlcjp7XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50czogWydAV2VzZmFybWVyc0FydHMnLCAnQFdlc2Zhcm1lcnMnXSwgICAgICAgICAgICAgICAgICAgICAgLy9BcnJheTogU3BlY2lmeSBhIGxpc3Qgb2YgYWNjb3VudHMgZnJvbSB3aGljaCB0byBwdWxsIHR3ZWV0c1xyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgdHdlZXRzIHRvIGxvYWRcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVyX3NlY3JldDogJ2lUemMyMzRER0NOcHJ3WGtEa1MweFFjYzluR2tBQlRDbFFHT1o0ZXI5WTdXa2FNSHVyJywvL1N0cmluZzogY29uc3VtZXIgc2VjcmV0IGtleS4gbWFrZSBzdXJlIHRvIGhhdmUgeW91ciBhcHAgcmVhZC1vbmx5XHJcbiAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gVktcclxuICAgICAgICAgICAgLy8gdms6e1xyXG4gICAgICAgICAgICAvLyAgICAgYWNjb3VudHM6IFsnQDEyNTkzNjUyMycsJyN0ZXNsYW1vdG9ycyddLCAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgIGxpbWl0OiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgIHNvdXJjZTogJ2FsbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IFZLIEFQSSBwb3N0IGZpbHRlci4gUG9zc2libGUgdmFsdWVzOiBcIk93bmVyXCIsXCJPdGhlcnNcIixcImFsbFwiLFwic3VnZ2VzdHNcIlxyXG4gICAgICAgICAgICAvLyB9LFxyXG5cclxuICAgICAgICAgICAgLy8gR09PR0xFUExVU1xyXG4gICAgICAgICAgICAvLyBnb29nbGU6e1xyXG4gICAgICAgICAgICAvLyAgICAgIGFjY291bnRzOiBbJyN0ZXNsYW1vdG9ycyddLCAgICAgICAgICAgICAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgLy8gICAgICBsaW1pdDogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHBvc3RzIHRvIGxvYWRcclxuICAgICAgICAgICAgLy8gICAgICBhY2Nlc3NfdG9rZW46ICdZT1VSX0dPT0dMRV9QTFVTX0FDQ0VTU19UT0tFTicvL1N0cmluZzogRysgYWNjZXNzIHRva2VuXHJcbiAgICAgICAgICAgIC8vICB9LFxyXG5cclxuICAgICAgICAgICAgLy8gSU5TVEFHUkFNXHJcbiAgICAgICAgICAgIGluc3RhZ3JhbTp7XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50czogWydAd2VzZmFybWVyc2FydHMnXSwgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2h
1302pY2ggdG8gcHVsbCBwb3N0c1xyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkOiAnYTc0MTQ2Yzc4OGZiNDcyOWE1OTYxZGZhNjNlZDk2MjgnLCAgICAgICAvL1N0cmluZzogSW5zdGFncmFtIGNsaWVudCBpZCAob3B0aW9uIGlmIHVzaW5nIGFjY2VzcyB0b2tlbilcclxuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogJzI5ODA5MDMwOTcuMTY3N2VkMC42NGYzZWE0OTI0MzM0YThhYTNiMjA4YzdhNTA3YzM2NicgLy9TdHJpbmc6IEluc3RhZ3JhbSBhY2Nlc3MgdG9rZW5cclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIFBJTlRFUkVTVFxyXG5cclxuICAgICAgICAgICAgcGludGVyZXN0OntcclxuICAgICAgICAgICAgICAgIGFjY291bnRzOiBbJ0BtZSddLCAgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2hpY2ggdG8gcHVsbCBwb3N0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0BtZSB0byBwdWxsIHlvdXIgcGluc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0B1c2VyL2JvYXJkIHRvIHB1bGwgcGlucyBmcm9tIGEgdXNlciBib2FyZFxyXG4gICAgICAgICAgICAgICAgbGltaXQ6IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiAnQVZRTVladTBsU3ZpUEVTVzM2NnhlUnYyaXAzeEZEWXFERTRtcUNwQzVKVTZNdUF2NXdBQUFBQScgLy9TdHJpbmc6IFBpbnRlcmVzdCBjbGllbnQgaWRcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vUlNTXHJcbiAgICAgICAgICAgIHJzczp7XHJcbiAgICAgICAgICAgICAgICB1cmxzOiBbJ2h0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tL2ZlZWQvJ10sIC8vQXJyYXk6IFNwZWNpZml5IGEgbGlzdCBvZiByc3MgZmVlZCBmcm9tIHdoaWNoIHRvIHB1bGwgcG9zdHNcclxuICAgICAgICAgICAgICAgIGxpbWl0OiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVnZXI6IG1heCBudW1iZXIgb2YgcG9zdHMgdG8gbG9hZCBmb3IgZWFjaCB1cmxcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIC8vIEdFTkVSQUwgU0VUVElOR1NcclxuICAgICAgICAgICAgbGVuZ3RoOjQwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBGb3IgcG9zdHMgd2l0aCB0ZXh0IGxvbmdlciB0aGFuIHRoaXMgbGVuZ3RoLCBzaG93IGFuIGVsbGlwc2lzLlxyXG4gICAgICAgICAgICBzaG93X21lZGlhOnRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Jvb2xlYW46IGlmIGZhbHNlLCBkb2Vzbid0IGRpc3BsYXkgYW55IHBvc3QgaW1hZ2VzXHJcbiAgICAgICAgICAgIG1lZGlhX21pbl93aWR0aDogMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogT25seSBnZXQgcG9zdHMgd2l0aCBpbWFnZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZVxyXG4gICAgICAgICAgICAvL3VwZGF0ZV9wZXJpb2Q6IDUwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHNvY2lhbC1mZWVkIHdpbGwgYXR0ZW1wdCB0byBsb2FkIG5ldyBwb3N0cy5cclxuICAgICAgICAgICAgdGVtcGxhdGU6IFwidHdlZXQuaHRtbFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRmlsZW5hbWUgdXNlZCB0byBnZXQgdGhlIHBvc3QgdGVtcGxhdGUuXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2h0bWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBIVE1MIHVzZWQgZm9yIGVhY2ggcG9zdC4gVGhpcyBvdmVycmlkZXMgdGhlICd0ZW1wbGF0ZScgZmlsZW5hbWUgb3B0aW9uXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic29jaWFsLWZlZWQtZWxlbWVudCB7ez8gIWl0Lm1vZGVyYXRpb25fcGFzc2VkfX1oaWRkZW57ez99fVwiIGR0LWNyZWF0ZT1cInt7PWl0LmR0X2NyZWF0ZX19XCIgc29jaWFsLWZlZWQtaWQgPSBcInt7PWl0LmlkfX1cIj4gXFxcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwdWxsLWxlZnRcIiBocmVmPVwie3s9aXQuYXV0aG9yX2xpbmt9fVwiIHRhcmdldD1cIl9ibGFua1wiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibWVkaWEtb2JqZWN0XCIgc3JjPVwie3s9aXQuYXV0aG9yX3BpY3R1cmV9fVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEte3s9aXQuc29jaWFsX25ldHdvcmt9fVwiPjwvaT4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXV0aG9yLXRpdGxlXCI+e3s9aXQuYXV0aG9yX25hbWV9fTwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXV0ZWQgcHVsbC1yaWdodFwiPiB7ez1pdC50aW1lX2Fnb319PC9zcGFuPiAgIFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlclwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzb2NpYWwtZmVlZC10ZXh0XCI+e3s9aXQudGV4dH19PC9wPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICAgICAge3s9aXQuYXR0YWNobWVudH19IFxcXHJcbiAgICAgICAgICAgIDwvZGl2PicsXHJcblxyXG5cclxuICAgICAgICAgICAgLy9kYXRlX2Zvcm1hdDogXCJMTExcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgYXR0cmlidXRlIChzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZGlzcGxheWluZy9mb3JtYXQvKVxyXG4gICAgICAgICAgICBtb2RlcmF0aW9uOiBmdW5jdGlvbihjb250ZW50KSB7ICAgICAgICAgICAgICAgICAvL0Z1bmN0aW9uOiBpZiByZXR1cm5zIGZhbHNlLCB0ZW1wbGF0ZSB3aWxsIGhhdmUgY2xhc3MgaGlkZGVuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIChjb250ZW50LnRleHQpID8gY29udGVudC50ZXh0LmluZGV4T2YoJ2Z1Y2snKSA9PSAtMSA6IHRydWU7XHJcbiAgICAgICAgICAgI
1302H0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBldm9rZWQgd2hlbiBhbGwgdGhlIHBvc3RzIGFyZSBjb2xsZWN0ZWQgYW5kIGRpc3BsYXllZFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBbGwgcG9zdHMgY29sbGVjdGVkIVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUaGUgLmVhY2goKSBtZXRob2QgaXMgdW5uZWNlc3NhcnkgaGVyZTpcclxuICAgICAgICAkKCBcIi50d2l0dGVyLWZlZWRcIiApLmVhY2goZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgICAgICB2YXIgdHd0SGFuZGxlID0gJCh0aGlzKS5kYXRhKFwiaGFuZGxlXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2gyJykudGV4dCh0d3RIYW5kbGUuc3Vic3RyaW5nKDEpKTsgLy8gcmVtb3ZlIGZpcnN0IGNoYXIgKHJlcGxhY2VkIGluIGNzcylcclxuICAgICAgICAgICAgJCh0aGlzKS5zb2NpYWxmZWVkKHtcclxuICAgICAgICAgICAgICAgIC8vIFRXSVRURVJcclxuICAgICAgICAgICAgICAgIHR3aXR0ZXI6e1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRzOiBbIHR3dEhhbmRsZSBdLCBcclxuICAgICAgICAgICAgICAgICAgICAvL2FjY291bnRzOiBxdWVyeVRhZ3MsICAgICAgICAgICAgICAgICAgICAgIC8vQXJyYXk6IFNwZWNpZnkgYSBsaXN0IG9mIGFjY291bnRzIGZyb20gd2hpY2ggdG8gcHVsbCB0d2VldHNcclxuICAgICAgICAgICAgICAgICAgICBsaW1pdDogNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogbWF4IG51bWJlciBvZiB0d2VldHMgdG8gbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuICAgICAgICAgICAgICAgICAgICBjb25zdW1lcl9zZWNyZXQ6ICdpVHpjMjM0REdDTnByd1hrRGtTMHhRY2M5bkdrQUJUQ2xRR09aNGVyOVk3V2thTUh1cicsLy9TdHJpbmc6IGNvbnN1bWVyIHNlY3JldCBrZXkuIG1ha2Ugc3VyZSB0byBoYXZlIHlvdXIgYXBwIHJlYWQtb25seVxyXG4gICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gR0VORVJBTCBTRVRUSU5HU1xyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOjQwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBGb3IgcG9zdHMgd2l0aCB0ZXh0IGxvbmdlciB0aGFuIHRoaXMgbGVuZ3RoLCBzaG93IGFuIGVsbGlwc2lzLlxyXG4gICAgICAgICAgICAgICAgc2hvd19tZWRpYTp0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb29sZWFuOiBpZiBmYWxzZSwgZG9lc24ndCBkaXNwbGF5IGFueSBwb3N0IGltYWdlc1xyXG4gICAgICAgICAgICAgICAgbWVkaWFfbWluX3dpZHRoOiAzMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBPbmx5IGdldCBwb3N0cyB3aXRoIGltYWdlcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvL3VwZGF0ZV9wZXJpb2Q6IDUwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHNvY2lhbC1mZWVkIHdpbGwgYXR0ZW1wdCB0byBsb2FkIG5ldyBwb3N0cy5cclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBcInR3ZWV0Lmh0bWxcIiwgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IEZpbGVuYW1lIHVzZWQgdG8gZ2V0IHRoZSBwb3N0IHRlbXBsYXRlLlxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaHRtbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmc6IEhUTUwgdXNlZCBmb3IgZWFjaCBwb3N0LiBUaGlzIG92ZXJyaWRlcyB0aGUgJ3RlbXBsYXRlJyBmaWxlbmFtZSBvcHRpb24gXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInR3aXR0ZXItZmVlZC1lbGVtZW50IHt7PyAhaXQubW9kZXJhdGlvbl9wYXNzZWR9fWhpZGRlbnt7P319XCIgZHQtY3JlYXRlPVwie3s9aXQuZHRfY3JlYXRlfX1cIiBzb2NpYWwtZmVlZC1pZCA9IFwie3s9aXQuaWR9fVwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7ez1pdC5saW5rfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1ib2R5XCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkYXRlLXRpbWVcIj5Qb3N0IHt7PWl0LnRpbWVfYWdvfX08L3A+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd3JhcHBlclwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNvY2lhbC1mZWVkLXRleHRcIj57ez1pdC50ZXh0fX08L3A+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+JyxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RhdGVfZm9ybWF0OiBcIkxMTFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBEaXNwbGF5IGZvcm1hdCBvZiB0aGUgZGF0ZSBhdHRyaWJ1dGUgKHNlZSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9kaXNwbGF5aW5nL2Zvcm1hdC8pXHJcbiAgICAgICAgICAgICAgICBtb2RlcmF0aW9uOiBmdW5jdGlvbihjb250ZW50KSB7ICAgICAgICAgICAgICAgICAvL0Z1bmN0aW9uOiBpZiByZXR1cm5zIGZhbHNlLCB0ZW1wbGF0ZSB3aWxsIGhhdmUgY2xhc3MgaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoY29udGVudC50ZXh0KSA/IGNvbnRlbnQudGV4dC5pbmRleE9mKCdmdWNrJykgPT0gLTEgOiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IFRoaXMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBldm9rZWQgd2hlbiBhbGwgdGhlIHBvc3RzIGFyZSBjb2xsZWN0ZWQgYW5kIGRpc3BsYXllZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWxsIHBvc3RzIGNvbGxlY3RlZCFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
1302H0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHR9XHJcbn07IiwidmFyIHN0aWNreUZvb3RlciA9IHtcclxuXHQkd2luZG93OiAkKHdpbmRvdyksXHJcblx0JGJvZHkgOiAkKCdib2R5JyksXHJcblx0JGhlYWRlciA6ICQoJ2hlYWRlcicpLFxyXG5cdCRtYWluIDogJCgnI21haW4nKSxcclxuXHQkd3JhcHBlciA6ICQoJyN3cmFwcGVyJyksXHJcblx0JGZvb3RlciA6JCgnZm9vdGVyJyksXHJcblxyXG5cdGRlc2t0b3BXaWR0aCA6IDEyODAsXHJcblx0cHJveHlSZXNpemUgOiBudWxsLFxyXG5cclxuXHRhY3RpdmVDbGFzczonaXMtYWN0aXZlJyxcclxuXHJcblx0aXNMaXN0ZW5pbmc6ZmFsc2UsXHJcblx0XHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGhpcy5wcm94eVJlc2l6ZSA9ICQucHJveHkodGhpcy5yZXNpemUsIHRoaXMpO1xyXG5cdFx0dGhpcy5saXN0ZW4oKTtcdFx0XHJcblx0XHR0aGlzLnJlc2l6ZSgpOyBcclxuXHR9LFxyXG5cclxuXHJcblx0cmVzaXplIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIG5IID0gdGhpcy5fZ2V0SW5uZXJIZWlnaHQoKSAtIHRoaXMuJGZvb3Rlci5vdXRlckhlaWdodCgpLFxyXG5cdFx0XHRjSCA9IHRoaXMuJGhlYWRlci5vdXRlckhlaWdodCh0cnVlKSArIHRoaXMuJG1haW4ub3V0ZXJIZWlnaHQoKSxcclxuXHRcdFx0Zm9vdGVySGVpZ2h0ID0gdGhpcy4kZm9vdGVyLmhlaWdodCgpO1xyXG5cdFx0XHR0aGlzLiRib2R5LmhlaWdodCAoJzEwMCUnKTtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuJGhlYWRlci5oZWlnaHQoKSwgdGhpcy4kaGVhZGVyLm91dGVySGVpZ2h0KHRydWUpKTtcclxuXHRcdGlmIChuSCA+IGNIICkgXHJcblx0XHR7XHJcblx0XHRcdGlmICghdGhpcy4kZm9vdGVyLmhhc0NsYXNzKCdzdGlja3ktZm9vdGVyJykpIHtcclxuXHRcdFx0XHR0aGlzLiRmb290ZXIuYWRkQ2xhc3MoJ3N0aWNreS1mb290ZXInKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSBcclxuXHRcdHtcclxuXHRcdFx0aWYgKHRoaXMuJGZvb3Rlci5oYXNDbGFzcygnc3RpY2t5LWZvb3RlcicpKSB7XHJcblx0XHRcdFx0dGhpcy4kZm9vdGVyLnJlbW92ZUNsYXNzKCdzdGlja3ktZm9vdGVyJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRsaXN0ZW4gOiBmdW5jdGlvbiAoKSB7XHRcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1x0XHRcdFxyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLnByb3h5UmVzaXplKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYW5jZWwgOiBmdW5jdGlvbiAoKSB7IFxyXG5cdFx0aWYgKHRoaXMuaXNMaXN0ZW5pbmcpIHtcclxuXHRcdFx0dGhpcy5pc0xpc3RlbmluZyA9IGZhbHNlO1x0XHJcblx0XHRcdHRoaXMuJHdpbmRvdy5vZmYoJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMucHJveHlSZXNpemUpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuICAgIF9nZXRJbm5lckhlaWdodCA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7IFxyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbiIsIlxyXG52YXIgc3RpY2t5SGVhZGVyID0ge1xyXG5cdCR3aW5kb3c6ICQod2luZG93KSxcclxuXHQkYm9keSA6ICQoJ2JvZHknKSxcclxuXHQvLyRoZWFkZXIgOiAkKCdoZWFkZXInKSxcclxuXHRkZXNrdG9wV2lkdGggOiAxMjgwLFxyXG5cdGxhc3RXaWR0aDowLFxyXG5cdHByb3h5U2Nyb2xsIDogbnVsbCxcclxuXHRzY3JvbGxQb3M6MSxcclxuXHRzdGlja3lDbGFzc25hbWU6J3N0aWNreS1oZWFkZXInLFxyXG5cdHJlc2l6ZUNsYXNzbmFtZToncmVzaXplJywgLy8gc3RvcHMgYWxsIHRyYW5zaXRpb25zIG9uIHJlc2l6ZVxyXG5cdGlzTGlzdGVuaW5nOmZhbHNlLFxyXG5cdHQ6MCxcclxuXHJcblx0aW5pdCA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHRoaXMucHJveHlTY3JvbGwgPSAkLnByb3h5KHRoaXMub25zY3JvbGwsIHRoaXMpO1xyXG5cdFx0dGhpcy4kd2luZG93Lm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCAkLnByb3h5KHRoaXMucmVzaXplLCB0aGlzKSk7XHJcblx0XHR0aGlzLmxhc3RXaWR0aCA9IHRoaXMuJHdpbmRvdy53aWR0aCgpO1xyXG5cdFx0dGhpcy5yZXNpemUoKTtcclxuXHR9LFxyXG5cclxuXHRyZXNpemUgOiBmdW5jdGlvbiAoZSkge1x0XHJcblx0XHR2YXIgdyA9IHRoaXMuX2dldElubmVyV2lkdGgoKTtcdFxyXG5cdFx0aWYgKCB3ID49IHRoaXMuZGVza3RvcFdpZHRoICkge1xyXG5cdFx0XHR0aGlzLmxpc3RlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5jYW5jZWwoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5sYXN0V2lkdGggIT09IHcgKSB7XHJcblx0XHRcdC8vIGFkZCBjbGFzcyB0byByZW1vdmUgdHJhbnNpdGlvbiBlZmZlY3RzIGR1cmluZyByZXNpemVcclxuXHRcdFx0aWYgKCF0aGlzLiRib2R5Lmhhc0NsYXNzKHRoaXMucmVzaXplQ2xhc3NuYW1lKSApIHtcclxuXHRcdFx0XHR0aGlzLiRib2R5LmFkZENsYXNzKHRoaXMucmVzaXplQ2xhc3NuYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBvbiBjb21wbGV0ZSByZW1vdmVzIHJlc2l6ZSBjbGFzc1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy50KTtcclxuXHRcdFx0dGhpcy50ID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMucmVzaXplQ29tcGxldGUsIHRoaXMpLCA1MDApO1x0XHRcdFxyXG5cdFx0fVxyXG5cdFx0dGhpcy5sYXN0V2lkdGggPSB3O1xyXG5cdH0sXHJcblxyXG5cdGxpc3RlbiA6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICghdGhpcy5pc0xpc3RlbmluZykge1xyXG5cdFx0XHR0aGlzLmlzTGlzdGVuaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy4kd2luZG93Lm9uKCdzY3JvbGwnLCB0aGlzLnByb3h5U2Nyb2xsICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Y2FuY2VsIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmICh0aGlzLmlzTGlzdGVuaW5nKSB7XHJcblx0XHRcdHRoaXMuaXNMaXN0ZW5pbmcgPSBmYWxzZTtcdFxyXG5cdFx0XHR0aGlzLiR3aW5kb3cub2ZmKCdzY3JvbGwnLCB0aGlzLnNjcm9sbFByb3h5ICk7XHJcblx0XHR9XHJcblx0fSwgXHJcblxyXG5cdG9uc2Nyb2xsIDogZnVuY3Rpb24gKGUpIHtcclxuXHRcdGlmICh0aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKCkgPiB0aGlzLnNjcm9sbFBvcyApIHtcclxuXHRcdFx0aWYgKCF0aGlzLiRib2R5Lmhhc0NsYXNzKHRoaXMuc3RpY2t5Q2xhc3NuYW1lKSApIHtcclxuXHRcdFx0XHR0aGlzLiRib2R5LmFkZENsYXNzKHRoaXMuc3RpY2t5Q2xhc3NuYW1lKTtcdFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIFxyXG5cdFx0e1xyXG5cdFx0XHRpZiAodGhpcy4kYm9keS5oYXNDbGFzcyh0aGlzLnN0aWNreUNsYXNzbmFtZSkgKSB7XHJcblx0XHRcdFx0dGhpcy4kYm9keS5yZW1vdmVDbGFzcyh0aGlzLnN0aWNreUNsYXNzbmFtZSk7XHRcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHJlc2l6ZUNvbXBsZXRlIDogZnVuY3Rpb24gKCkge1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudCk7XHJcblx0XHRpZiAodGhpcy4kYm9keS5oYXNDbGFzcyh0aGlzLnJlc2l6ZUNsYXNzbmFtZSkgKSB7XHJcblx0XHRcdHRoaXMuJGJvZHkucmVtb3ZlQ2xhc3ModGhpcy5yZXNpemVDbGFzc25hbWUpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cclxuICAgIF9nZXRJbm5lcldpZHRoIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgI
1302HJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsgXHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG59O1xyXG4iLCJ2YXIgdGFibGVFbGVtcyA9IHtcclxuXHJcblx0ZWxtczogICQoJy5tYWluIHRhYmxlJyksXHJcblxyXG5cdHRhYmxlRnVuY3Rpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGFibGVFbGVtcy5lbG1zLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciAkdGhpcz0gJCh0aGlzKSwgXHJcblx0XHRcdFx0cGFyZW50ID0gJHRoaXMucGFyZW50KCk7XHJcblx0XHRcdFx0aWYgKCFwYXJlbnQuaGFzQ2xhc3MoJ3RhYmxlJykpXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0JHRoaXMud3JhcCgnPGRpdiBjbGFzcz1cInRhYmxlXCIvPicpO1xyXG5cdFx0XHRcdH1cdFx0XHRcdFxyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0ZXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKHRhYmxlRWxlbXMuZWxtcy5sZW5ndGggPiAwKSB7XHJcblx0ICAgICAgICB0YWJsZUVsZW1zLnRhYmxlRnVuY3Rpb24oKTtcclxuXHQgICAgfVxyXG5cdH0sXHJcblx0aW5pdDogZnVuY3Rpb24oKSB7IFxyXG5cdFx0dGFibGVFbGVtcy5ldmVudExpc3RlbmVycygpO1xyXG5cdH1cclxufTsiLCIvLyBUaGUgLmVhY2goKSBtZXRob2QgaXMgdW5uZWNlc3NhcnkgaGVyZTpcclxuXHJcblxyXG4vLyAkKCAnLnR3aXR0ZXItcGFuZWwnICkuZWFjaChmdW5jdGlvbigpIHtcclxuLy8gICB2YXIgdHd0SGFuZGxlID0gJCh0aGlzKS5kYXRhKCdoYW5kbGUnKSxcclxuLy8gICAgICAgICAkdGhpcyA9ICQodGhpcyk7XHJcblxyXG4vLyAgIC8vJHRoaXMuZmluZCgnaDInKS50ZXh0KHR3dEhhbmRsZS5zdWJzdHJpbmcoMSkpOyAvLyByZW1vdmUgZmlyc3QgY2hhciAocmVwbGFjZWQgaW4gY3NzKVxyXG5cclxuLy8gICAkdGhpcy5zb2NpYWxmZWVkKHtcclxuLy8gICAgICAgICAvLyBUV0lUVEVSXHJcbi8vICAgICAgICAgdHdpdHRlcjp7XHJcbi8vICAgICAgICAgICAgIGFjY291bnRzOiBbIHR3dEhhbmRsZSBdLCBcclxuLy8gICAgICAgICAgICAgLy9hY2NvdW50czogcXVlcnlUYWdzLCAgICAgICAgICAgICAgICAgICAgICAvL0FycmF5OiBTcGVjaWZ5IGEgbGlzdCBvZiBhY2NvdW50cyBmcm9tIHdoaWNoIHRvIHB1bGwgdHdlZXRzXHJcbi8vICAgICAgICAgICAgIGxpbWl0OiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBtYXggbnVtYmVyIG9mIHR3ZWV0cyB0byBsb2FkXHJcbi8vICAgICAgICAgICAgIGNvbnN1bWVyX2tleTogJ1E0ekZYWndtTzJ1RDFSdTRhQ2lsWXdUbkInLCAgICAgICAgICAvL1N0cmluZzogY29uc3VtZXIga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuLy8gICAgICAgICAgICAgY29uc3VtZXJfc2VjcmV0OiAnaVR6YzIzNERHQ05wcndYa0RrUzB4UWNjOW5Ha0FCVENsUUdPWjRlcjlZN1drYU1IdXInLC8vU3RyaW5nOiBjb25zdW1lciBzZWNyZXQga2V5LiBtYWtlIHN1cmUgdG8gaGF2ZSB5b3VyIGFwcCByZWFkLW9ubHlcclxuLy8gICAgICAgICAgfSxcclxuXHJcbi8vICAgICAgICAgLy8gR0VORVJBTCBTRVRUSU5HU1xyXG4vLyAgICAgICAgIGxlbmd0aDo0MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogRm9yIHBvc3RzIHdpdGggdGV4dCBsb25nZXIgdGhhbiB0aGlzIGxlbmd0aCwgc2hvdyBhbiBlbGxpcHNpcy5cclxuLy8gICAgICAgICBzaG93X21lZGlhOmZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb29sZWFuOiBpZiBmYWxzZSwgZG9lc24ndCBkaXNwbGF5IGFueSBwb3N0IGltYWdlc1xyXG4vLyAgICAgICAgIG1lZGlhX21pbl93aWR0aDogMzAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZWdlcjogT25seSBnZXQgcG9zdHMgd2l0aCBpbWFnZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZVxyXG4vLyAgICAgICAgIC8vdXBkYXRlX3BlcmlvZDogNTAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnRlZ2VyOiBOdW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgc29jaWFsLWZlZWQgd2lsbCBhdHRlbXB0IHRvIGxvYWQgbmV3IHBvc3RzLlxyXG4vLyAgICAgICAgIHRlbXBsYXRlOiAndHdlZXQuaHRtbCcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBGaWxlbmFtZSB1c2VkIHRvIGdldCB0aGUgcG9zdCB0ZW1wbGF0ZS5cclxuLy8gICAgICAgICB0ZW1wbGF0ZV9odG1sOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nOiBIVE1MIHVzZWQgZm9yIGVhY2ggcG9zdC4gVGhpcyBvdmVycmlkZXMgdGhlICd0ZW1wbGF0ZScgZmlsZW5hbWUgb3B0aW9uXHJcbiAgICAgICAgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgJzxwIGNsYXNzPVwiZGF0ZS10aW1lXCI+UG9zdCB7ez1pdC50aW1lX2Fnb319PC9wPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdyYXBwZXJcIj4gXFxcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7PWl0Lmxpbmt9fVwiIHRhcmdldD1cIl9ibGFua1wiPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzb2NpYWwtZmVlZC10ZXh0XCI+e3s9aXQudGV4dH19PC9wPiBcXFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+IFxcXHJcbi8vICAgICAgICAgICAgICAgICAgICAgPC9kaXY+JyxcclxuXHJcbi8vICAgICAgICAgLy9kYXRlX2Zvcm1hdDogXCJMTExcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZzogRGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgYXR0cmlidXRlIChzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZGlzcGxheWluZy9mb3JtYXQvKVxyXG4vLyAgICAgICAgIG1vZGVyYXRpb246IGZ1bmN0aW9uKGNvbnRlbnQpIHsgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb246IGlmIHJldHVybnMgZmFsc2UsIHRlbXBsYXRlIHdpbGwgaGF2ZSBjbGFzcyBoaWRkZW5cclxuLy8gICAgICAgICAgICAgcmV0dXJuICAoY29udGVudC50ZXh0KSA/IGNvbnRlbnQudGV4dC5pbmRleE9mKCdmdWNrJykgPT0gLTEgOiB0cnVlO1xyXG4vLyAgICAgICAgI
1302H0sXHJcbi8vICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GdW5jdGlvbjogVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGV2b2tlZCB3aGVuIGFsbCB0aGUgcG9zdHMgYXJlIGNvbGxlY3RlZCBhbmQgZGlzcGxheWVkXHJcbi8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGwgcG9zdHMgY29sbGVjdGVkIScpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyB9KTsiLCJcclxuLy8gICoqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vICAkJCBEb2N1bWVudCByZWFkeVxyXG4vLyAgKioqKioqKioqKioqKioqKioqKioqKipcclxuKGZ1bmN0aW9uKCQpIHtcclxuICAkKGZ1bmN0aW9uKCkge1xyXG4gIFx0d2luZG93LndpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgXHR3aW5kb3cud2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICBcdHdpbmRvdy5pc2lQaG9uZSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpcGhvbmUnKTtcclxuICBcdHdpbmRvdy5pc2lQYWQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaXBhZCcpO1xyXG4gIFx0d2luZG93LmlzaVBvZCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpcG9kJyk7XHJcbiAgICB3aW5kb3cuaXNGaXJlZm94ID0gKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMSk7XHJcblxyXG4gIFx0d2luZG93LnRhYmxldCA9IDc2ODtcclxuICBcdHdpbmRvdy50YWJsZXRXaWRlID0gMTAyNDtcclxuICBcdHdpbmRvdy5kZXNrdG9wID0gMTI4MDtcclxuICAgIFxyXG5cclxuXHJcbiAgICAvLyBBZGQgZnVuY3Rpb25zIGhlcmVcclxuXHJcbiAgICBoZWFkZXJTY3JvbGwuaW5pdCgpO1xyXG4gICAgZm9vdGVyUG9zLmluaXQoKTtcclxuICAgIG5hdk92ZXJsYXkuaW5pdCgpO1xyXG4gICAgbW9iaWxlTmF2LmluaXQoKTtcclxuICAgIFxyXG4gICAgYWNjb3JkaW9uLmluaXQoKTtcclxuXHJcbiAgICBzb2NpYWxGZWVkLmluaXQoKTtcclxuXHJcbiAgICBidXJnZXJFbGVtcy5pbml0KCk7XHJcbiAgICBjb250ZW50TmF2LmluaXQoKTtcclxuICAgIGhpc3RvcnlUaW1lbGluZS5pbml0KCk7XHJcblxyXG4gICAgLy8gc3RpY2t5SGVhZGVyLmluaXQoKTsgXHJcbiAgICAvLyBzdGlja3lGb290ZXIuaW5pdCgpO1xyXG4gICAgbWVkaWFHYWxsZXJ5LmluaXQoKTtcclxuICAgIHRhYmxlRWxlbXMuaW5pdCgpOyBcclxuICAgIGNvbnRhY3RPcHRpb25zLmluaXQoKTsgXHJcbiAgICBidHQuaW5pdCgpO1xyXG5cclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoJy5maXQtdmlkZW8nKS5maXRWaWRzKCk7XHJcbiAgICB9KTtcclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoJy5wYW5lbCAuaW1hZ2UgaW1nJykubGF6eSh7XHJcbiAgICAgICAgZWZmZWN0OiBcImZhZGVJblwiLFxyXG4gICAgICAgIGVmZmVjdFRpbWU6IDMwMCxcclxuICAgICAgICB0aHJlc2hvbGQ6IDc1XHJcbiAgICAgIH0pO1xyXG4gICAgICAkKCcucGFuZWwgLmNvcHknKS5tYXRjaEhlaWdodCgpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoICQoIHdpbmRvdyApLndpZHRoKCkgPD0gMTI4MCkge1xyXG4gICAgICAkKCcubmF2LXdyYXBwZXInKS5hZGRDbGFzcygnaW4tbW9iaWxlJyk7XHJcbiAgICAgICQoJy5uYXYtd3JhcHBlcicpLnJlbW92ZUNsYXNzKCdpbi1sYXJnZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnLm5hdi13cmFwcGVyJykucmVtb3ZlQ2xhc3MoJ2luLW1vYmlsZScpO1xyXG4gICAgICAkKCcubmF2LXdyYXBwZXInKS5hZGRDbGFzcygnaW4tbGFyZ2UnKTtcclxuICAgIH1cclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsJy5nYWxsZXJ5LWZpbHRlciAudHJpZ2dlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAkKHRoaXMpLm5leHQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICAkKGZ1bmN0aW9uKCkge1xyXG4gICAgICAkKGRvY3VtZW50KS5vbignY2xpY2sgdG91Y2gnLCcuYXN4LWhlYWRlciAuYnV0dG9uJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgLy8kKHRoaXMpLm5leHQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgICQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsICcudG5jJywgZnVuY3Rpb24oKSB7IFxyXG4gICAgICAgIHZhciAkY2hrID0gJCh0aGlzKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpO1xyXG4gICAgICAgICRjaGsucHJvcCgnY2hlY2tlZCcsICRjaGsuaXMoJzpjaGVja2VkJykgPyBmYWxzZSA6IHRydWUpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIC8vVE9ETyBUSURZIFRISVMgSU5UTyBQQVJUSUFMXHJcbnZhciBzdGlja3lIZWFkZXJzID0gKGZ1bmN0aW9uKCkge1xyXG5cclxuICB2YXIgJHN0aWNraWVzLFxyXG4gICAgICAkb2Zmc2V0O1xyXG5cclxuICB2YXIgbG9hZCA9IGZ1bmN0aW9uKHN0aWNraWVzLCB0YXJnZXQsIG9mZnNldCkge1xyXG4gICAgXHJcbiAgICAkb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzdGlja2llcyA9PT0gXCJvYmplY3RcIiAmJiBzdGlja2llcyBpbnN0YW5jZW9mIGpRdWVyeSAmJiBzdGlja2llcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAkc3RpY2tpZXMgPSBzdGlja2llcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2Y
1302XIgJHRoaXNTdGlja3kgPSAkKHRoaXMpO1xyXG4gIFxyXG4gICAgICAgICR0aGlzU3RpY2t5XHJcbiAgICAgICAgICAgIC5kYXRhKCdvcmlnaW5hbFBvc2l0aW9uJywgJHRoaXNTdGlja3kub2Zmc2V0KCkudG9wKVxyXG4gICAgICAgICAgICAuZGF0YSgnb3JpZ2luYWxIZWlnaHQnLCAkdGhpc1N0aWNreS5vdXRlckhlaWdodCgpKTsgICAgICAgICBcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0YXJnZXQub2ZmKFwic2Nyb2xsLnN0aWNraWVzXCIpLm9uKFwic2Nyb2xsLnN0aWNraWVzXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgX3doZW5TY3JvbGxpbmcoZXZlbnQpOyAgICBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdmFyIF93aGVuU2Nyb2xsaW5nID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgIFxyXG4gICAgdmFyICRzY3JvbGxUb3AgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNjcm9sbFRvcCgpICsgJG9mZnNldDtcclxuXHJcbiAgICAkc3RpY2tpZXMuZWFjaChmdW5jdGlvbihpKSB7ICAgICAgXHJcblxyXG4gICAgICB2YXIgJHRoaXNTdGlja3kgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgJHN0aWNreVBvc2l0aW9uID0gJHRoaXNTdGlja3kuZGF0YSgnb3JpZ2luYWxQb3NpdGlvbicpLFxyXG4gICAgICAgICAgJG5ld1Bvc2l0aW9uLFxyXG4gICAgICAgICAgJG5leHRTdGlja3k7XHJcblxyXG4gICAgICBpZiAoJHN0aWNreVBvc2l0aW9uIDw9ICRzY3JvbGxUb3ApIHtcclxuICAgICAgICBcclxuICAgICAgICAkbmV3UG9zaXRpb24gPSBNYXRoLm1heCgwLCAkc2Nyb2xsVG9wIC0gJHN0aWNreVBvc2l0aW9uKTtcclxuICAgICAgICAkbmV4dFN0aWNreSA9ICRzdGlja2llcy5lcShpICsgMSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYoJG5leHRTdGlja3kubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAkbmV3UG9zaXRpb24gPSBNYXRoLm1pbigkbmV3UG9zaXRpb24sICgkbmV4dFN0aWNreS5kYXRhKCdvcmlnaW5hbFBvc2l0aW9uJykgLSAkc3RpY2t5UG9zaXRpb24pIC0gJHRoaXNTdGlja3kuZGF0YSgnb3JpZ2luYWxIZWlnaHQnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBcclxuICAgICAgICAkbmV3UG9zaXRpb24gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAkdGhpc1N0aWNreS5jc3MoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVZKCcgKyAkbmV3UG9zaXRpb24gKyAncHgpJyk7XHJcbiAgICAgIFxyXG4gICAgICAvL2NvdWxkIGp1c3QgYXMgZWFzaWx5IHVzZSB0b3AgaW5zdGVhZCBvZiB0cmFuc2Zvcm1cclxuICAgICAgLy8kdGhpc1N0aWNreS5jc3MoJ3RvcCcsICRuZXdQb3NpdGlvbiArICdweCcpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGxvYWQ6IGxvYWRcclxuICB9O1xyXG59KSgpO1xyXG5cclxuJCh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKSB7XHJcbiAgaWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpID49IDEwMjUpIHtcclxuICAgIHN0aWNreUhlYWRlcnMubG9hZCgkKFwiLnlsYWJlbFwiKSwgJCh3aW5kb3cpLCAxMDApO1xyXG4gIH1cclxuICBpZiAoICQoIHdpbmRvdyApLndpZHRoKCkgPj0gNzcwKSB7XHJcbiAgICAkKCcud3JhcHBlci5uby1pbWFnZScpLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciAkcHJldkl0ZW1IZWlnaHQgPSAkKHRoaXMpLnBhcmVudCgpLnByZXYoJy5kYXknKS5oZWlnaHQoKTtcclxuICAgICAgJCh0aGlzKS5oZWlnaHQoJHByZXZJdGVtSGVpZ2h0KTtcclxuICAgIH0pOyBcclxuICB9ICAgIFxyXG59KTtcclxuXHJcbiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcclxufSkoalF1ZXJ5KTtcclxuXHJcbiIsIi8vICAqKioqKioqKioqKioqKioqKioqKioqKlxyXG4vLyAgJCQgU21hcnQgcmVzaXplXHJcbi8vICAqKioqKioqKioqKioqKioqKioqKioqKlxyXG4oZnVuY3Rpb24gKCQsIHNyKSB7XHJcblx0dmFyIGRlYm91bmNlID0gZnVuY3Rpb24gKGZ1bmMsIHRocmVzaG9sZCwgZXhlY0FzYXApIHtcclxuXHRcdHZhciB0aW1lb3V0O1xyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcclxuXHRcdFx0dmFyIG9iaiA9IHRoaXMsXHJcblx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cztcclxuXHRcdFx0ZnVuY3Rpb24gZGVsYXllZCgpIHtcclxuXHRcdFx0XHRpZiAoIWV4ZWNBc2FwKSB7XHJcblx0XHRcdFx0XHRmdW5jLmFwcGx5KG9iaiwgYXJncyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRpbWVvdXQgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aW1lb3V0KSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGV4ZWNBc2FwKSB7XHJcblx0XHRcdFx0ZnVuYy5hcHBseShvYmosIGFyZ3MpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGRlbGF5ZWQsIHRocmVzaG9sZCB8fCAyMDApO1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cdGpRdWVyeS5mbltzcl0gPSBmdW5jdGlvbiAoZm4pIHtcclxuXHRcdHJldHVybiBmbiA/IHRoaXMuYmluZCgncmVzaXplJywgZGVib3VuY2UoZm4pKSA6IHRoaXMudHJpZ2dlcihzcik7XHJcblx0fTtcclxufSkoalF1ZXJ5LCAnc21hcnRyZXNpemUnKTsgLy8gRW5kIHNtYXJ0cmVzaXplXHJcblxyXG52YXIgcmVzaXplVGltZXI7XHJcbiQod2luZG93KS5zbWFydHJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0d2luZG93Lm5ld1dpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblx0d2luZG93Lm5ld1dpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcblx0dmFyIG5ld1dpbmRvd1dpZHRoUmVzdWx0ID0gbmV3V2luZG93V2lkdGggKiAwLjY2LFxyXG5cdFx0JG5hdldyYXBwZXIgPSAkKCcubmF2LXdyYXBwZXInKTtcclxuXHQgXHJcblx0d2luZG93LndpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcblx0d2luZG93LndpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHRpZiAoICQoIHdpbmRvdyApLndpZHR
1302oKCkgPCAxMDI0KSB7IC8vIGNoYW5nZWQgdG8gMTI4MFxyXG5cdFx0Zm9vdGVyUG9zLmluaXQoKTtcclxuXHR9XHJcblx0aWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpIDw9IDEyODApIHsgLy8gY2hhbmdlZCB0byAxMjgwXHJcblx0XHQkbmF2V3JhcHBlci5hZGRDbGFzcygnaW4tbW9iaWxlJyk7XHJcblx0XHQkbmF2V3JhcHBlci5yZW1vdmVDbGFzcygnaW4tbGFyZ2UnKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0JG5hdldyYXBwZXIucmVtb3ZlQ2xhc3MoJ2luLW1vYmlsZScpO1xyXG5cdFx0JG5hdldyYXBwZXIuYWRkQ2xhc3MoJ2luLWxhcmdlJyk7XHJcblx0XHRpZiAoICRuYXZXcmFwcGVyLmhhc0NsYXNzKCdtYmwtYWN0aXZlJykpIHtcclxuXHRcdFx0JG5hdldyYXBwZXIucmVtb3ZlQ2xhc3MoJ21ibC1hY3RpdmUnKTtcclxuXHRcdFx0JCgnLmJ1cmdlci1idXR0b24nKS5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XHJcblx0XHRcdCQoJyNtYWluJykucmVtb3ZlQ2xhc3MoJ292ZXJsYXknKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKCAkKCB3aW5kb3cgKS53aWR0aCgpID49IDc2MCkgeyAvLyBjaGFuZ2VkIHRvIDEyODBcclxuXHRcdCQoJy53cmFwcGVyLm5vLWltYWdlJykuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyICRwcmV2SXRlbUhlaWdodCA9ICQodGhpcykucGFyZW50KCkucHJldignLmRheScpLmhlaWdodCgpO1xyXG5cdFx0XHQkKHRoaXMpLmhlaWdodCgkcHJldkl0ZW1IZWlnaHQpO1xyXG5cdFx0fSk7XHRcclxuXHR9XHJcblx0aWYgKCQoJy5tZy1ncmlkJykubGVuZ3RoID4gMCkge1xyXG5cdFx0JCgnLm1nLWdyaWQgbGknKS5yZW1vdmVBdHRyKCdzdHlsZScpO1xyXG5cdH1cclxuXHJcblx0Ly8gSklSQTogV0VTRi0yMFxyXG5cdC8vIE9ubHkgYXBwbHkgdGhlIHJlc2l6ZSBmaXggaWYgbm90IGluIFNpdGVmaW5pdHkgZWRpdG9yXHJcblx0aWYgKCQoJy5zZlBhZ2VFZGl0b3InKS5sZW5ndGggPT0gMCkge1xyXG5cdFx0JCgnYm9keScpLmFkZENsYXNzKCdyZXNpemUnKTtcclxuXHRcdGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XHJcblx0XHRyZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdCQoJ2JvZHknKS5yZW1vdmVDbGFzcygncmVzaXplJyk7XHJcblx0XHRcdC8vIFJ1biBjb2RlIGhlcmUsIHJlc2l6aW5nIGhhcyBcInN0b3BwZWRcIiAgICAgICAgXHJcblx0XHR9LCAyNTApO1xyXG5cdH0gXHJcbn0pOyIsIn0pOy8vIGpRdWVyeSBlbmRcclxuLy8gbm8gd3JpdGluZyBpbiB0aGlzIGZpbGUiLCIiXX0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.