planit-rails 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1,1051 @@
1
- var Planit,__bind=function(t,r){return function(){return t.apply(r,arguments)}};Planit=function(){function t(){this.dragEnd=__bind(this.dragEnd,this),this.getAllMarkers=__bind(this.getAllMarkers,this),this.getMarker=__bind(this.getMarker,this),this.addMarker=__bind(this.addMarker,this)}return t.containerClass="planit-container",t.markerContainerClass="planit-markers-container",t.markerClass="planit-marker",t.markerContentClass="planit-marker-content",t.prototype["new"]=function(r){return this.options=null!=r?r:{},this.options.container=$(this.options.container?"#"+this.options.container:"#planit"),this.options.container.addClass("planit-container"),this.options.container.append('<div class="'+t.markerContainerClass+'"></div>'),this.container=this.options.container,this.markersContainer=this.container.find("."+t.markerContainerClass).first(),this.options.backgroundImage&&(this.container.append('<img src="'+this.options.backgroundImage+'">'),this.markersContainer.css({backgroundImage:"url('"+this.options.backgroundImage+"')"}),$(window).load(function(t){return function(){return t.container.css({height:t.container.find("img").first().height()}),t.container.find("img").first().remove()}}(this))),this.options.markers&&$(window).load(function(t){return function(){var r,i,n,a,o;for(a=t.options.markers,o=[],i=0,n=a.length;n>i;i++)r=a[i],o.push(t.addMarker(r));return o}}(this)),new t.Plan.Events({container:this.container,planit:this}),this},t.prototype.addMarker=function(r){return r.container=this.container,new t.Marker.Creator(r)},t.prototype.getMarker=function(r){return new t.Marker(this.container,r)},t.prototype.getAllMarkers=function(){var r;return r=new t.Plan(this.container),r.getAllMarkers()},t.prototype.dragEnd=function(t,r){return this.options.dragEnd?this.options.dragEnd(t,r):void 0},t.randomString=function(t){var r;return null==t&&(t=16),r=Math.random().toString(36).slice(2),r+=Math.random().toString(36).slice(2),r.substring(0,t-1)},t}(),window.planit=new Planit,Planit.Plan=function(){function t(t){this.container=t,this.getAllMarkers=__bind(this.getAllMarkers,this),this.markersContainer=this.container.find("."+Planit.markerContainerClass).first()}return t.prototype.getAllMarkers=function(){var t,r,i,n,a,o;for(i=[],o=this.markersContainer.find(".planit-marker"),n=0,a=o.length;a>n;n++)r=o[n],t=new Planit.Marker(this.container,$(r).attr("data-marker")),r={coords:t.position(),draggable:t.isDraggable(),color:t.color()},t.infoboxHTML()&&(r.infobox=t.infoboxHTML()),i.push(r);return i},t}(),Planit.Plan.Events=function(){function t(t){this.options=t,this.mousemove=__bind(this.mousemove,this),this.mouseup=__bind(this.mouseup,this),this.lastMarker=__bind(this.lastMarker,this),this.draggingMarker=__bind(this.draggingMarker,this),this.markers=__bind(this.markers,this),this.container=this.options.container,this.markersContainer=this.container.find("."+Planit.markerContainerClass),$(document).on("mousemove",this.mousemove),$(document).on("mouseup",this.mouseup)}return t.prototype.markers=function(){return this.markersContainer.find(".planit-marker")},t.prototype.draggingMarker=function(){return this.markersContainer.find(".planit-marker.is-dragging")},t.prototype.lastMarker=function(){return this.markers().last()},t.prototype.mouseup=function(t){var r,i;return $(t.target).hasClass("planit-marker-content")&&(i=$(t.target).closest(".planit-marker"),$("#"+i.attr("data-infobox")).addClass("active")),i=this.markersContainer.find(".is-dragging").first(),this.draggingMarker().length>0?(r=new Planit.Marker(this.container,i.attr("data-marker")),this.options.planit.dragEnd(t,r),this.draggingMarker().removeClass("is-dragging")):void 0},t.prototype.mousemove=function(t){var r,i,n,a,o,e,s,h,l,d,c,p,u,g;return d=this.markersContainer.find(".planit-marker.is-dragging"),d.length>0?(r=d.first(),c=t.pageX-this.container.offset().left,p=t.pageY-this.container.offset().top,g=this.container.width(),u=this.container.height(),a=c-r.outerWidth()/2,e=p-r.outerHeight()/2,o=c+r.outerWidth()/2,i=p+r.outerHeight()/2,s=r.outerWidth(),n=r.outerHeight(),h=0>=a?0:g>o?a:g-s,l=0>=e?0:u>i?e:u-n,r.css({left:h,top:l})):void 0},t}(),Planit.Marker=function(){function t(t,r){this.container=t,this.remove=__bind(this.remove,this),this.update=__bind(this.update,this),this.isDraggable=__bind(this.isDraggable,this),this.infoboxHTML=__bind(this.infoboxHTML,this),this.id=__bind(this.id,this),this.color=__bind(this.color,this),this.position=__bind(this.position,this),this.markersContainer=this.container.find("."+Planit.markerContainerClass),this.marker=this.markersContainer.find("."+Planit.markerClass+"[data-marker='"+r+"']").first()}return t.prototype.position=function(){var t,r,i,n;return r=this.marker.position().left+this.marker.outerWidth()/2,n=this.marker.position().top+this.marker.outerHeight()/2,t=r/this.container.width()*100,i=n/this.container.height()*100,[t,i]},t.prototype.color=function(){return this.marker.css("backgroundColor")},t.prototype.id=function(){return this.marker.attr("data-marker")},t.prototype.infoboxHTML=function(){var t;return t=this.marker.find(".planit-infobox"),t.length>0?t.html():null},t.prototype.isDraggable=function(){return this.marker.hasClass("draggable")},t.prototype.update=function(t){var r,i;return t.color&&this.marker.css({backgroundColor:t.color}),t.infobox&&this.marker.find(".planit-infobox").html(t.infobox),t.draggable&&(this.marker.removeClass("draggable"),t.draggable===!0&&this.marker.addClass("draggable")),t.coords?(r=parseFloat(t.coords[0])/100*this.container.width()-15,i=parseFloat(t.coords[1])/100*this.container.height()-15,this.marker.css({left:r+"px",top:i+"px"})):void 0},t.prototype.remove=function(){return this.marker.remove()},t}(),Planit.Marker.Events=function(){function t(t){var r,i;this.options=t,this.container=this.options.container,this.markersContainer=this.container.find("."+Planit.markerContainerClass),this.marker=this.markersContainer.find("."+Planit.markerClass+"[data-marker='"+this.options.id+"']").first(),this.options.draggable&&(this.lastMarker().addClass("draggable"),this.lastMarker().on("mousedown",function(){return function(t){var r,i;return"planit-marker-content"===$(t.target).attr("class")?(i=$(t.target).closest(".planit-marker"),i.addClass("is-dragging"),r=$(t.target).closest(".planit-marker").attr("data-infobox"),$("#"+r).removeClass("active")):void 0}}(this))),this.options.infobox&&(r=Planit.randomString(16),this.lastMarker().find(".planit-marker-content").append('<div class="planit-infobox" id="info-'+r+'">'+this.options.infobox+"</div>"),this.lastMarker().attr("data-infobox","info-"+r),i=$("#"+this.lastMarker().attr("data-infobox")),i.css({left:-(i.width()/2),bottom:i.outerHeight()+5}),this.lastMarker().on("mouseleave",function(){return function(t){var r;return r=$(t.target).closest(".planit-marker"),i=$("#"+r.attr("data-infobox")),i.removeClass("active")}}(this)),this.lastMarker().on("mouseover",function(t){return function(r){var n;return n=$(r.target).closest(".planit-marker"),i=$("#"+n.attr("data-infobox")),n.hasClass("is-dragging")||t.draggingMarker().length>0?i.removeClass("active"):i.addClass("active")}}(this)))}return t.prototype.markers=function(){return this.markersContainer.find(".planit-marker")},t.prototype.draggingMarker=function(){return this.markersContainer.find(".planit-marker.is-dragging")},t.prototype.lastMarker=function(){return this.markers().last()},t}(),Planit.Marker.Creator=function(){function t(t){var r,i,n;this.options=t,this.container=this.options.container,this.markersContainer=this.container.find("."+Planit.markerContainerClass).first(),this.options.id||(this.options.id=Planit.randomString(20)),r=this.options.color?this.options.color:"#FC5B3F",i=parseFloat(this.options.coords[0])/100*this.container.width()-15,n=parseFloat(this.options.coords[1])/100*this.container.height()-15,this.markersContainer.append($('<div><div class="planit-marker-content"></div></div>').addClass("planit-marker").attr("data-marker",this.options.id).css({left:i+"px",top:n+"px",backgroundColor:r})),new Planit.Marker.Events(this.options),new Planit.Marker(this.container,this.options.id)}return t}();
1
+ var Planit,
2
+ bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
+
4
+ Planit = (function() {
5
+ function Planit() {
6
+ this.canvasClick = bind(this.canvasClick, this);
7
+ this.markerClick = bind(this.markerClick, this);
8
+ this.markerDragEnd = bind(this.markerDragEnd, this);
9
+ this.resize = bind(this.resize, this);
10
+ this.getAllMarkers = bind(this.getAllMarkers, this);
11
+ this.getMarker = bind(this.getMarker, this);
12
+ this.addMarker = bind(this.addMarker, this);
13
+ this.initMarkers = bind(this.initMarkers, this);
14
+ this.initBackgroundImage = bind(this.initBackgroundImage, this);
15
+ }
16
+
17
+ Planit.containerClass = 'planit-container';
18
+
19
+ Planit.markerContainerClass = 'planit-markers-container';
20
+
21
+ Planit.markerClass = 'planit-marker';
22
+
23
+ Planit.markerContentClass = 'planit-marker-content';
24
+
25
+ Planit.infoboxContainerClass = 'planit-infobox-container';
26
+
27
+ Planit.prototype["new"] = function(options1) {
28
+ this.options = options1 != null ? options1 : {};
29
+ if (this.options.container) {
30
+ this.options.container = $("#" + this.options.container);
31
+ } else {
32
+ this.options.container = $('#planit');
33
+ }
34
+ this.options.container.addClass('planit-container');
35
+ this.options.container.append("<div class=\"" + Planit.infoboxContainerClass + "\"></div>\n<div class=\"" + Planit.markerContainerClass + "\"></div>");
36
+ this.container = this.options.container;
37
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass).first();
38
+ if (this.options.image && this.options.image.url) {
39
+ this.container.prepend("<div class=\"image-container\">\n <img src=\"" + this.options.image.url + "\">\n</div>");
40
+ this.initBackgroundImage();
41
+ }
42
+ if (this.options.markers && this.options.markers.length > 0) {
43
+ this.initMarkers();
44
+ }
45
+ new Planit.Plan.Events({
46
+ container: this.container,
47
+ planit: this
48
+ });
49
+ $(window).resize(this.resize);
50
+ return this;
51
+ };
52
+
53
+ Planit.prototype.initBackgroundImage = function() {
54
+ var img, imgHeight;
55
+ img = this.container.find('img').first();
56
+ imgHeight = img.height();
57
+ if (imgHeight > 0 && img.width() > 0) {
58
+ this.container.css({
59
+ height: imgHeight
60
+ });
61
+ this.zoomable = new Planit.Plan.Zoomable({
62
+ container: this.container
63
+ });
64
+ if (this.options.image.zoom) {
65
+ this.zoomable["new"]();
66
+ }
67
+ return this.imgLoaded = true;
68
+ } else {
69
+ return setTimeout(this.initBackgroundImage, 250);
70
+ }
71
+ };
72
+
73
+ Planit.prototype.initMarkers = function() {
74
+ var j, k, len, len1, marker, ref, ref1, results, results1;
75
+ if (this.options.image && this.options.image.url) {
76
+ if (this.imgLoaded === true) {
77
+ ref = this.options.markers;
78
+ results = [];
79
+ for (j = 0, len = ref.length; j < len; j++) {
80
+ marker = ref[j];
81
+ results.push(this.addMarker(marker));
82
+ }
83
+ return results;
84
+ } else {
85
+ return setTimeout(this.initMarkers, 250);
86
+ }
87
+ } else {
88
+ ref1 = this.options.markers;
89
+ results1 = [];
90
+ for (k = 0, len1 = ref1.length; k < len1; k++) {
91
+ marker = ref1[k];
92
+ results1.push(this.addMarker(marker));
93
+ }
94
+ return results1;
95
+ }
96
+ };
97
+
98
+ Planit.prototype.addMarker = function(options) {
99
+ options.container = this.container;
100
+ return new Planit.Marker.Creator(options);
101
+ };
102
+
103
+ Planit.prototype.getMarker = function(id) {
104
+ return new Planit.Marker(this.container, id);
105
+ };
106
+
107
+ Planit.prototype.getAllMarkers = function() {
108
+ var plan;
109
+ plan = new Planit.Plan(this.container);
110
+ return plan.getAllMarkers();
111
+ };
112
+
113
+ Planit.prototype.centerOn = function(coords) {
114
+ return this.zoomable.centerOn(coords);
115
+ };
116
+
117
+ Planit.prototype.zoomTo = function(level) {
118
+ return this.zoomable.zoomTo(level);
119
+ };
120
+
121
+ Planit.prototype.resize = function(e) {
122
+ var image, j, len, m, marker, ref, results;
123
+ image = this.container.find('.image-container > img').first();
124
+ this.zoomable.resetImage();
125
+ if (image) {
126
+ this.container.height(image.height());
127
+ }
128
+ ref = this.markersContainer.find('.planit-marker');
129
+ results = [];
130
+ for (j = 0, len = ref.length; j < len; j++) {
131
+ marker = ref[j];
132
+ m = new Planit.Marker(this.container, $(marker).attr('data-marker'));
133
+ results.push(m.set());
134
+ }
135
+ return results;
136
+ };
137
+
138
+ Planit.prototype.markerDragEnd = function(event, marker) {
139
+ if (this.options.markerDragEnd) {
140
+ return this.options.markerDragEnd(event, marker);
141
+ }
142
+ };
143
+
144
+ Planit.prototype.markerClick = function(event, marker) {
145
+ if (this.options.markerClick) {
146
+ return this.options.markerClick(event, marker);
147
+ }
148
+ };
149
+
150
+ Planit.prototype.canvasClick = function(event, coords) {
151
+ if (this.options.canvasClick) {
152
+ return this.options.canvasClick(event, coords);
153
+ }
154
+ };
155
+
156
+ Planit.randomString = function(length) {
157
+ var str;
158
+ if (length == null) {
159
+ length = 16;
160
+ }
161
+ str = Math.random().toString(36).slice(2);
162
+ str = str + Math.random().toString(36).slice(2);
163
+ return str.substring(0, length - 1);
164
+ };
165
+
166
+ return Planit;
167
+
168
+ })();
169
+
170
+ window.planit = new Planit;
171
+
172
+ Planit.Plan = (function() {
173
+ function Plan(container) {
174
+ this.container = container;
175
+ this.getAllMarkers = bind(this.getAllMarkers, this);
176
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass).first();
177
+ }
178
+
179
+ Plan.prototype.getAllMarkers = function() {
180
+ var j, len, m, marker, markers, ref;
181
+ markers = [];
182
+ ref = this.markersContainer.find('.planit-marker');
183
+ for (j = 0, len = ref.length; j < len; j++) {
184
+ marker = ref[j];
185
+ m = new Planit.Marker(this.container, $(marker).attr('data-marker'));
186
+ marker = {
187
+ coords: m.position(),
188
+ draggable: m.isDraggable(),
189
+ color: m.color()
190
+ };
191
+ if (m.infoboxHTML()) {
192
+ marker.infobox = m.infoboxHTML();
193
+ }
194
+ markers.push(m);
195
+ }
196
+ return markers;
197
+ };
198
+
199
+ return Plan;
200
+
201
+ })();
202
+
203
+ Planit.Plan.Events = (function() {
204
+ function Events(options1) {
205
+ this.options = options1;
206
+ this.mousemove = bind(this.mousemove, this);
207
+ this.mouseup = bind(this.mouseup, this);
208
+ this.getEventPosition = bind(this.getEventPosition, this);
209
+ this.draggingMarker = bind(this.draggingMarker, this);
210
+ this.markers = bind(this.markers, this);
211
+ this.container = this.options.container;
212
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass);
213
+ if (this.container.find('.image-container > img').length > 0) {
214
+ this.image = this.container.find('.image-container > img').first();
215
+ }
216
+ $(document).on('mousemove', this.mousemove);
217
+ $(document).on('mouseup', this.mouseup);
218
+ }
219
+
220
+ Events.prototype.markers = function() {
221
+ return this.markersContainer.find('.planit-marker');
222
+ };
223
+
224
+ Events.prototype.draggingMarker = function() {
225
+ return this.markersContainer.find('.planit-marker.is-dragging');
226
+ };
227
+
228
+ Events.prototype.getEventPosition = function(e) {
229
+ var hCont, hImg, wCont, wImg, xImg, xPc, xPx, yImg, yPc, yPx;
230
+ wCont = parseFloat(this.markersContainer.width());
231
+ hCont = parseFloat(this.markersContainer.height());
232
+ if (this.image) {
233
+ xPx = e.pageX - this.container.offset().left;
234
+ yPx = e.pageY - this.container.offset().top;
235
+ wImg = this.image.width();
236
+ hImg = this.image.height();
237
+ xImg = parseInt(this.image.css('left'));
238
+ yImg = parseInt(this.image.css('top'));
239
+ xPc = ((xPx + Math.abs(xImg)) / wImg) * 100;
240
+ yPc = ((yPx + Math.abs(yImg)) / hImg) * 100;
241
+ } else {
242
+ xPc = (e.pageX - this.container.offset().left) / wCont;
243
+ yPc = (e.pageY - this.container.offset().top) / hCont;
244
+ }
245
+ return [xPc, yPc];
246
+ };
247
+
248
+ Events.prototype.mouseup = function(e) {
249
+ var m, marker;
250
+ marker = this.markersContainer.find('.is-dragging').first();
251
+ if (this.draggingMarker().length > 0) {
252
+ m = new Planit.Marker(this.container, marker.attr('data-marker'));
253
+ this.options.planit.markerDragEnd(e, m);
254
+ m.savePosition();
255
+ m.positionInfobox();
256
+ this.draggingMarker().removeClass('is-dragging');
257
+ }
258
+ if ($(e.target).hasClass(Planit.markerContainerClass)) {
259
+ this.options.planit.canvasClick(e, this.getEventPosition(e));
260
+ }
261
+ if ($(e.target).hasClass(Planit.markerClass) || $(e.target).parents("." + Planit.markerClass).length > 0) {
262
+ if ($(e.target).hasClass(Planit.markerClass)) {
263
+ marker = $(e.target);
264
+ } else {
265
+ marker = $(e.target).parents("." + Planit.markerClass).first();
266
+ }
267
+ m = new Planit.Marker(this.container, marker.attr('data-marker'));
268
+ this.options.planit.markerClick(e, m);
269
+ }
270
+ return true;
271
+ };
272
+
273
+ Events.prototype.mousemove = function(e) {
274
+ var marker, markerBottom, markerHeight, markerLeft, markerRight, markerTop, markerWidth, markerX, markerY, markers, mouseLeft, mouseTop, planBottom, planRight;
275
+ markers = this.markersContainer.find('.planit-marker.is-dragging');
276
+ if (markers.length > 0) {
277
+ marker = markers.first();
278
+ if (Math.abs(e.pageX - marker.attr('data-drag-start-x')) > 0 || Math.abs(e.pageY - marker.attr('data-drag-start-y')) > 0) {
279
+ $("#" + (marker.attr('data-infobox'))).removeClass('active');
280
+ }
281
+ mouseLeft = e.pageX - this.container.offset().left;
282
+ mouseTop = e.pageY - this.container.offset().top;
283
+ planRight = this.container.width();
284
+ planBottom = this.container.height();
285
+ markerLeft = mouseLeft - (marker.outerWidth() / 2);
286
+ markerTop = mouseTop - (marker.outerHeight() / 2);
287
+ markerRight = mouseLeft + (marker.outerWidth() / 2);
288
+ markerBottom = mouseTop + (marker.outerHeight() / 2);
289
+ markerWidth = marker.outerWidth();
290
+ markerHeight = marker.outerHeight();
291
+ if (markerLeft <= 0) {
292
+ markerX = 0;
293
+ } else if (markerRight < planRight) {
294
+ markerX = markerLeft;
295
+ } else {
296
+ markerX = planRight - markerWidth;
297
+ }
298
+ if (markerTop <= 0) {
299
+ markerY = 0;
300
+ } else if (markerBottom < planBottom) {
301
+ markerY = markerTop;
302
+ } else {
303
+ markerY = planBottom - markerHeight;
304
+ }
305
+ return marker.css({
306
+ left: markerX,
307
+ top: markerY
308
+ });
309
+ }
310
+ };
311
+
312
+ return Events;
313
+
314
+ })();
315
+
316
+ Planit.Plan.Zoomable = (function() {
317
+ function Zoomable(options1) {
318
+ this.options = options1;
319
+ this.zoomOut = bind(this.zoomOut, this);
320
+ this.zoomIn = bind(this.zoomIn, this);
321
+ this.mouseup = bind(this.mouseup, this);
322
+ this.mousemove = bind(this.mousemove, this);
323
+ this.mousedown = bind(this.mousedown, this);
324
+ this.dblclick = bind(this.dblclick, this);
325
+ this.getEventContainerPosition = bind(this.getEventContainerPosition, this);
326
+ this.imgOffsetTop = bind(this.imgOffsetTop, this);
327
+ this.containerHeight = bind(this.containerHeight, this);
328
+ this.imgHeightScrollIncrement = bind(this.imgHeightScrollIncrement, this);
329
+ this.imgHeightClickIncrement = bind(this.imgHeightClickIncrement, this);
330
+ this.tmpImgHeight = bind(this.tmpImgHeight, this);
331
+ this.imgHeight = bind(this.imgHeight, this);
332
+ this.imgOffsetLeft = bind(this.imgOffsetLeft, this);
333
+ this.containerWidth = bind(this.containerWidth, this);
334
+ this.imgWidthScrollIncrement = bind(this.imgWidthScrollIncrement, this);
335
+ this.imgWidthClickIncrement = bind(this.imgWidthClickIncrement, this);
336
+ this.tmpImgWidth = bind(this.tmpImgWidth, this);
337
+ this.imgWidth = bind(this.imgWidth, this);
338
+ this.zoomTo = bind(this.zoomTo, this);
339
+ this.centerOn = bind(this.centerOn, this);
340
+ this.animateInfoboxes = bind(this.animateInfoboxes, this);
341
+ this.positionInfoboxes = bind(this.positionInfoboxes, this);
342
+ this.animateMarkers = bind(this.animateMarkers, this);
343
+ this.setMarkers = bind(this.setMarkers, this);
344
+ this.animateBackground = bind(this.animateBackground, this);
345
+ this.setBackground = bind(this.setBackground, this);
346
+ this.resetImage = bind(this.resetImage, this);
347
+ this["new"] = bind(this["new"], this);
348
+ this.container = this.options.container;
349
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass);
350
+ this.image = this.container.find('img').first();
351
+ this.zoomId = Planit.randomString();
352
+ this.markersContainer.attr('data-zoom-id', this.zoomId);
353
+ this.imagePosition = {
354
+ leftPx: 0,
355
+ topPx: 0,
356
+ width: this.image.width(),
357
+ height: this.image.height(),
358
+ scale: 1,
359
+ increment: 0.5
360
+ };
361
+ this.setBackground();
362
+ }
363
+
364
+ Zoomable.prototype["new"] = function() {
365
+ this.container.prepend("<div class=\"planit-controls\">\n <a href=\"#\" class=\"zoom\" data-action=\"in\">+</a>\n <a href=\"#\" class=\"zoom\" data-action=\"out\">-</a>\n</div>");
366
+ this.container.find(".zoom[data-action='in']").click((function(_this) {
367
+ return function(e) {
368
+ e.preventDefault();
369
+ return _this.zoomIn();
370
+ };
371
+ })(this));
372
+ this.container.find(".zoom[data-action='out']").click((function(_this) {
373
+ return function(e) {
374
+ e.preventDefault();
375
+ return _this.zoomOut();
376
+ };
377
+ })(this));
378
+ this.container.on('dblclick', this.dblclick);
379
+ this.container.on('mousedown', this.mousedown);
380
+ $(document).on('mousemove', this.mousemove);
381
+ return $(document).on('mouseup', this.mouseup);
382
+ };
383
+
384
+ Zoomable.prototype.resetImage = function() {
385
+ this.imagePosition = {
386
+ leftPx: 0,
387
+ topPx: 0,
388
+ width: this.image.width(),
389
+ height: this.image.height(),
390
+ scale: 1,
391
+ increment: 0.5
392
+ };
393
+ return this.setBackground();
394
+ };
395
+
396
+ Zoomable.prototype.setBackground = function() {
397
+ this.image.css({
398
+ left: this.imagePosition.leftPx + "px",
399
+ top: this.imagePosition.topPx + "px",
400
+ width: (this.imagePosition.scale * 100.0) + "%",
401
+ height: 'auto'
402
+ });
403
+ return this.setMarkers();
404
+ };
405
+
406
+ Zoomable.prototype.animateBackground = function() {
407
+ this.image.animate({
408
+ left: this.imagePosition.leftPx + "px",
409
+ top: this.imagePosition.topPx + "px",
410
+ width: (this.imagePosition.scale * 100.0) + "%",
411
+ height: 'auto'
412
+ }, 250);
413
+ return this.animateMarkers();
414
+ };
415
+
416
+ Zoomable.prototype.setMarkers = function() {
417
+ var j, left, len, marker, markers, top;
418
+ markers = this.container.find('div.planit-marker');
419
+ if (markers.length > 0) {
420
+ for (j = 0, len = markers.length; j < len; j++) {
421
+ marker = markers[j];
422
+ left = (this.imgWidth() * ($(marker).attr('data-xPc') / 100)) + this.imagePosition.leftPx - ($(marker).outerWidth() / 2);
423
+ top = (this.imgHeight() * ($(marker).attr('data-yPc') / 100)) + this.imagePosition.topPx - ($(marker).outerHeight() / 2);
424
+ $(marker).css({
425
+ left: left + "px",
426
+ top: top + "px"
427
+ });
428
+ }
429
+ return this.positionInfoboxes();
430
+ }
431
+ };
432
+
433
+ Zoomable.prototype.animateMarkers = function() {
434
+ var j, left, len, m, marker, markers, results, top;
435
+ markers = this.container.find('div.planit-marker');
436
+ if (markers.length > 0) {
437
+ results = [];
438
+ for (j = 0, len = markers.length; j < len; j++) {
439
+ marker = markers[j];
440
+ m = new Planit.Marker(this.container, $(marker).attr('data-marker'));
441
+ m.hideInfobox();
442
+ left = (this.imgWidth() * ($(marker).attr('data-xPc') / 100)) + this.imagePosition.leftPx - ($(marker).outerWidth() / 2);
443
+ top = (this.imgHeight() * ($(marker).attr('data-yPc') / 100)) + this.imagePosition.topPx - ($(marker).outerHeight() / 2);
444
+ results.push((function(m) {
445
+ return $(marker).animate({
446
+ left: left + "px",
447
+ top: top + "px"
448
+ }, 250, (function(_this) {
449
+ return function() {
450
+ m.positionInfobox();
451
+ return m.unhideInfobox();
452
+ };
453
+ })(this));
454
+ })(m));
455
+ }
456
+ return results;
457
+ }
458
+ };
459
+
460
+ Zoomable.prototype.positionInfoboxes = function() {
461
+ var j, len, m, marker, ref;
462
+ ref = this.container.find('.planit-marker');
463
+ for (j = 0, len = ref.length; j < len; j++) {
464
+ marker = ref[j];
465
+ m = new Planit.Marker(this.container, $(marker).attr('data-marker'));
466
+ m.positionInfobox();
467
+ }
468
+ return true;
469
+ };
470
+
471
+ Zoomable.prototype.animateInfoboxes = function() {
472
+ var j, len, m, marker, ref;
473
+ ref = this.container.find('.planit-marker');
474
+ for (j = 0, len = ref.length; j < len; j++) {
475
+ marker = ref[j];
476
+ m = new Planit.Marker(this.container, $(marker).attr('data-marker'));
477
+ m.animateInfobox();
478
+ }
479
+ return true;
480
+ };
481
+
482
+ Zoomable.prototype.centerOn = function(coords) {
483
+ var hMin, wMin, x, y;
484
+ if (coords[0] >= 50) {
485
+ x = 100 - coords[0];
486
+ } else {
487
+ x = coords[0];
488
+ }
489
+ if (coords[1] >= 50) {
490
+ y = 100 - coords[1];
491
+ } else {
492
+ y = coords[1];
493
+ }
494
+ wMin = 50 * (this.containerWidth() / x);
495
+ hMin = 50 * (this.containerHeight() / y);
496
+ this.container.find('.planit-infobox').removeClass('active');
497
+ this.imagePosition.scale = this.imagePosition.scale + this.imagePosition.increment;
498
+ this.imagePosition.leftPx = -((this.imgWidth() * (coords[0] / 100)) - (this.containerWidth() / 2));
499
+ this.imagePosition.topPx = -((this.imgHeight() * (coords[1] / 100)) - (this.containerHeight() / 2));
500
+ while ((this.imgWidth() < wMin) || (this.imgHeight() < hMin)) {
501
+ this.imagePosition.scale = this.imagePosition.scale + this.imagePosition.increment;
502
+ this.imagePosition.leftPx = -((this.imgWidth() * (coords[0] / 100)) - (this.containerWidth() / 2));
503
+ this.imagePosition.topPx = -((this.imgHeight() * (coords[1] / 100)) - (this.containerHeight() / 2));
504
+ }
505
+ return this.animateBackground();
506
+ };
507
+
508
+ Zoomable.prototype.zoomTo = function(level) {
509
+ var i;
510
+ i = this.imagePosition.increment;
511
+ if (((level * i) + 1) !== this.imagePosition.scale) {
512
+ this.imagePosition.scale = (level * i) + 1 + i;
513
+ return this.zoomOut();
514
+ }
515
+ };
516
+
517
+ Zoomable.prototype.imgWidth = function() {
518
+ return parseFloat(this.imagePosition.width * this.imagePosition.scale);
519
+ };
520
+
521
+ Zoomable.prototype.tmpImgWidth = function() {
522
+ return (1 + this.imagePosition.increment) * this.imagePosition.width();
523
+ };
524
+
525
+ Zoomable.prototype.imgWidthClickIncrement = function() {
526
+ return parseFloat(this.imagePosition.width * this.imagePosition.increment);
527
+ };
528
+
529
+ Zoomable.prototype.imgWidthScrollIncrement = function() {
530
+ return parseFloat(this.imagePosition.width * this.imagePosition.scrollIncrement);
531
+ };
532
+
533
+ Zoomable.prototype.containerWidth = function() {
534
+ return parseFloat(this.markersContainer.width());
535
+ };
536
+
537
+ Zoomable.prototype.imgOffsetLeft = function() {
538
+ return Math.abs(parseFloat(this.image.css('left')));
539
+ };
540
+
541
+ Zoomable.prototype.imgHeight = function() {
542
+ return parseFloat(this.imagePosition.height * this.imagePosition.scale);
543
+ };
544
+
545
+ Zoomable.prototype.tmpImgHeight = function() {
546
+ return (1 + this.imagePosition.increment) * this.imagePosition.height();
547
+ };
548
+
549
+ Zoomable.prototype.imgHeightClickIncrement = function() {
550
+ return parseFloat(this.imagePosition.height * this.imagePosition.increment);
551
+ };
552
+
553
+ Zoomable.prototype.imgHeightScrollIncrement = function() {
554
+ return parseFloat(this.imagePosition.height * this.imagePosition.scrollIncrement);
555
+ };
556
+
557
+ Zoomable.prototype.containerHeight = function() {
558
+ return parseFloat(this.markersContainer.height());
559
+ };
560
+
561
+ Zoomable.prototype.imgOffsetTop = function() {
562
+ return Math.abs(parseFloat(this.image.css('top')));
563
+ };
564
+
565
+ Zoomable.prototype.getEventContainerPosition = function(e) {
566
+ return {
567
+ left: (e.pageX - this.container.offset().left) / this.containerWidth(),
568
+ top: (e.pageY - this.container.offset().top) / this.containerHeight()
569
+ };
570
+ };
571
+
572
+ Zoomable.prototype.dblclick = function(e) {
573
+ var click;
574
+ if ($(e.target).attr('data-zoom-id') === this.zoomId) {
575
+ click = this.getEventContainerPosition(e);
576
+ return this.zoomIn('click', click.left, click.top);
577
+ }
578
+ };
579
+
580
+ Zoomable.prototype.mousedown = function(e) {
581
+ var coords;
582
+ if ($(e.target).attr('data-zoom-id') === this.zoomId && e.which === 1) {
583
+ this.isDragging = true;
584
+ coords = this.getEventContainerPosition(e);
585
+ this.dragCoords = {
586
+ pointRef: coords,
587
+ imgRef: {
588
+ left: 0 - this.imgOffsetLeft(),
589
+ top: 0 - this.imgOffsetTop()
590
+ },
591
+ max: {
592
+ right: (coords.left * this.containerWidth()) + this.imgOffsetLeft(),
593
+ left: (coords.left * this.containerWidth()) - (this.imgWidth() - (this.containerWidth() + this.imgOffsetLeft())),
594
+ bottom: (coords.top * this.containerHeight()) + this.imgOffsetTop(),
595
+ top: (coords.top * this.containerHeight()) - (this.imgHeight() - (this.containerHeight() + this.imgOffsetTop()))
596
+ }
597
+ };
598
+ }
599
+ return true;
600
+ };
601
+
602
+ Zoomable.prototype.mousemove = function(e) {
603
+ var coords, dragLeft, dragTop, left, top;
604
+ if (this.isDragging) {
605
+ coords = this.getEventContainerPosition(e);
606
+ dragLeft = coords.left * this.containerWidth();
607
+ dragTop = coords.top * this.containerHeight();
608
+ if (dragLeft >= this.dragCoords.max.left && dragLeft <= this.dragCoords.max.right) {
609
+ left = (coords.left - this.dragCoords.pointRef.left) * this.containerWidth();
610
+ this.imagePosition.leftPx = this.dragCoords.imgRef.left + left;
611
+ } else if (dragLeft < this.dragCoords.max.left) {
612
+ this.imagePosition.leftPx = this.containerWidth() - this.imgWidth();
613
+ } else if (dragLeft > this.dragCoords.max.right) {
614
+ this.imagePosition.leftPx = 0;
615
+ }
616
+ if (dragTop >= this.dragCoords.max.top && dragTop <= this.dragCoords.max.bottom) {
617
+ top = (coords.top - this.dragCoords.pointRef.top) * this.containerHeight();
618
+ this.imagePosition.topPx = this.dragCoords.imgRef.top + top;
619
+ } else if (dragTop < this.dragCoords.max.top) {
620
+ this.imagePosition.topPx = this.containerHeight() - this.imgHeight();
621
+ } else if (dragTop > this.dragCoords.max.bottom) {
622
+ this.imagePosition.topPx = 0;
623
+ }
624
+ this.setBackground();
625
+ }
626
+ return true;
627
+ };
628
+
629
+ Zoomable.prototype.mouseup = function(e) {
630
+ this.isDragging = false;
631
+ this.positionInfoboxes();
632
+ return true;
633
+ };
634
+
635
+ Zoomable.prototype.zoomIn = function() {
636
+ this.imagePosition.scale = this.imagePosition.scale + this.imagePosition.increment;
637
+ this.imagePosition.leftPx = -this.imgOffsetLeft() - (this.imgWidthClickIncrement() / 2);
638
+ this.imagePosition.topPx = -this.imgOffsetTop() - (this.imgHeightClickIncrement() / 2);
639
+ return this.animateBackground();
640
+ };
641
+
642
+ Zoomable.prototype.zoomOut = function() {
643
+ var leftPx, topPx;
644
+ if (this.imagePosition.scale > 1) {
645
+ this.imagePosition.scale = this.imagePosition.scale - this.imagePosition.increment;
646
+ leftPx = -this.imgOffsetLeft() + (this.imgWidthClickIncrement() / 2);
647
+ topPx = -this.imgOffsetTop() + (this.imgHeightClickIncrement() / 2);
648
+ if (leftPx > 0) {
649
+ this.imagePosition.leftPx = 0;
650
+ } else if (leftPx < this.containerWidth() - this.imgWidth()) {
651
+ this.imagePosition.leftPx = this.containerWidth() - this.imgWidth();
652
+ } else {
653
+ this.imagePosition.leftPx = leftPx;
654
+ }
655
+ if (topPx > 0) {
656
+ this.imagePosition.topPx = 0;
657
+ } else if (topPx < this.containerHeight() - this.imgHeight()) {
658
+ this.imagePosition.topPx = this.containerHeight() - this.imgHeight();
659
+ } else {
660
+ this.imagePosition.topPx = topPx;
661
+ }
662
+ return this.animateBackground();
663
+ }
664
+ };
665
+
666
+ return Zoomable;
667
+
668
+ })();
669
+
670
+ Planit.Marker = (function() {
671
+ function Marker(container, id) {
672
+ this.container = container;
673
+ this.remove = bind(this.remove, this);
674
+ this.update = bind(this.update, this);
675
+ this.savePosition = bind(this.savePosition, this);
676
+ this.set = bind(this.set, this);
677
+ this.isDraggable = bind(this.isDraggable, this);
678
+ this.animateInfobox = bind(this.animateInfobox, this);
679
+ this.positionInfobox = bind(this.positionInfobox, this);
680
+ this.infoboxCoords = bind(this.infoboxCoords, this);
681
+ this.unhideInfobox = bind(this.unhideInfobox, this);
682
+ this.showInfobox = bind(this.showInfobox, this);
683
+ this.hideInfobox = bind(this.hideInfobox, this);
684
+ this.infoboxVisible = bind(this.infoboxVisible, this);
685
+ this.infoboxHTML = bind(this.infoboxHTML, this);
686
+ this.infobox = bind(this.infobox, this);
687
+ this.id = bind(this.id, this);
688
+ this.planitID = bind(this.planitID, this);
689
+ this.color = bind(this.color, this);
690
+ this.relativePosition = bind(this.relativePosition, this);
691
+ this.position = bind(this.position, this);
692
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass);
693
+ if (this.container.find('.image-container > img').length > 0) {
694
+ this.image = this.container.find('.image-container > img').first();
695
+ }
696
+ this.marker = this.markersContainer.find("." + Planit.markerClass + "[data-marker='" + id + "']").first();
697
+ this;
698
+ }
699
+
700
+ Marker.prototype.position = function() {
701
+ var hImg, wImg, xImg, xPc, xPx, yImg, yPc, yPx;
702
+ xPx = this.marker.position().left + (this.marker.outerWidth() / 2);
703
+ yPx = this.marker.position().top + (this.marker.outerHeight() / 2);
704
+ if (this.image) {
705
+ wImg = this.image.width();
706
+ hImg = this.image.height();
707
+ xImg = parseInt(this.image.css('left'));
708
+ yImg = parseInt(this.image.css('top'));
709
+ xPc = ((xPx + Math.abs(xImg)) / wImg) * 100;
710
+ yPc = ((yPx + Math.abs(yImg)) / hImg) * 100;
711
+ } else {
712
+ xPc = (xPx / this.container.width()) * 100;
713
+ yPc = (yPx / this.container.height()) * 100;
714
+ }
715
+ return [xPc, yPc];
716
+ };
717
+
718
+ Marker.prototype.relativePosition = function() {
719
+ var xPc, xPx, yPc, yPx;
720
+ xPx = this.marker.position().left + (this.marker.outerWidth() / 2);
721
+ yPx = this.marker.position().top + (this.marker.outerHeight() / 2);
722
+ xPc = (xPx / this.container.width()) * 100;
723
+ yPc = (yPx / this.container.height()) * 100;
724
+ return [xPc, yPc];
725
+ };
726
+
727
+ Marker.prototype.color = function() {
728
+ return this.marker.css('backgroundColor');
729
+ };
730
+
731
+ Marker.prototype.planitID = function() {
732
+ return this.marker.attr('data-marker');
733
+ };
734
+
735
+ Marker.prototype.id = function() {
736
+ return this.marker.attr('data-id');
737
+ };
738
+
739
+ Marker.prototype.infobox = function() {
740
+ var infobox;
741
+ infobox = this.container.find("#" + (this.marker.attr('data-infobox')));
742
+ if (infobox.length > 0) {
743
+ return infobox;
744
+ } else {
745
+ return null;
746
+ }
747
+ };
748
+
749
+ Marker.prototype.infoboxHTML = function() {
750
+ if (this.infobox() && this.infobox().length > 0) {
751
+ return this.infobox().html();
752
+ } else {
753
+ return null;
754
+ }
755
+ };
756
+
757
+ Marker.prototype.infoboxVisible = function() {
758
+ return this.infobox() && this.infobox().hasClass('active');
759
+ };
760
+
761
+ Marker.prototype.hideInfobox = function() {
762
+ if (this.infoboxVisible()) {
763
+ return this.infobox().addClass('hidden');
764
+ }
765
+ };
766
+
767
+ Marker.prototype.showInfobox = function() {
768
+ if (this.infobox() && !this.infoboxVisible()) {
769
+ this.infobox().addClass('active');
770
+ }
771
+ return this.unhideInfobox();
772
+ };
773
+
774
+ Marker.prototype.unhideInfobox = function() {
775
+ if (this.infoboxVisible()) {
776
+ return this.infobox().removeClass('hidden');
777
+ }
778
+ };
779
+
780
+ Marker.prototype.infoboxCoords = function() {
781
+ var buffer, cHeight, cWidth, iHalfHeight, iHalfWidth, iHeight, iWidth, infoLeft, infoTop, infobox, mHalfHeight, mHalfWidth, mHeight, mWidth, markerCenterX, markerCenterY, offsetX, offsetY;
782
+ infobox = $("#" + (this.marker.attr('data-infobox')));
783
+ markerCenterX = parseFloat(this.relativePosition()[0] / 100) * this.container.width();
784
+ markerCenterY = parseFloat(this.relativePosition()[1] / 100) * this.container.height();
785
+ iWidth = infobox.outerWidth();
786
+ iHalfWidth = iWidth / 2;
787
+ iHeight = infobox.outerHeight();
788
+ iHalfHeight = iHeight / 2;
789
+ cWidth = this.container.width();
790
+ cHeight = this.container.height();
791
+ mWidth = this.marker.outerWidth();
792
+ mHalfWidth = mWidth / 2;
793
+ mHeight = this.marker.outerHeight();
794
+ mHalfHeight = mHeight / 2;
795
+ buffer = 5;
796
+ offsetX = parseInt(infobox.attr('data-offset-x'));
797
+ if (!offsetX) {
798
+ offsetX = 0;
799
+ }
800
+ offsetY = parseInt(infobox.attr('data-offset-y'));
801
+ if (!offsetY) {
802
+ offsetY = 0;
803
+ }
804
+ switch (infobox.attr('data-position')) {
805
+ case 'top':
806
+ infoLeft = markerCenterX - iHalfWidth;
807
+ infoTop = markerCenterY - iHeight - mHalfHeight - buffer;
808
+ break;
809
+ case 'right':
810
+ infoLeft = markerCenterX + mHalfWidth + buffer;
811
+ infoTop = markerCenterY - iHalfHeight;
812
+ break;
813
+ case 'bottom':
814
+ infoLeft = markerCenterX - iHalfWidth;
815
+ infoTop = markerCenterY + mHalfHeight + buffer;
816
+ break;
817
+ case 'left':
818
+ infoLeft = markerCenterX - iWidth - mHalfWidth - buffer;
819
+ infoTop = markerCenterY - iHalfHeight;
820
+ break;
821
+ case 'top-left':
822
+ infoLeft = markerCenterX - iWidth - mHalfWidth + buffer;
823
+ infoTop = markerCenterY - iHeight - mHalfHeight + buffer;
824
+ break;
825
+ case 'top-right':
826
+ infoLeft = markerCenterX + mHalfWidth - buffer;
827
+ infoTop = markerCenterY - iHeight - mHalfHeight + buffer;
828
+ break;
829
+ case 'bottom-left':
830
+ infoLeft = markerCenterX - iWidth - mHalfWidth + buffer;
831
+ infoTop = markerCenterY + mHalfHeight - buffer;
832
+ break;
833
+ case 'bottom-right':
834
+ infoLeft = markerCenterX + mHalfWidth - buffer;
835
+ infoTop = markerCenterY + mHalfHeight - buffer;
836
+ }
837
+ return {
838
+ left: infoLeft + offsetX,
839
+ top: infoTop + offsetY
840
+ };
841
+ };
842
+
843
+ Marker.prototype.positionInfobox = function() {
844
+ var coords;
845
+ coords = this.infoboxCoords();
846
+ $("#" + (this.marker.attr('data-infobox'))).css({
847
+ left: coords.left + "px",
848
+ top: coords.top + "px"
849
+ });
850
+ return this.position();
851
+ };
852
+
853
+ Marker.prototype.animateInfobox = function() {
854
+ var coords;
855
+ coords = this.infoboxCoords();
856
+ return $("#" + (this.marker.attr('data-infobox'))).animate({
857
+ left: coords.left + "px",
858
+ top: coords.top + "px"
859
+ }, 250, (function(_this) {
860
+ return function() {
861
+ return _this.position();
862
+ };
863
+ })(this));
864
+ };
865
+
866
+ Marker.prototype.isDraggable = function() {
867
+ return this.marker.hasClass('draggable');
868
+ };
869
+
870
+ Marker.prototype.set = function() {
871
+ var left, top;
872
+ left = (this.image.width() * (this.marker.attr('data-xPc') / 100)) + parseFloat(this.image.css('left')) - (this.marker.outerWidth() / 2);
873
+ top = (this.image.height() * (this.marker.attr('data-yPc') / 100)) + parseFloat(this.image.css('top')) - (this.marker.outerHeight() / 2);
874
+ this.marker.css({
875
+ left: left + "px",
876
+ top: top + "px"
877
+ });
878
+ this.positionInfobox();
879
+ return [left, top];
880
+ };
881
+
882
+ Marker.prototype.savePosition = function() {
883
+ var coords;
884
+ coords = this.position();
885
+ return this.marker.attr({
886
+ 'data-xPc': coords[0],
887
+ 'data-yPc': coords[1]
888
+ });
889
+ };
890
+
891
+ Marker.prototype.update = function(options) {
892
+ var left, top;
893
+ if (options.color) {
894
+ this.marker.css({
895
+ backgroundColor: options.color
896
+ });
897
+ }
898
+ if (options.infobox) {
899
+ this.marker.find('.planit-infobox').html(options.infobox);
900
+ this.positionInfobox();
901
+ }
902
+ if (options.draggable) {
903
+ this.marker.removeClass('draggable');
904
+ if (options.draggable === true) {
905
+ this.marker.addClass('draggable');
906
+ }
907
+ }
908
+ if (options.coords) {
909
+ left = ((parseFloat(options.coords[0]) / 100) * this.container.width()) - 15;
910
+ top = ((parseFloat(options.coords[1]) / 100) * this.container.height()) - 15;
911
+ return this.marker.css({
912
+ left: left + "px",
913
+ top: top + "px"
914
+ });
915
+ }
916
+ };
917
+
918
+ Marker.prototype.remove = function() {
919
+ if (this.infobox()) {
920
+ this.infobox().remove();
921
+ }
922
+ return this.marker.remove();
923
+ };
924
+
925
+ return Marker;
926
+
927
+ })();
928
+
929
+ Planit.Marker.Events = (function() {
930
+ function Events(options1) {
931
+ var arrow, arrowClass, classes, id, options, position;
932
+ this.options = options1;
933
+ this.container = this.options.container;
934
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass);
935
+ this.marker = this.markersContainer.find("." + Planit.markerClass + "[data-marker='" + this.options.planitID + "']").first();
936
+ this.markerObj = new Planit.Marker(this.container, this.options.planitID);
937
+ if (this.options.draggable) {
938
+ this.marker.addClass('draggable');
939
+ this.marker.on('mousedown', (function(_this) {
940
+ return function(e) {
941
+ var marker;
942
+ if (e.which === 1) {
943
+ marker = $(e.target).closest('.planit-marker');
944
+ marker.addClass('is-dragging');
945
+ return marker.attr({
946
+ 'data-drag-start-x': e.pageX,
947
+ 'data-drag-start-y': e.pageY
948
+ });
949
+ }
950
+ };
951
+ })(this));
952
+ }
953
+ if (this.options.infobox) {
954
+ id = Planit.randomString(16);
955
+ options = this.options.infobox;
956
+ if (options.position) {
957
+ position = options.position;
958
+ } else {
959
+ position = 'top';
960
+ }
961
+ if (options.arrow) {
962
+ arrow = true;
963
+ } else {
964
+ arrow = false;
965
+ }
966
+ if (arrow === true) {
967
+ arrowClass = 'arrow';
968
+ } else {
969
+ arrowClass = '';
970
+ }
971
+ classes = "planit-infobox " + position + " " + arrowClass;
972
+ this.container.find("." + Planit.infoboxContainerClass).append("<div class=\"" + classes + "\" id=\"info-" + id + "\"\n data-position=\"" + position + "\">\n " + options.html + "\n</div>");
973
+ if (options.offsetX) {
974
+ this.container.find('.planit-infobox').last().attr({
975
+ 'data-offset-x': options.offsetX
976
+ });
977
+ }
978
+ if (options.offsetY) {
979
+ this.container.find('.planit-infobox').last().attr({
980
+ 'data-offset-y': options.offsetY
981
+ });
982
+ }
983
+ this.marker.attr('data-infobox', "info-" + id);
984
+ this.markerObj.positionInfobox();
985
+ }
986
+ }
987
+
988
+ Events.prototype.markers = function() {
989
+ return this.markersContainer.find('.planit-marker');
990
+ };
991
+
992
+ Events.prototype.draggingMarker = function() {
993
+ return this.markersContainer.find('.planit-marker.is-dragging');
994
+ };
995
+
996
+ return Events;
997
+
998
+ })();
999
+
1000
+ Planit.Marker.Creator = (function() {
1001
+ function Creator(options1) {
1002
+ var color, left, marker, top;
1003
+ this.options = options1;
1004
+ this.container = this.options.container;
1005
+ this.markersContainer = this.container.find("." + Planit.markerContainerClass).first();
1006
+ if (!this.options.planitID) {
1007
+ this.options.planitID = Planit.randomString(20);
1008
+ }
1009
+ if (this.options.color) {
1010
+ color = this.options.color;
1011
+ } else {
1012
+ color = '#FC5B3F';
1013
+ }
1014
+ left = ((parseFloat(this.options.coords[0]) / 100) * this.container.width()) - 15;
1015
+ top = ((parseFloat(this.options.coords[1]) / 100) * this.container.height()) - 15;
1016
+ this.markersContainer.append($('<div></div>').addClass('planit-marker').attr({
1017
+ 'data-marker': this.options.planitID,
1018
+ 'data-xPc': this.options.coords[0],
1019
+ 'data-yPc': this.options.coords[1]
1020
+ }).css({
1021
+ left: left + "px",
1022
+ top: top + "px",
1023
+ backgroundColor: color
1024
+ }));
1025
+ marker = this.markersContainer.find('.planit-marker').last();
1026
+ if (this.options.id) {
1027
+ marker.attr({
1028
+ 'data-id': this.options.id
1029
+ });
1030
+ }
1031
+ if (this.options["class"]) {
1032
+ marker.addClass(this.options["class"]);
1033
+ }
1034
+ if (this.options.html) {
1035
+ marker.html(this.options.html);
1036
+ }
1037
+ if (this.options.size) {
1038
+ marker.css({
1039
+ width: this.options.size + "px",
1040
+ height: this.options.size + "px"
1041
+ });
1042
+ }
1043
+ new Planit.Marker.Events(this.options);
1044
+ new Planit.Marker(this.container, this.options.planitID);
1045
+ }
1046
+
1047
+ return Creator;
1048
+
1049
+ })();
1050
+
1051
+ //# sourceMappingURL=data:application/json;base64,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QUFDLElBQVYsR0FBZSxJQUF4QjtBQUFBLFFBQ0EsTUFBQSxFQUFXLElBQUMsQ0FBQSxPQUFPLENBQUMsSUFBVixHQUFlLElBRHpCO09BREYsQ0FBQSxDQURGO0tBN0JBO0FBQUEsSUFtQ0ksSUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWQsQ0FBcUIsSUFBQyxDQUFBLE9BQXRCLENBbkNKLENBQUE7QUFBQSxJQXNDSSxJQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWMsSUFBQyxDQUFBLFNBQWYsRUFBMEIsSUFBQyxDQUFBLE9BQU8sQ0FBQyxRQUFuQyxDQXRDSixDQUZXO0VBQUEsQ0FBYjs7aUJBQUE7O0lBbnpCRixDQUFBIiwiZmlsZSI6InBsYW5pdC10bXAuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBQbGFuaXRcblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZzXG5cbiAgQGNvbnRhaW5lckNsYXNzOiAgICAgICAgJ3BsYW5pdC1jb250YWluZXInXG4gIEBtYXJrZXJDb250YWluZXJDbGFzczogICdwbGFuaXQtbWFya2Vycy1jb250YWluZXInXG4gIEBtYXJrZXJDbGFzczogICAgICAgICAgICdwbGFuaXQtbWFya2VyJ1xuICBAbWFya2VyQ29udGVudENsYXNzOiAgICAncGxhbml0LW1hcmtlci1jb250ZW50J1xuICBAaW5mb2JveENvbnRhaW5lckNsYXNzOiAncGxhbml0LWluZm9ib3gtY29udGFpbmVyJ1xuXG4gICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmF1bHQgT3B0aW9uc1xuXG4gIG5ldzogKEBvcHRpb25zID0ge30pIC0+XG4gICAgIyBTZXQgT3B0aW9uc1xuICAgIGlmIEBvcHRpb25zLmNvbnRhaW5lclxuICAgICAgQG9wdGlvbnMuY29udGFpbmVyID0gJChcIiMje0BvcHRpb25zLmNvbnRhaW5lcn1cIilcbiAgICBlbHNlXG4gICAgICBAb3B0aW9ucy5jb250YWluZXIgPSAkKCcjcGxhbml0JylcblxuICAgICMgSW5pdGlhbGl6ZSBDb250YWluZXJcbiAgICBAb3B0aW9ucy5jb250YWluZXIuYWRkQ2xhc3MoJ3BsYW5pdC1jb250YWluZXInKVxuICAgIEBvcHRpb25zLmNvbnRhaW5lci5hcHBlbmQgXCJcIlwiXG4gICAgICA8ZGl2IGNsYXNzPVwiI3tQbGFuaXQuaW5mb2JveENvbnRhaW5lckNsYXNzfVwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIiN7UGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzfVwiPjwvZGl2PlxuICAgICAgICBcIlwiXCJcblxuICAgICMgUmVmc1xuICAgIEBjb250YWluZXIgPSBAb3B0aW9ucy5jb250YWluZXJcbiAgICBAbWFya2Vyc0NvbnRhaW5lciA9IEBjb250YWluZXIuZmluZChcIi4je1BsYW5pdC5tYXJrZXJDb250YWluZXJDbGFzc31cIikuZmlyc3QoKVxuXG4gICAgIyBBZGQgaW1hZ2UgYW5kIHpvb20gKGlmIG5lY2Vzc2FyeSlcbiAgICBpZiBAb3B0aW9ucy5pbWFnZSAmJiBAb3B0aW9ucy5pbWFnZS51cmxcbiAgICAgIEBjb250YWluZXIucHJlcGVuZCBcIlwiXCJcbiAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiI3tAb3B0aW9ucy5pbWFnZS51cmx9XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgXCJcIlwiXG4gICAgICAjIEBtYXJrZXJzQ29udGFpbmVyLmNzc1xuICAgICAgIyAgIGJhY2tncm91bmRJbWFnZTogXCJ1cmwoJyN7QG9wdGlvbnMuaW1hZ2UudXJsfScpXCJcbiAgICAgIEBpbml0QmFja2dyb3VuZEltYWdlKClcblxuICAgICMgQWRkIE1hcmtlcnMgKGlmIG5lY2Vzc2FyeSlcbiAgICBpZiBAb3B0aW9ucy5tYXJrZXJzICYmIEBvcHRpb25zLm1hcmtlcnMubGVuZ3RoID4gMFxuICAgICAgQGluaXRNYXJrZXJzKClcblxuICAgICMgQmluZCBEb2N1bWVudCBFdmVudHNcbiAgICBuZXcgUGxhbml0LlBsYW4uRXZlbnRzXG4gICAgICBjb250YWluZXI6IEBjb250YWluZXJcbiAgICAgIHBsYW5pdDogQFxuXG4gICAgJCh3aW5kb3cpLnJlc2l6ZShAcmVzaXplKVxuXG4gICAgIyBSZXR1cm4gdGhpcyBQbGFuaXQgb2JqZWN0XG4gICAgQFxuXG4gIGluaXRCYWNrZ3JvdW5kSW1hZ2U6ID0+XG4gICAgaW1nID0gQGNvbnRhaW5lci5maW5kKCdpbWcnKS5maXJzdCgpXG4gICAgaW1nSGVpZ2h0ID0gaW1nLmhlaWdodCgpXG4gICAgaWYgaW1nSGVpZ2h0ID4gMCAmJiBpbWcud2lkdGgoKSA+IDBcbiAgICAgIEBjb250YWluZXIuY3NzXG4gICAgICAgIGhlaWdodDogaW1nSGVpZ2h0XG4gICAgICAjIGltZy5yZW1vdmUoKVxuICAgICAgQHpvb21hYmxlID0gbmV3IFBsYW5pdC5QbGFuLlpvb21hYmxlXG4gICAgICAgIGNvbnRhaW5lcjogQGNvbnRhaW5lclxuICAgICAgaWYgQG9wdGlvbnMuaW1hZ2Uuem9vbVxuICAgICAgICBAem9vbWFibGUubmV3KClcbiAgICAgIEBpbWdMb2FkZWQgPSB0cnVlXG4gICAgZWxzZVxuICAgICAgc2V0VGltZW91dChAaW5pdEJhY2tncm91bmRJbWFnZSwgMjUwKVxuXG4gIGluaXRNYXJrZXJzOiA9PlxuICAgIGlmIEBvcHRpb25zLmltYWdlICYmIEBvcHRpb25zLmltYWdlLnVybFxuICAgICAgaWYgQGltZ0xvYWRlZCA9PSB0cnVlXG4gICAgICAgIEBhZGRNYXJrZXIobWFya2VyKSBmb3IgbWFya2VyIGluIEBvcHRpb25zLm1hcmtlcnNcbiAgICAgIGVsc2VcbiAgICAgICAgc2V0VGltZW91dChAaW5pdE1hcmtlcnMsIDI1MClcbiAgICBlbHNlXG4gICAgICBAYWRkTWFya2VyKG1hcmtlcikgZm9yIG1hcmtlciBpbiBAb3B0aW9ucy5tYXJrZXJzXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRkIEEgTWFya2VyXG5cbiAgYWRkTWFya2VyOiAob3B0aW9ucykgPT5cbiAgICBvcHRpb25zLmNvbnRhaW5lciA9IEBjb250YWluZXJcbiAgICBuZXcgUGxhbml0Lk1hcmtlci5DcmVhdG9yKG9wdGlvbnMpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmV0cmlldmUgRGF0YVxuXG4gIGdldE1hcmtlcjogKGlkKSA9PlxuICAgIG5ldyBQbGFuaXQuTWFya2VyKEBjb250YWluZXIsIGlkKVxuXG4gIGdldEFsbE1hcmtlcnM6ICgpID0+XG4gICAgcGxhbiA9IG5ldyBQbGFuaXQuUGxhbihAY29udGFpbmVyKVxuICAgIHBsYW4uZ2V0QWxsTWFya2VycygpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhbiBBY3Rpb25zXG5cbiAgY2VudGVyT246IChjb29yZHMpIC0+XG4gICAgQHpvb21hYmxlLmNlbnRlck9uKGNvb3JkcylcblxuICB6b29tVG86IChsZXZlbCkgLT5cbiAgICBAem9vbWFibGUuem9vbVRvKGxldmVsKVxuXG4gIHJlc2l6ZTogKGUpID0+XG4gICAgIyBAem9vbVRvKDApXG4gICAgIyBjb25zb2xlLmxvZyBAem9vbWFibGUuaW1hZ2VQb3NpdGlvblxuICAgIGltYWdlID0gQGNvbnRhaW5lci5maW5kKCcuaW1hZ2UtY29udGFpbmVyID4gaW1nJykuZmlyc3QoKVxuICAgIEB6b29tYWJsZS5yZXNldEltYWdlKClcbiAgICBpZiBpbWFnZVxuICAgICAgQGNvbnRhaW5lci5oZWlnaHQoaW1hZ2UuaGVpZ2h0KCkpXG4gICAgZm9yIG1hcmtlciBpbiBAbWFya2Vyc0NvbnRhaW5lci5maW5kKCcucGxhbml0LW1hcmtlcicpXG4gICAgICBtID0gbmV3IFBsYW5pdC5NYXJrZXIoQGNvbnRhaW5lciwgJChtYXJrZXIpLmF0dHIoJ2RhdGEtbWFya2VyJykpXG4gICAgICBtLnNldCgpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnQgQ2FsbGJhY2tzXG5cbiAgbWFya2VyRHJhZ0VuZDogKGV2ZW50LCBtYXJrZXIpID0+XG4gICAgaWYgQG9wdGlvbnMubWFya2VyRHJhZ0VuZFxuICAgICAgQG9wdGlvbnMubWFya2VyRHJhZ0VuZChldmVudCwgbWFya2VyKVxuXG4gIG1hcmtlckNsaWNrOiAoZXZlbnQsIG1hcmtlcikgPT5cbiAgICBpZiBAb3B0aW9ucy5tYXJrZXJDbGlja1xuICAgICAgQG9wdGlvbnMubWFya2VyQ2xpY2soZXZlbnQsIG1hcmtlcilcblxuICBjYW52YXNDbGljazogKGV2ZW50LCBjb29yZHMpID0+XG4gICAgaWYgQG9wdGlvbnMuY2FudmFzQ2xpY2tcbiAgICAgIEBvcHRpb25zLmNhbnZhc0NsaWNrKGV2ZW50LCBjb29yZHMpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgTWV0aG9kc1xuXG4gIEByYW5kb21TdHJpbmc6IChsZW5ndGggPSAxNikgLT5cbiAgICBzdHIgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKVxuICAgIHN0ciA9IHN0ciArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpXG4gICAgc3RyLnN1YnN0cmluZygwLCBsZW5ndGggLSAxKVxuXG4jIHNldCB0aGlzIGNsYXNzIHRvIGEgZ2xvYmFsIGBwbGFuaXRgIHZhcmlhYmxlXG53aW5kb3cucGxhbml0ID0gbmV3IFBsYW5pdFxuXG5jbGFzcyBQbGFuaXQuUGxhblxuXG4gICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldHVwXG5cbiAgY29uc3RydWN0b3I6IChAY29udGFpbmVyKSAtPlxuICAgIEBtYXJrZXJzQ29udGFpbmVyID0gQGNvbnRhaW5lci5maW5kKFwiLiN7UGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzfVwiKS5maXJzdCgpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2V0IEFsbCBNYXJrZXJzXG5cbiAgZ2V0QWxsTWFya2VyczogKCkgPT5cbiAgICBtYXJrZXJzID0gW11cbiAgICBmb3IgbWFya2VyIGluIEBtYXJrZXJzQ29udGFpbmVyLmZpbmQoJy5wbGFuaXQtbWFya2VyJylcbiAgICAgIG0gPSBuZXcgUGxhbml0Lk1hcmtlcihAY29udGFpbmVyLCAkKG1hcmtlcikuYXR0cignZGF0YS1tYXJrZXInKSlcbiAgICAgIG1hcmtlciA9XG4gICAgICAgICMgY29vcmRzOiBbbS5wb3NpdGlvbigpLmxlZnQsIG0ucG9zaXRpb24oKS50b3BdXG4gICAgICAgIGNvb3JkczogbS5wb3NpdGlvbigpXG4gICAgICAgIGRyYWdnYWJsZTogbS5pc0RyYWdnYWJsZSgpXG4gICAgICAgIGNvbG9yOiBtLmNvbG9yKClcbiAgICAgIG1hcmtlci5pbmZvYm94ID0gbS5pbmZvYm94SFRNTCgpIGlmIG0uaW5mb2JveEhUTUwoKVxuICAgICAgbWFya2Vycy5wdXNoKG0pXG4gICAgbWFya2Vyc1xuXG5jbGFzcyBQbGFuaXQuUGxhbi5FdmVudHNcblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR1cFxuXG4gIGNvbnN0cnVjdG9yOiAoQG9wdGlvbnMpIC0+XG5cbiAgICAjIGRlZmF1bHQgb3B0aW9uc1xuICAgIEBjb250YWluZXIgPSBAb3B0aW9ucy5jb250YWluZXJcbiAgICBAbWFya2Vyc0NvbnRhaW5lciA9IEBjb250YWluZXIuZmluZChcIi4je1BsYW5pdC5tYXJrZXJDb250YWluZXJDbGFzc31cIilcbiAgICBpZiBAY29udGFpbmVyLmZpbmQoJy5pbWFnZS1jb250YWluZXIgPiBpbWcnKS5sZW5ndGggPiAwXG4gICAgICBAaW1hZ2UgPSBAY29udGFpbmVyLmZpbmQoJy5pbWFnZS1jb250YWluZXIgPiBpbWcnKS5maXJzdCgpXG5cbiAgICAjIGJpbmQgZHJhZ2dhYmxlIGV2ZW50c1xuICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZW1vdmUnLCBAbW91c2Vtb3ZlKVxuICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZXVwJywgQG1vdXNldXApXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmc1xuXG4gIG1hcmtlcnM6ID0+XG4gICAgQG1hcmtlcnNDb250YWluZXIuZmluZCgnLnBsYW5pdC1tYXJrZXInKVxuXG4gIGRyYWdnaW5nTWFya2VyOiA9PlxuICAgIEBtYXJrZXJzQ29udGFpbmVyLmZpbmQoJy5wbGFuaXQtbWFya2VyLmlzLWRyYWdnaW5nJylcblxuICBnZXRFdmVudFBvc2l0aW9uOiAoZSkgPT5cbiAgICAjIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgd0NvbnQgPSBwYXJzZUZsb2F0KEBtYXJrZXJzQ29udGFpbmVyLndpZHRoKCkpXG4gICAgaENvbnQgPSBwYXJzZUZsb2F0KEBtYXJrZXJzQ29udGFpbmVyLmhlaWdodCgpKVxuICAgICMgaWYoXG4gICAgIyAgIEBtYXJrZXJzQ29udGFpbmVyLmNzcygnYmFja2dyb3VuZEltYWdlJykgJiZcbiAgICAjICAgQG1hcmtlcnNDb250YWluZXIuY3NzKCdiYWNrZ3JvdW5kSW1hZ2UnKSAhPSAnbm9uZSdcbiAgICAjIClcbiAgICBpZiBAaW1hZ2VcbiAgICAgICMgaWYgdGhlcmUgaXMgYW4gaW1hZ2UsIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHdpdGggaW1hZ2UgaW4gbWluZFxuICAgICAgeFB4ID0gZS5wYWdlWCAtIEBjb250YWluZXIub2Zmc2V0KCkubGVmdFxuICAgICAgeVB4ID0gZS5wYWdlWSAtIEBjb250YWluZXIub2Zmc2V0KCkudG9wXG4gICAgICB3SW1nID0gQGltYWdlLndpZHRoKClcbiAgICAgIGhJbWcgPSBAaW1hZ2UuaGVpZ2h0KClcbiAgICAgIHhJbWcgPSBwYXJzZUludChAaW1hZ2UuY3NzKCdsZWZ0JykpXG4gICAgICB5SW1nID0gcGFyc2VJbnQoQGltYWdlLmNzcygndG9wJykpXG4gICAgICB4UGMgPSAoKHhQeCArIE1hdGguYWJzKHhJbWcpKSAvIHdJbWcpICogMTAwXG4gICAgICB5UGMgPSAoKHlQeCArIE1hdGguYWJzKHlJbWcpKSAvIGhJbWcpICogMTAwXG4gICAgZWxzZVxuICAgICAgIyBvciB3ZSBjYW4ganVzdCBsb29rIGF0IHRoZSBjb250YWluZXJcbiAgICAgIHhQYyA9IChlLnBhZ2VYIC0gQGNvbnRhaW5lci5vZmZzZXQoKS5sZWZ0KSAvIHdDb250XG4gICAgICB5UGMgPSAgKGUucGFnZVkgLSBAY29udGFpbmVyLm9mZnNldCgpLnRvcCkgLyBoQ29udFxuICAgIFt4UGMsIHlQY11cblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudHNcblxuICBtb3VzZXVwOiAoZSkgPT5cbiAgICAjIGRlYWxpbmcgd2l0aCBtYXJrZXJzLCBlc3AuIGRyYWdnaW5nIG1hcmtlcnNcbiAgICBtYXJrZXIgPSBAbWFya2Vyc0NvbnRhaW5lci5maW5kKCcuaXMtZHJhZ2dpbmcnKS5maXJzdCgpXG4gICAgaWYgQGRyYWdnaW5nTWFya2VyKCkubGVuZ3RoID4gMFxuICAgICAgbSA9IG5ldyBQbGFuaXQuTWFya2VyKEBjb250YWluZXIsIG1hcmtlci5hdHRyKCdkYXRhLW1hcmtlcicpKVxuICAgICAgQG9wdGlvbnMucGxhbml0Lm1hcmtlckRyYWdFbmQoZSwgbSlcbiAgICAgIG0uc2F2ZVBvc2l0aW9uKClcbiAgICAgIG0ucG9zaXRpb25JbmZvYm94KClcbiAgICAgIEBkcmFnZ2luZ01hcmtlcigpLnJlbW92ZUNsYXNzKCdpcy1kcmFnZ2luZycpXG4gICAgIyBpZiBjbGljayBpcyBvbiB0aGUgY29udGFpbmVyXG4gICAgaWYgJChlLnRhcmdldCkuaGFzQ2xhc3MoUGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzKVxuICAgICAgQG9wdGlvbnMucGxhbml0LmNhbnZhc0NsaWNrKGUsIEBnZXRFdmVudFBvc2l0aW9uKGUpKVxuICAgICMgaWYgY2xpY2sgaXMgb24gdGhlIG1hcmtlcnNcbiAgICBpZihcbiAgICAgICQoZS50YXJnZXQpLmhhc0NsYXNzKFBsYW5pdC5tYXJrZXJDbGFzcykgfHxcbiAgICAgICQoZS50YXJnZXQpLnBhcmVudHMoXCIuI3tQbGFuaXQubWFya2VyQ2xhc3N9XCIpLmxlbmd0aCA+IDBcbiAgICApXG4gICAgICBpZiAkKGUudGFyZ2V0KS5oYXNDbGFzcyhQbGFuaXQubWFya2VyQ2xhc3MpXG4gICAgICAgIG1hcmtlciA9ICQoZS50YXJnZXQpXG4gICAgICBlbHNlXG4gICAgICAgIG1hcmtlciA9ICQoZS50YXJnZXQpLnBhcmVudHMoXCIuI3tQbGFuaXQubWFya2VyQ2xhc3N9XCIpLmZpcnN0KClcbiAgICAgIG0gPSBuZXcgUGxhbml0Lk1hcmtlcihAY29udGFpbmVyLCBtYXJrZXIuYXR0cignZGF0YS1tYXJrZXInKSlcbiAgICAgIEBvcHRpb25zLnBsYW5pdC5tYXJrZXJDbGljayhlLCBtKVxuICAgIHRydWVcblxuICBtb3VzZW1vdmU6IChlKSA9PlxuICAgIG1hcmtlcnMgPSBAbWFya2Vyc0NvbnRhaW5lci5maW5kKCcucGxhbml0LW1hcmtlci5pcy1kcmFnZ2luZycpXG5cbiAgICBpZiBtYXJrZXJzLmxlbmd0aCA+IDBcblxuICAgICAgIyBvbmx5IHVzZSBmaXJzdCBtYXJrZXIgaW4gY2FzZSB0aGVyZSBhcmUgbW9yZSB0aGFuXG4gICAgICAjIG9uZSBkcmFnZ2luZ1xuICAgICAgI1xuICAgICAgbWFya2VyID0gbWFya2Vycy5maXJzdCgpXG5cbiAgICAgICMgd2UgaGlkZSB0aGUgaW5mb2JveCB3aGlsZSBkcmFnZ2luZ1xuICAgICAgI1xuICAgICAgaWYoXG4gICAgICAgIE1hdGguYWJzKGUucGFnZVggLSBtYXJrZXIuYXR0cignZGF0YS1kcmFnLXN0YXJ0LXgnKSkgPiAwIHx8XG4gICAgICAgIE1hdGguYWJzKGUucGFnZVkgLSBtYXJrZXIuYXR0cignZGF0YS1kcmFnLXN0YXJ0LXknKSkgPiAwXG4gICAgICApXG4gICAgICAgICQoXCIjI3ttYXJrZXIuYXR0cignZGF0YS1pbmZvYm94Jyl9XCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuXG4gICAgICAjIGNhbGN1bGF0ZSBwb3NpdGlvbnNcbiAgICAgICNcbiAgICAgIG1vdXNlTGVmdCAgICAgPSBlLnBhZ2VYIC0gQGNvbnRhaW5lci5vZmZzZXQoKS5sZWZ0XG4gICAgICBtb3VzZVRvcCAgICAgID0gZS5wYWdlWSAtIEBjb250YWluZXIub2Zmc2V0KCkudG9wXG4gICAgICBwbGFuUmlnaHQgICAgID0gQGNvbnRhaW5lci53aWR0aCgpXG4gICAgICBwbGFuQm90dG9tICAgID0gQGNvbnRhaW5lci5oZWlnaHQoKVxuICAgICAgbWFya2VyTGVmdCAgICA9IG1vdXNlTGVmdCAtIChtYXJrZXIub3V0ZXJXaWR0aCgpIC8gMilcbiAgICAgIG1hcmtlclRvcCAgICAgPSBtb3VzZVRvcCAtIChtYXJrZXIub3V0ZXJIZWlnaHQoKSAvIDIpXG4gICAgICBtYXJrZXJSaWdodCAgID0gbW91c2VMZWZ0ICsgKG1hcmtlci5vdXRlcldpZHRoKCkgLyAyKVxuICAgICAgbWFya2VyQm90dG9tICA9IG1vdXNlVG9wICsgKG1hcmtlci5vdXRlckhlaWdodCgpIC8gMilcbiAgICAgIG1hcmtlcldpZHRoICAgPSBtYXJrZXIub3V0ZXJXaWR0aCgpXG4gICAgICBtYXJrZXJIZWlnaHQgID0gbWFya2VyLm91dGVySGVpZ2h0KClcblxuICAgICAgIyBmaW5kIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgYmFzZWQgb25cbiAgICAgICMgcG9zaXRpb24gb2YgdGhlIG1vdXNlIHJlbGF0aXZlIHRvIHRoZSBwbGFuXG4gICAgICAjXG4gICAgICBpZiBtYXJrZXJMZWZ0IDw9IDBcbiAgICAgICAgbWFya2VyWCA9IDBcbiAgICAgIGVsc2UgaWYgbWFya2VyUmlnaHQgPCBwbGFuUmlnaHRcbiAgICAgICAgbWFya2VyWCA9IG1hcmtlckxlZnRcbiAgICAgIGVsc2VcbiAgICAgICAgbWFya2VyWCA9IHBsYW5SaWdodCAtIG1hcmtlcldpZHRoXG5cbiAgICAgICMgZmluZCB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIGJhc2VkIG9uXG4gICAgICAjIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSByZWxhdGl2ZSB0byB0aGUgcGxhblxuICAgICAgI1xuICAgICAgaWYgbWFya2VyVG9wIDw9IDBcbiAgICAgICAgbWFya2VyWSA9IDBcbiAgICAgIGVsc2UgaWYgbWFya2VyQm90dG9tIDwgcGxhbkJvdHRvbVxuICAgICAgICBtYXJrZXJZID0gbWFya2VyVG9wXG4gICAgICBlbHNlXG4gICAgICAgIG1hcmtlclkgPSBwbGFuQm90dG9tIC0gbWFya2VySGVpZ2h0XG5cbiAgICAgICMgc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFya2VyXG4gICAgICAjXG4gICAgICBtYXJrZXIuY3NzXG4gICAgICAgIGxlZnQ6IG1hcmtlclhcbiAgICAgICAgdG9wOiBtYXJrZXJZXG5cbmNsYXNzIFBsYW5pdC5QbGFuLlpvb21hYmxlXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXBcblxuICBjb25zdHJ1Y3RvcjogKEBvcHRpb25zKSAtPlxuICAgICMgZGVmYXVsdCBvcHRpb25zXG4gICAgQGNvbnRhaW5lciA9IEBvcHRpb25zLmNvbnRhaW5lclxuICAgIEBtYXJrZXJzQ29udGFpbmVyID0gQGNvbnRhaW5lci5maW5kKFwiLiN7UGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzfVwiKVxuICAgIEBpbWFnZSA9IEBjb250YWluZXIuZmluZCgnaW1nJykuZmlyc3QoKVxuICAgIEB6b29tSWQgPSBQbGFuaXQucmFuZG9tU3RyaW5nKClcbiAgICBAbWFya2Vyc0NvbnRhaW5lci5hdHRyKCdkYXRhLXpvb20taWQnLCBAem9vbUlkKVxuICAgICMgc2V0IGluaXRpYWwgYmFja2dyb3VuZCBjb29yZGluYXRlc1xuICAgIEBpbWFnZVBvc2l0aW9uID1cbiAgICAgIGxlZnRQeDogICAgICAgICAwXG4gICAgICB0b3BQeDogICAgICAgICAgMFxuICAgICAgd2lkdGg6ICAgICAgICAgIEBpbWFnZS53aWR0aCgpXG4gICAgICBoZWlnaHQ6ICAgICAgICAgQGltYWdlLmhlaWdodCgpXG4gICAgICBzY2FsZTogICAgICAgICAgMVxuICAgICAgaW5jcmVtZW50OiAwLjVcbiAgICBAc2V0QmFja2dyb3VuZCgpXG5cbiAgIyB0aGlzIG9ubHkgZ2V0cyBydW4gaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHpvb21hYmxlIC0tXG4gICMgb3RoZXJ3aXNlIHdlIGF0IGxlYXN0IGhhdmUgdGhlIGNsYXNzIGluaXRpYWxpemVkXG4gICNcbiAgbmV3OiA9PlxuICAgICMgZHJhdyB0aGUgY29udHJvbHMgZGlua3VzXG4gICAgQGNvbnRhaW5lci5wcmVwZW5kIFwiXCJcIlxuICAgICAgPGRpdiBjbGFzcz1cInBsYW5pdC1jb250cm9sc1wiPlxuICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiem9vbVwiIGRhdGEtYWN0aW9uPVwiaW5cIj4rPC9hPlxuICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiem9vbVwiIGRhdGEtYWN0aW9uPVwib3V0XCI+LTwvYT5cbiAgICAgIDwvZGl2PlxuICAgIFwiXCJcIlxuICAgIEBjb250YWluZXIuZmluZChcIi56b29tW2RhdGEtYWN0aW9uPSdpbiddXCIpLmNsaWNrIChlKSA9PlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBAem9vbUluKClcbiAgICBAY29udGFpbmVyLmZpbmQoXCIuem9vbVtkYXRhLWFjdGlvbj0nb3V0J11cIikuY2xpY2sgKGUpID0+XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIEB6b29tT3V0KClcbiAgICAjIGJpbmQgZHJhZ2dhYmxlIGV2ZW50c1xuICAgIEBjb250YWluZXIub24oJ2RibGNsaWNrJywgQGRibGNsaWNrKVxuICAgIEBjb250YWluZXIub24oJ21vdXNlZG93bicsIEBtb3VzZWRvd24pXG4gICAgJChkb2N1bWVudCkub24oJ21vdXNlbW92ZScsIEBtb3VzZW1vdmUpXG4gICAgJChkb2N1bWVudCkub24oJ21vdXNldXAnLCBAbW91c2V1cClcblxuICByZXNldEltYWdlOiA9PlxuICAgIEBpbWFnZVBvc2l0aW9uID1cbiAgICAgIGxlZnRQeDogICAgICAgICAwXG4gICAgICB0b3BQeDogICAgICAgICAgMFxuICAgICAgd2lkdGg6ICAgICAgICAgIEBpbWFnZS53aWR0aCgpXG4gICAgICBoZWlnaHQ6ICAgICAgICAgQGltYWdlLmhlaWdodCgpXG4gICAgICBzY2FsZTogICAgICAgICAgMVxuICAgICAgaW5jcmVtZW50OiAwLjVcbiAgICBAc2V0QmFja2dyb3VuZCgpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWN0aW9uc1xuXG4gIHNldEJhY2tncm91bmQ6ID0+XG4gICAgQGltYWdlLmNzc1xuICAgICAgbGVmdDogXCIje0BpbWFnZVBvc2l0aW9uLmxlZnRQeH1weFwiXG4gICAgICB0b3A6IFwiI3tAaW1hZ2VQb3NpdGlvbi50b3BQeH1weFwiXG4gICAgICB3aWR0aDogXCIje0BpbWFnZVBvc2l0aW9uLnNjYWxlICogMTAwLjB9JVwiXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIEBzZXRNYXJrZXJzKClcblxuICBhbmltYXRlQmFja2dyb3VuZDogPT5cbiAgICBAaW1hZ2UuYW5pbWF0ZVxuICAgICAgbGVmdDogXCIje0BpbWFnZVBvc2l0aW9uLmxlZnRQeH1weFwiXG4gICAgICB0b3A6IFwiI3tAaW1hZ2VQb3NpdGlvbi50b3BQeH1weFwiXG4gICAgICB3aWR0aDogXCIje0BpbWFnZVBvc2l0aW9uLnNjYWxlICogMTAwLjB9JVwiXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgICwgMjUwXG4gICAgQGFuaW1hdGVNYXJrZXJzKClcblxuICBzZXRNYXJrZXJzOiA9PlxuICAgIG1hcmtlcnMgPSBAY29udGFpbmVyLmZpbmQoJ2Rpdi5wbGFuaXQtbWFya2VyJylcbiAgICBpZiBtYXJrZXJzLmxlbmd0aCA+IDBcbiAgICAgIGZvciBtYXJrZXIgaW4gbWFya2Vyc1xuICAgICAgICBsZWZ0ID0gKEBpbWdXaWR0aCgpICogKCQobWFya2VyKS5hdHRyKCdkYXRhLXhQYycpIC8gMTAwKSkgK1xuICAgICAgICAgIEBpbWFnZVBvc2l0aW9uLmxlZnRQeCAtICgkKG1hcmtlcikub3V0ZXJXaWR0aCgpIC8gMilcbiAgICAgICAgdG9wID0gKEBpbWdIZWlnaHQoKSAqICgkKG1hcmtlcikuYXR0cignZGF0YS15UGMnKSAvIDEwMCkpICtcbiAgICAgICAgICBAaW1hZ2VQb3NpdGlvbi50b3BQeCAtICgkKG1hcmtlcikub3V0ZXJIZWlnaHQoKSAvIDIpXG4gICAgICAgICQobWFya2VyKS5jc3NcbiAgICAgICAgICBsZWZ0OiBcIiN7bGVmdH1weFwiXG4gICAgICAgICAgdG9wOiBcIiN7dG9wfXB4XCJcbiAgICAgIEBwb3NpdGlvbkluZm9ib3hlcygpXG5cbiAgYW5pbWF0ZU1hcmtlcnM6ID0+XG4gICAgbWFya2VycyA9IEBjb250YWluZXIuZmluZCgnZGl2LnBsYW5pdC1tYXJrZXInKVxuICAgIGlmIG1hcmtlcnMubGVuZ3RoID4gMFxuICAgICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzXG4gICAgICAgIG0gPSBuZXcgUGxhbml0Lk1hcmtlcihAY29udGFpbmVyLCAkKG1hcmtlcikuYXR0cignZGF0YS1tYXJrZXInKSlcbiAgICAgICAgbS5oaWRlSW5mb2JveCgpXG4gICAgICAgIGxlZnQgPSAoQGltZ1dpZHRoKCkgKiAoJChtYXJrZXIpLmF0dHIoJ2RhdGEteFBjJykgLyAxMDApKSArXG4gICAgICAgICAgQGltYWdlUG9zaXRpb24ubGVmdFB4IC0gKCQobWFya2VyKS5vdXRlcldpZHRoKCkgLyAyKVxuICAgICAgICB0b3AgPSAoQGltZ0hlaWdodCgpICogKCQobWFya2VyKS5hdHRyKCdkYXRhLXlQYycpIC8gMTAwKSkgK1xuICAgICAgICAgIEBpbWFnZVBvc2l0aW9uLnRvcFB4IC0gKCQobWFya2VyKS5vdXRlckhlaWdodCgpIC8gMilcbiAgICAgICAgZG8gKG0pIC0+XG4gICAgICAgICAgJChtYXJrZXIpLmFuaW1hdGVcbiAgICAgICAgICAgIGxlZnQ6IFwiI3tsZWZ0fXB4XCJcbiAgICAgICAgICAgIHRvcDogXCIje3RvcH1weFwiXG4gICAgICAgICAgLCAyNTAsICgpID0+XG4gICAgICAgICAgICBtLnBvc2l0aW9uSW5mb2JveCgpXG4gICAgICAgICAgICBtLnVuaGlkZUluZm9ib3goKVxuXG4gIHBvc2l0aW9uSW5mb2JveGVzOiA9PlxuICAgIGZvciBtYXJrZXIgaW4gQGNvbnRhaW5lci5maW5kKCcucGxhbml0LW1hcmtlcicpXG4gICAgICBtID0gbmV3IFBsYW5pdC5NYXJrZXIoQGNvbnRhaW5lciwgJChtYXJrZXIpLmF0dHIoJ2RhdGEtbWFya2VyJykpXG4gICAgICBtLnBvc2l0aW9uSW5mb2JveCgpXG4gICAgdHJ1ZVxuXG4gIGFuaW1hdGVJbmZvYm94ZXM6ID0+XG4gICAgZm9yIG1hcmtlciBpbiBAY29udGFpbmVyLmZpbmQoJy5wbGFuaXQtbWFya2VyJylcbiAgICAgIG0gPSBuZXcgUGxhbml0Lk1hcmtlcihAY29udGFpbmVyLCAkKG1hcmtlcikuYXR0cignZGF0YS1tYXJrZXInKSlcbiAgICAgIG0uYW5pbWF0ZUluZm9ib3goKVxuICAgIHRydWVcblxuICBjZW50ZXJPbjogKGNvb3JkcykgPT5cbiAgICBpZiBjb29yZHNbMF0gPj0gNTAgdGhlbiB4ID0gMTAwIC0gY29vcmRzWzBdIGVsc2UgeCA9IGNvb3Jkc1swXVxuICAgIGlmIGNvb3Jkc1sxXSA+PSA1MCB0aGVuIHkgPSAxMDAgLSBjb29yZHNbMV0gZWxzZSB5ID0gY29vcmRzWzFdXG4gICAgd01pbiA9IDUwICogKEBjb250YWluZXJXaWR0aCgpIC8geClcbiAgICBoTWluID0gNTAgKiAoQGNvbnRhaW5lckhlaWdodCgpIC8geSlcbiAgICAjIGhpZGVzIG90aGVyIGFjdGl2ZSBpbmZvYm94ZXMsIGJ1dCB3aWxsIHN0aWxsIHNob3dcbiAgICAjIHRoaXMgaW5mb2JveFxuICAgIEBjb250YWluZXIuZmluZCgnLnBsYW5pdC1pbmZvYm94JykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgIyBrZWVwIHRoZW9yZXRpY2FsbHkgbWFraW5nIHRoZSBpbWFnZSBiaWdnZXIgdW50aWwgaXQgaXNcbiAgICAjIGxhcmdlIGVub3VnaCB0byBjZW50ZXIgb24gb3VyIHBvaW50XG4gICAgQGltYWdlUG9zaXRpb24uc2NhbGUgID0gQGltYWdlUG9zaXRpb24uc2NhbGUgKyBAaW1hZ2VQb3NpdGlvbi5pbmNyZW1lbnRcbiAgICBAaW1hZ2VQb3NpdGlvbi5sZWZ0UHggPSAtIChcbiAgICAgIChAaW1nV2lkdGgoKSAqIChjb29yZHNbMF0gLyAxMDApKSAtIChAY29udGFpbmVyV2lkdGgoKSAvIDIpXG4gICAgKVxuICAgIEBpbWFnZVBvc2l0aW9uLnRvcFB4ID0gLSAoXG4gICAgICAoQGltZ0hlaWdodCgpICogKGNvb3Jkc1sxXSAvIDEwMCkpIC0gKEBjb250YWluZXJIZWlnaHQoKSAvIDIpXG4gICAgKVxuICAgIHdoaWxlIChAaW1nV2lkdGgoKSA8IHdNaW4pIHx8IChAaW1nSGVpZ2h0KCkgPCBoTWluKVxuICAgICAgQGltYWdlUG9zaXRpb24uc2NhbGUgID0gQGltYWdlUG9zaXRpb24uc2NhbGUgKyBAaW1hZ2VQb3NpdGlvbi5pbmNyZW1lbnRcbiAgICAgIEBpbWFnZVBvc2l0aW9uLmxlZnRQeCA9IC0gKFxuICAgICAgICAoQGltZ1dpZHRoKCkgKiAoY29vcmRzWzBdIC8gMTAwKSkgLSAoQGNvbnRhaW5lcldpZHRoKCkgLyAyKVxuICAgICAgKVxuICAgICAgQGltYWdlUG9zaXRpb24udG9wUHggPSAtIChcbiAgICAgICAgKEBpbWdIZWlnaHQoKSAqIChjb29yZHNbMV0gLyAxMDApKSAtIChAY29udGFpbmVySGVpZ2h0KCkgLyAyKVxuICAgICAgKVxuICAgIEBhbmltYXRlQmFja2dyb3VuZCgpXG5cbiAgem9vbVRvOiAobGV2ZWwpID0+XG4gICAgaSA9IEBpbWFnZVBvc2l0aW9uLmluY3JlbWVudFxuICAgIHVubGVzcyAoKGxldmVsICogaSkgKyAxKSA9PSBAaW1hZ2VQb3NpdGlvbi5zY2FsZVxuICAgICAgQGltYWdlUG9zaXRpb24uc2NhbGUgPSAobGV2ZWwgKiBpKSArIDEgKyBpXG4gICAgICBAem9vbU91dCgpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsY3VsYXRpb25zXG5cbiAgIyAtLS0tLS0tLS0tIEltYWdlIFdpZHRoXG5cbiAgaW1nV2lkdGg6ID0+XG4gICAgcGFyc2VGbG9hdChAaW1hZ2VQb3NpdGlvbi53aWR0aCAqIEBpbWFnZVBvc2l0aW9uLnNjYWxlKVxuXG4gIHRtcEltZ1dpZHRoOiA9PlxuICAgICgxICsgQGltYWdlUG9zaXRpb24uaW5jcmVtZW50KSAqIEBpbWFnZVBvc2l0aW9uLndpZHRoKClcblxuICBpbWdXaWR0aENsaWNrSW5jcmVtZW50OiA9PlxuICAgIHBhcnNlRmxvYXQoQGltYWdlUG9zaXRpb24ud2lkdGggKiBAaW1hZ2VQb3NpdGlvbi5pbmNyZW1lbnQpXG5cbiAgaW1nV2lkdGhTY3JvbGxJbmNyZW1lbnQ6ID0+XG4gICAgcGFyc2VGbG9hdChAaW1hZ2VQb3NpdGlvbi53aWR0aCAqIEBpbWFnZVBvc2l0aW9uLnNjcm9sbEluY3JlbWVudClcblxuICBjb250YWluZXJXaWR0aDogPT5cbiAgICBwYXJzZUZsb2F0KEBtYXJrZXJzQ29udGFpbmVyLndpZHRoKCkpXG5cbiAgIyAtLS0tLS0tLS0tIExlZnQgLyBSaWdodFxuXG4gIGltZ09mZnNldExlZnQ6ID0+XG4gICAgTWF0aC5hYnMocGFyc2VGbG9hdChAaW1hZ2UuY3NzKCdsZWZ0JykpKVxuXG4gICMgLS0tLS0tLS0tLSBIZWlnaHRcblxuICBpbWdIZWlnaHQ6ID0+XG4gICAgcGFyc2VGbG9hdChAaW1hZ2VQb3NpdGlvbi5oZWlnaHQgKiBAaW1hZ2VQb3NpdGlvbi5zY2FsZSlcblxuICB0bXBJbWdIZWlnaHQ6ID0+XG4gICAgKDEgKyBAaW1hZ2VQb3NpdGlvbi5pbmNyZW1lbnQpICogQGltYWdlUG9zaXRpb24uaGVpZ2h0KClcblxuICBpbWdIZWlnaHRDbGlja0luY3JlbWVudDogPT5cbiAgICBwYXJzZUZsb2F0KEBpbWFnZVBvc2l0aW9uLmhlaWdodCAqIEBpbWFnZVBvc2l0aW9uLmluY3JlbWVudClcblxuICBpbWdIZWlnaHRTY3JvbGxJbmNyZW1lbnQ6ID0+XG4gICAgcGFyc2VGbG9hdChAaW1hZ2VQb3NpdGlvbi5oZWlnaHQgKiBAaW1hZ2VQb3NpdGlvbi5zY3JvbGxJbmNyZW1lbnQpXG5cbiAgY29udGFpbmVySGVpZ2h0OiA9PlxuICAgIHBhcnNlRmxvYXQoQG1hcmtlcnNDb250YWluZXIuaGVpZ2h0KCkpXG5cbiAgIyAtLS0tLS0tLS0tIFRvcCAvIEJvdHRvbVxuXG4gIGltZ09mZnNldFRvcDogPT5cbiAgICBNYXRoLmFicyhwYXJzZUZsb2F0KEBpbWFnZS5jc3MoJ3RvcCcpKSlcblxuICAjIC0tLS0tLS0tLS0gT3RoZXJcblxuICBnZXRFdmVudENvbnRhaW5lclBvc2l0aW9uOiAoZSkgPT5cbiAgICBsZWZ0OiAoZS5wYWdlWCAtIEBjb250YWluZXIub2Zmc2V0KCkubGVmdCkgLyBAY29udGFpbmVyV2lkdGgoKVxuICAgIHRvcDogIChlLnBhZ2VZIC0gQGNvbnRhaW5lci5vZmZzZXQoKS50b3ApIC8gQGNvbnRhaW5lckhlaWdodCgpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnRzXG5cbiAgZGJsY2xpY2s6IChlKSA9PlxuICAgIGlmICQoZS50YXJnZXQpLmF0dHIoJ2RhdGEtem9vbS1pZCcpID09IEB6b29tSWRcbiAgICAgIGNsaWNrID0gQGdldEV2ZW50Q29udGFpbmVyUG9zaXRpb24oZSlcbiAgICAgIEB6b29tSW4oJ2NsaWNrJywgY2xpY2subGVmdCwgY2xpY2sudG9wKVxuXG4gIG1vdXNlZG93bjogKGUpID0+XG4gICAgaWYgJChlLnRhcmdldCkuYXR0cignZGF0YS16b29tLWlkJykgPT0gQHpvb21JZCAmJiBlLndoaWNoID09IDFcbiAgICAgIEBpc0RyYWdnaW5nID0gdHJ1ZVxuICAgICAgY29vcmRzID0gQGdldEV2ZW50Q29udGFpbmVyUG9zaXRpb24oZSlcbiAgICAgIEBkcmFnQ29vcmRzID1cbiAgICAgICAgcG9pbnRSZWY6IGNvb3Jkc1xuICAgICAgICBpbWdSZWY6XG4gICAgICAgICAgbGVmdDogMCAtIEBpbWdPZmZzZXRMZWZ0KClcbiAgICAgICAgICB0b3A6IDAgLSBAaW1nT2Zmc2V0VG9wKClcbiAgICAgICAgbWF4OlxuICAgICAgICAgIHJpZ2h0OiAoY29vcmRzLmxlZnQgKiBAY29udGFpbmVyV2lkdGgoKSkgKyBAaW1nT2Zmc2V0TGVmdCgpXG4gICAgICAgICAgbGVmdDogKGNvb3Jkcy5sZWZ0ICogQGNvbnRhaW5lcldpZHRoKCkpIC0gKEBpbWdXaWR0aCgpIC1cbiAgICAgICAgICAgICAgICAgICAgICAoQGNvbnRhaW5lcldpZHRoKCkgKyBAaW1nT2Zmc2V0TGVmdCgpKSlcbiAgICAgICAgICBib3R0b206IChjb29yZHMudG9wICogQGNvbnRhaW5lckhlaWdodCgpKSArIEBpbWdPZmZzZXRUb3AoKVxuICAgICAgICAgIHRvcDogKGNvb3Jkcy50b3AgKiBAY29udGFpbmVySGVpZ2h0KCkpIC0gKEBpbWdIZWlnaHQoKSAtXG4gICAgICAgICAgICAgICAgICAgICAgKEBjb250YWluZXJIZWlnaHQoKSArIEBpbWdPZmZzZXRUb3AoKSkpXG4gICAgdHJ1ZVxuXG4gIG1vdXNlbW92ZTogKGUpID0+XG4gICAgaWYgQGlzRHJhZ2dpbmdcbiAgICAgIGNvb3JkcyA9IEBnZXRFdmVudENvbnRhaW5lclBvc2l0aW9uKGUpXG4gICAgICBkcmFnTGVmdCA9IGNvb3Jkcy5sZWZ0ICogQGNvbnRhaW5lcldpZHRoKClcbiAgICAgIGRyYWdUb3AgPSBjb29yZHMudG9wICogQGNvbnRhaW5lckhlaWdodCgpXG4gICAgICBpZiBkcmFnTGVmdCA+PSBAZHJhZ0Nvb3Jkcy5tYXgubGVmdCAmJiBkcmFnTGVmdCA8PSBAZHJhZ0Nvb3Jkcy5tYXgucmlnaHRcbiAgICAgICAgbGVmdCA9IChjb29yZHMubGVmdCAtIEBkcmFnQ29vcmRzLnBvaW50UmVmLmxlZnQpICogQGNvbnRhaW5lcldpZHRoKClcbiAgICAgICAgQGltYWdlUG9zaXRpb24ubGVmdFB4ID0gQGRyYWdDb29yZHMuaW1nUmVmLmxlZnQgKyBsZWZ0XG4gICAgICBlbHNlIGlmIGRyYWdMZWZ0IDwgQGRyYWdDb29yZHMubWF4LmxlZnRcbiAgICAgICAgQGltYWdlUG9zaXRpb24ubGVmdFB4ID0gQGNvbnRhaW5lcldpZHRoKCkgLSBAaW1nV2lkdGgoKVxuICAgICAgZWxzZSBpZiBkcmFnTGVmdCA+IEBkcmFnQ29vcmRzLm1heC5yaWdodFxuICAgICAgICBAaW1hZ2VQb3NpdGlvbi5sZWZ0UHggPSAwXG4gICAgICBpZiBkcmFnVG9wID49IEBkcmFnQ29vcmRzLm1heC50b3AgJiYgZHJhZ1RvcCA8PSBAZHJhZ0Nvb3Jkcy5tYXguYm90dG9tXG4gICAgICAgIHRvcCA9IChjb29yZHMudG9wIC0gQGRyYWdDb29yZHMucG9pbnRSZWYudG9wKSAqIEBjb250YWluZXJIZWlnaHQoKVxuICAgICAgICBAaW1hZ2VQb3NpdGlvbi50b3BQeCA9IEBkcmFnQ29vcmRzLmltZ1JlZi50b3AgKyB0b3BcbiAgICAgIGVsc2UgaWYgZHJhZ1RvcCA8IEBkcmFnQ29vcmRzLm1heC50b3BcbiAgICAgICAgQGltYWdlUG9zaXRpb24udG9wUHggPSBAY29udGFpbmVySGVpZ2h0KCkgLSBAaW1nSGVpZ2h0KClcbiAgICAgIGVsc2UgaWYgZHJhZ1RvcCA+IEBkcmFnQ29vcmRzLm1heC5ib3R0b21cbiAgICAgICAgQGltYWdlUG9zaXRpb24udG9wUHggPSAwXG4gICAgICBAc2V0QmFja2dyb3VuZCgpXG4gICAgdHJ1ZVxuXG4gIG1vdXNldXA6IChlKSA9PlxuICAgIEBpc0RyYWdnaW5nID0gZmFsc2VcbiAgICBAcG9zaXRpb25JbmZvYm94ZXMoKVxuICAgIHRydWVcblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBab29taW5nXG5cbiAgem9vbUluOiA9PlxuICAgIEBpbWFnZVBvc2l0aW9uLnNjYWxlICA9IEBpbWFnZVBvc2l0aW9uLnNjYWxlICsgQGltYWdlUG9zaXRpb24uaW5jcmVtZW50XG4gICAgQGltYWdlUG9zaXRpb24ubGVmdFB4ID0gLSBAaW1nT2Zmc2V0TGVmdCgpIC0gKEBpbWdXaWR0aENsaWNrSW5jcmVtZW50KCkgLyAyKVxuICAgIEBpbWFnZVBvc2l0aW9uLnRvcFB4ICA9IC0gQGltZ09mZnNldFRvcCgpIC0gKEBpbWdIZWlnaHRDbGlja0luY3JlbWVudCgpIC8gMilcbiAgICBAYW5pbWF0ZUJhY2tncm91bmQoKVxuXG4gIHpvb21PdXQ6ICgpID0+XG4gICAgaWYgQGltYWdlUG9zaXRpb24uc2NhbGUgPiAxXG4gICAgICBAaW1hZ2VQb3NpdGlvbi5zY2FsZSAgPSBAaW1hZ2VQb3NpdGlvbi5zY2FsZSAtIEBpbWFnZVBvc2l0aW9uLmluY3JlbWVudFxuICAgICAgbGVmdFB4ID0gLSBAaW1nT2Zmc2V0TGVmdCgpICsgKEBpbWdXaWR0aENsaWNrSW5jcmVtZW50KCkgLyAyKVxuICAgICAgdG9wUHggID0gLSBAaW1nT2Zmc2V0VG9wKCkgKyAoQGltZ0hlaWdodENsaWNrSW5jcmVtZW50KCkgLyAyKVxuICAgICAgaWYgbGVmdFB4ID4gMFxuICAgICAgICBAaW1hZ2VQb3NpdGlvbi5sZWZ0UHggPSAwXG4gICAgICBlbHNlIGlmIGxlZnRQeCA8IEBjb250YWluZXJXaWR0aCgpIC0gQGltZ1dpZHRoKClcbiAgICAgICAgQGltYWdlUG9zaXRpb24ubGVmdFB4ID0gQGNvbnRhaW5lcldpZHRoKCkgLSBAaW1nV2lkdGgoKVxuICAgICAgZWxzZVxuICAgICAgICBAaW1hZ2VQb3NpdGlvbi5sZWZ0UHggPSBsZWZ0UHhcbiAgICAgIGlmIHRvcFB4ID4gMFxuICAgICAgICBAaW1hZ2VQb3NpdGlvbi50b3BQeCA9IDBcbiAgICAgIGVsc2UgaWYgdG9wUHggPCBAY29udGFpbmVySGVpZ2h0KCkgLSBAaW1nSGVpZ2h0KClcbiAgICAgICAgQGltYWdlUG9zaXRpb24udG9wUHggPSBAY29udGFpbmVySGVpZ2h0KCkgLSBAaW1nSGVpZ2h0KClcbiAgICAgIGVsc2VcbiAgICAgICAgQGltYWdlUG9zaXRpb24udG9wUHggPSB0b3BQeFxuICAgICAgQGFuaW1hdGVCYWNrZ3JvdW5kKClcblxuY2xhc3MgUGxhbml0Lk1hcmtlclxuXG4gIGNvbnN0cnVjdG9yOiAoQGNvbnRhaW5lciwgaWQpIC0+XG5cbiAgICAjIFNldCBPcHRpb25zXG4gICAgQG1hcmtlcnNDb250YWluZXIgPSBAY29udGFpbmVyLmZpbmQoXCIuI3tQbGFuaXQubWFya2VyQ29udGFpbmVyQ2xhc3N9XCIpXG4gICAgaWYgQGNvbnRhaW5lci5maW5kKCcuaW1hZ2UtY29udGFpbmVyID4gaW1nJykubGVuZ3RoID4gMFxuICAgICAgQGltYWdlID0gQGNvbnRhaW5lci5maW5kKCcuaW1hZ2UtY29udGFpbmVyID4gaW1nJykuZmlyc3QoKVxuXG4gICAgIyBGaW5kIE1hcmtlclxuICAgIEBtYXJrZXIgPSBAbWFya2Vyc0NvbnRhaW5lci5maW5kKFxuICAgICAgXCIuI3tQbGFuaXQubWFya2VyQ2xhc3N9W2RhdGEtbWFya2VyPScje2lkfSddXCJcbiAgICApLmZpcnN0KClcblxuICAgICMgUmV0dXJuIHRoaXNcbiAgICBAXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsY3VsYXRpb25zXG5cbiAgcG9zaXRpb246ID0+XG4gICAgeFB4ID0gQG1hcmtlci5wb3NpdGlvbigpLmxlZnQgKyAoQG1hcmtlci5vdXRlcldpZHRoKCkgLyAyKVxuICAgIHlQeCA9IEBtYXJrZXIucG9zaXRpb24oKS50b3AgKyAoQG1hcmtlci5vdXRlckhlaWdodCgpIC8gMilcbiAgICBpZiBAaW1hZ2VcbiAgICAgIHdJbWcgPSBAaW1hZ2Uud2lkdGgoKVxuICAgICAgaEltZyA9IEBpbWFnZS5oZWlnaHQoKVxuICAgICAgeEltZyA9IHBhcnNlSW50KEBpbWFnZS5jc3MoJ2xlZnQnKSlcbiAgICAgIHlJbWcgPSBwYXJzZUludChAaW1hZ2UuY3NzKCd0b3AnKSlcbiAgICAgIHhQYyA9ICgoeFB4ICsgTWF0aC5hYnMoeEltZykpIC8gd0ltZykgKiAxMDBcbiAgICAgIHlQYyA9ICgoeVB4ICsgTWF0aC5hYnMoeUltZykpIC8gaEltZykgKiAxMDBcbiAgICBlbHNlXG4gICAgICB4UGMgPSAoeFB4IC8gQGNvbnRhaW5lci53aWR0aCgpKSAqIDEwMFxuICAgICAgeVBjID0gKHlQeCAvIEBjb250YWluZXIuaGVpZ2h0KCkpICogMTAwXG4gICAgW3hQYywgeVBjXVxuXG4gIHJlbGF0aXZlUG9zaXRpb246ID0+XG4gICAgeFB4ID0gQG1hcmtlci5wb3NpdGlvbigpLmxlZnQgKyAoQG1hcmtlci5vdXRlcldpZHRoKCkgLyAyKVxuICAgIHlQeCA9IEBtYXJrZXIucG9zaXRpb24oKS50b3AgKyAoQG1hcmtlci5vdXRlckhlaWdodCgpIC8gMilcbiAgICB4UGMgPSAoeFB4IC8gQGNvbnRhaW5lci53aWR0aCgpKSAqIDEwMFxuICAgIHlQYyA9ICh5UHggLyBAY29udGFpbmVyLmhlaWdodCgpKSAqIDEwMFxuICAgIFt4UGMsIHlQY11cblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzXG5cbiAgY29sb3I6ID0+XG4gICAgQG1hcmtlci5jc3MoJ2JhY2tncm91bmRDb2xvcicpXG5cbiAgcGxhbml0SUQ6ID0+XG4gICAgQG1hcmtlci5hdHRyKCdkYXRhLW1hcmtlcicpXG5cbiAgaWQ6ID0+XG4gICAgQG1hcmtlci5hdHRyKCdkYXRhLWlkJylcblxuICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmZvYm94XG5cbiAgaW5mb2JveDogPT5cbiAgICBpbmZvYm94ID0gQGNvbnRhaW5lci5maW5kKFwiIyN7QG1hcmtlci5hdHRyKCdkYXRhLWluZm9ib3gnKX1cIilcbiAgICBpZiBpbmZvYm94Lmxlbmd0aCA+IDAgdGhlbiBpbmZvYm94IGVsc2UgbnVsbFxuXG4gIGluZm9ib3hIVE1MOiA9PlxuICAgIGlmIEBpbmZvYm94KCkgJiYgQGluZm9ib3goKS5sZW5ndGggPiAwIHRoZW4gQGluZm9ib3goKS5odG1sKCkgZWxzZSBudWxsXG5cbiAgaW5mb2JveFZpc2libGU6ID0+XG4gICAgQGluZm9ib3goKSAmJiBAaW5mb2JveCgpLmhhc0NsYXNzKCdhY3RpdmUnKVxuXG4gIGhpZGVJbmZvYm94OiA9PlxuICAgIEBpbmZvYm94KCkuYWRkQ2xhc3MoJ2hpZGRlbicpIGlmIEBpbmZvYm94VmlzaWJsZSgpXG5cbiAgc2hvd0luZm9ib3g6ID0+XG4gICAgQGluZm9ib3goKS5hZGRDbGFzcygnYWN0aXZlJykgaWYgQGluZm9ib3goKSAmJiAhQGluZm9ib3hWaXNpYmxlKClcbiAgICBAdW5oaWRlSW5mb2JveCgpXG5cbiAgdW5oaWRlSW5mb2JveDogPT5cbiAgICBAaW5mb2JveCgpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKSBpZiBAaW5mb2JveFZpc2libGUoKVxuXG4gIGluZm9ib3hDb29yZHM6ID0+XG4gICAgaW5mb2JveCA9ICQoXCIjI3tAbWFya2VyLmF0dHIoJ2RhdGEtaW5mb2JveCcpfVwiKVxuICAgIG1hcmtlckNlbnRlclggPSAocGFyc2VGbG9hdChAcmVsYXRpdmVQb3NpdGlvbigpWzBdIC8gMTAwKSAqIEBjb250YWluZXIud2lkdGgoKSlcbiAgICBtYXJrZXJDZW50ZXJZID0gKHBhcnNlRmxvYXQoQHJlbGF0aXZlUG9zaXRpb24oKVsxXSAvIDEwMCkgKiBAY29udGFpbmVyLmhlaWdodCgpKVxuICAgIGlXaWR0aCA9IGluZm9ib3gub3V0ZXJXaWR0aCgpXG4gICAgaUhhbGZXaWR0aCA9IGlXaWR0aCAvIDJcbiAgICBpSGVpZ2h0ID0gaW5mb2JveC5vdXRlckhlaWdodCgpXG4gICAgaUhhbGZIZWlnaHQgPSBpSGVpZ2h0IC8gMlxuICAgIGNXaWR0aCA9IEBjb250YWluZXIud2lkdGgoKVxuICAgIGNIZWlnaHQgPSBAY29udGFpbmVyLmhlaWdodCgpXG4gICAgbVdpZHRoID0gQG1hcmtlci5vdXRlcldpZHRoKClcbiAgICBtSGFsZldpZHRoID0gbVdpZHRoIC8gMlxuICAgIG1IZWlnaHQgPSBAbWFya2VyLm91dGVySGVpZ2h0KClcbiAgICBtSGFsZkhlaWdodCA9IG1IZWlnaHQgLyAyXG4gICAgYnVmZmVyID0gNVxuICAgIG9mZnNldFggPSBwYXJzZUludChpbmZvYm94LmF0dHIoJ2RhdGEtb2Zmc2V0LXgnKSlcbiAgICBvZmZzZXRYID0gMCB1bmxlc3Mgb2Zmc2V0WFxuICAgIG9mZnNldFkgPSBwYXJzZUludChpbmZvYm94LmF0dHIoJ2RhdGEtb2Zmc2V0LXknKSlcbiAgICBvZmZzZXRZID0gMCB1bmxlc3Mgb2Zmc2V0WVxuICAgIHN3aXRjaCBpbmZvYm94LmF0dHIoJ2RhdGEtcG9zaXRpb24nKVxuICAgICAgd2hlbiAndG9wJ1xuICAgICAgICBpbmZvTGVmdCA9IG1hcmtlckNlbnRlclggLSBpSGFsZldpZHRoXG4gICAgICAgIGluZm9Ub3AgPSBtYXJrZXJDZW50ZXJZIC0gaUhlaWdodCAtIG1IYWxmSGVpZ2h0IC0gYnVmZmVyXG4gICAgICB3aGVuICdyaWdodCdcbiAgICAgICAgaW5mb0xlZnQgPSBtYXJrZXJDZW50ZXJYICsgbUhhbGZXaWR0aCArIGJ1ZmZlclxuICAgICAgICBpbmZvVG9wID0gbWFya2VyQ2VudGVyWSAtIGlIYWxmSGVpZ2h0XG4gICAgICB3aGVuICdib3R0b20nXG4gICAgICAgIGluZm9MZWZ0ID0gbWFya2VyQ2VudGVyWCAtIGlIYWxmV2lkdGhcbiAgICAgICAgaW5mb1RvcCA9IG1hcmtlckNlbnRlclkgKyBtSGFsZkhlaWdodCArIGJ1ZmZlclxuICAgICAgd2hlbiAnbGVmdCdcbiAgICAgICAgaW5mb0xlZnQgPSBtYXJrZXJDZW50ZXJYIC0gaVdpZHRoIC0gbUhhbGZXaWR0aCAtIGJ1ZmZlclxuICAgICAgICBpbmZvVG9wID0gbWFya2VyQ2VudGVyWSAtIGlIYWxmSGVpZ2h0XG4gICAgICB3aGVuICd0b3AtbGVmdCdcbiAgICAgICAgaW5mb0xlZnQgPSBtYXJrZXJDZW50ZXJYIC0gaVdpZHRoIC0gbUhhbGZXaWR0aCArIGJ1ZmZlclxuICAgICAgICBpbmZvVG9wID0gbWFya2VyQ2VudGVyWSAtIGlIZWlnaHQgLSBtSGFsZkhlaWdodCArIGJ1ZmZlclxuICAgICAgd2hlbiAndG9wLXJpZ2h0J1xuICAgICAgICBpbmZvTGVmdCA9IG1hcmtlckNlbnRlclggKyBtSGFsZldpZHRoIC0gYnVmZmVyXG4gICAgICAgIGluZm9Ub3AgPSBtYXJrZXJDZW50ZXJZIC0gaUhlaWdodCAtIG1IYWxmSGVpZ2h0ICsgYnVmZmVyXG4gICAgICB3aGVuICdib3R0b20tbGVmdCdcbiAgICAgICAgaW5mb0xlZnQgPSBtYXJrZXJDZW50ZXJYIC0gaVdpZHRoIC0gbUhhbGZXaWR0aCArIGJ1ZmZlclxuICAgICAgICBpbmZvVG9wID0gbWFya2VyQ2VudGVyWSArIG1IYWxmSGVpZ2h0IC0gYnVmZmVyXG4gICAgICB3aGVuICdib3R0b20tcmlnaHQnXG4gICAgICAgIGluZm9MZWZ0ID0gbWFya2VyQ2VudGVyWCArIG1IYWxmV2lkdGggLSBidWZmZXJcbiAgICAgICAgaW5mb1RvcCA9IG1hcmtlckNlbnRlclkgKyBtSGFsZkhlaWdodCAtIGJ1ZmZlclxuICAgIGxlZnQ6IGluZm9MZWZ0ICsgb2Zmc2V0WFxuICAgIHRvcDogaW5mb1RvcCArIG9mZnNldFlcblxuICBwb3NpdGlvbkluZm9ib3g6ID0+XG4gICAgY29vcmRzID0gQGluZm9ib3hDb29yZHMoKVxuICAgICQoXCIjI3tAbWFya2VyLmF0dHIoJ2RhdGEtaW5mb2JveCcpfVwiKS5jc3NcbiAgICAgIGxlZnQ6IFwiI3tjb29yZHMubGVmdH1weFwiXG4gICAgICB0b3A6IFwiI3tjb29yZHMudG9wfXB4XCJcbiAgICBAcG9zaXRpb24oKVxuXG4gIGFuaW1hdGVJbmZvYm94OiA9PlxuICAgIGNvb3JkcyA9IEBpbmZvYm94Q29vcmRzKClcbiAgICAkKFwiIyN7QG1hcmtlci5hdHRyKCdkYXRhLWluZm9ib3gnKX1cIikuYW5pbWF0ZVxuICAgICAgbGVmdDogXCIje2Nvb3Jkcy5sZWZ0fXB4XCJcbiAgICAgIHRvcDogXCIje2Nvb3Jkcy50b3B9cHhcIlxuICAgICwgMjUwLCAoKSA9PlxuICAgICAgcmV0dXJuIEBwb3NpdGlvbigpXG5cbiAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRHJhZ2dpbmdcblxuICBpc0RyYWdnYWJsZTogPT5cbiAgICBAbWFya2VyLmhhc0NsYXNzKCdkcmFnZ2FibGUnKVxuXG4gICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFjdGlvbnNcblxuICBzZXQ6ID0+XG4gICAgbGVmdCA9IChAaW1hZ2Uud2lkdGgoKSAqIChAbWFya2VyLmF0dHIoJ2RhdGEteFBjJykgLyAxMDApKSArXG4gICAgICBwYXJzZUZsb2F0KEBpbWFnZS5jc3MoJ2xlZnQnKSkgLSAoQG1hcmtlci5vdXRlcldpZHRoKCkgLyAyKVxuICAgIHRvcCA9IChAaW1hZ2UuaGVpZ2h0KCkgKiAoQG1hcmtlci5hdHRyKCdkYXRhLXlQYycpIC8gMTAwKSkgK1xuICAgICAgcGFyc2VGbG9hdChAaW1hZ2UuY3NzKCd0b3AnKSkgLSAoQG1hcmtlci5vdXRlckhlaWdodCgpIC8gMilcbiAgICBAbWFya2VyLmNzc1xuICAgICAgbGVmdDogXCIje2xlZnR9cHhcIlxuICAgICAgdG9wOiBcIiN7dG9wfXB4XCJcbiAgICBAcG9zaXRpb25JbmZvYm94KClcbiAgICBbbGVmdCwgdG9wXVxuXG4gIHNhdmVQb3NpdGlvbjogPT5cbiAgICBjb29yZHMgPSBAcG9zaXRpb24oKVxuICAgIEBtYXJrZXIuYXR0clxuICAgICAgJ2RhdGEteFBjJzogY29vcmRzWzBdXG4gICAgICAnZGF0YS15UGMnOiBjb29yZHNbMV1cblxuICB1cGRhdGU6IChvcHRpb25zKSA9PlxuICAgIGlmIG9wdGlvbnMuY29sb3JcbiAgICAgIEBtYXJrZXIuY3NzKGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5jb2xvcilcbiAgICBpZiBvcHRpb25zLmluZm9ib3hcbiAgICAgIEBtYXJrZXIuZmluZCgnLnBsYW5pdC1pbmZvYm94JykuaHRtbChvcHRpb25zLmluZm9ib3gpXG4gICAgICBAcG9zaXRpb25JbmZvYm94KClcbiAgICBpZiBvcHRpb25zLmRyYWdnYWJsZVxuICAgICAgQG1hcmtlci5yZW1vdmVDbGFzcygnZHJhZ2dhYmxlJylcbiAgICAgIEBtYXJrZXIuYWRkQ2xhc3MoJ2RyYWdnYWJsZScpIGlmIG9wdGlvbnMuZHJhZ2dhYmxlID09IHRydWVcbiAgICBpZiBvcHRpb25zLmNvb3Jkc1xuICAgICAgbGVmdCA9ICgocGFyc2VGbG9hdChvcHRpb25zLmNvb3Jkc1swXSkgLyAxMDApICogQGNvbnRhaW5lci53aWR0aCgpKSAtIDE1XG4gICAgICB0b3AgPSAoKHBhcnNlRmxvYXQob3B0aW9ucy5jb29yZHNbMV0pIC8gMTAwKSAqIEBjb250YWluZXIuaGVpZ2h0KCkpIC0gMTVcbiAgICAgIEBtYXJrZXIuY3NzXG4gICAgICAgIGxlZnQ6IFwiI3tsZWZ0fXB4XCJcbiAgICAgICAgdG9wOiBcIiN7dG9wfXB4XCJcblxuICByZW1vdmU6ID0+XG4gICAgQGluZm9ib3goKS5yZW1vdmUoKSBpZiBAaW5mb2JveCgpXG4gICAgQG1hcmtlci5yZW1vdmUoKVxuXG5jbGFzcyBQbGFuaXQuTWFya2VyLkV2ZW50c1xuXG4gIGNvbnN0cnVjdG9yOiAoQG9wdGlvbnMpIC0+XG5cbiAgICAjIFNldCBPcHRpb25zXG4gICAgQGNvbnRhaW5lciA9IEBvcHRpb25zLmNvbnRhaW5lclxuICAgIEBtYXJrZXJzQ29udGFpbmVyID0gQGNvbnRhaW5lci5maW5kKFwiLiN7UGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzfVwiKVxuXG4gICAgIyBGaW5kIE1hcmtlclxuICAgIEBtYXJrZXIgPSBAbWFya2Vyc0NvbnRhaW5lci5maW5kKFxuICAgICAgXCIuI3tQbGFuaXQubWFya2VyQ2xhc3N9W2RhdGEtbWFya2VyPScje0BvcHRpb25zLnBsYW5pdElEfSddXCJcbiAgICApLmZpcnN0KClcbiAgICBAbWFya2VyT2JqID0gbmV3IFBsYW5pdC5NYXJrZXIoQGNvbnRhaW5lciwgQG9wdGlvbnMucGxhbml0SUQpXG5cbiAgICAjIERyYWdnYWJsZVxuICAgIGlmIEBvcHRpb25zLmRyYWdnYWJsZVxuICAgICAgQG1hcmtlci5hZGRDbGFzcygnZHJhZ2dhYmxlJylcbiAgICAgIEBtYXJrZXIub24gJ21vdXNlZG93bicsIChlKSA9PlxuICAgICAgICBpZiBlLndoaWNoID09IDFcbiAgICAgICAgICBtYXJrZXIgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcucGxhbml0LW1hcmtlcicpXG4gICAgICAgICAgbWFya2VyLmFkZENsYXNzKCdpcy1kcmFnZ2luZycpXG4gICAgICAgICAgbWFya2VyLmF0dHJcbiAgICAgICAgICAgICdkYXRhLWRyYWctc3RhcnQteCc6IGUucGFnZVhcbiAgICAgICAgICAgICdkYXRhLWRyYWctc3RhcnQteSc6IGUucGFnZVlcblxuICAgICMgSW5mb2JveFxuICAgIGlmIEBvcHRpb25zLmluZm9ib3hcbiAgICAgIGlkID0gUGxhbml0LnJhbmRvbVN0cmluZygxNilcbiAgICAgICMgc2V0IHN0eWxlIG9wdGlvbnMgb24gaW5mb2JveFxuICAgICAgb3B0aW9ucyA9IEBvcHRpb25zLmluZm9ib3hcbiAgICAgIGlmIG9wdGlvbnMucG9zaXRpb24gdGhlbiBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gZWxzZSBwb3NpdGlvbiA9ICd0b3AnXG4gICAgICBpZiBvcHRpb25zLmFycm93IHRoZW4gYXJyb3cgPSB0cnVlIGVsc2UgYXJyb3cgPSBmYWxzZVxuICAgICAgaWYgYXJyb3cgPT0gdHJ1ZSB0aGVuIGFycm93Q2xhc3MgPSAnYXJyb3cnIGVsc2UgYXJyb3dDbGFzcyA9ICcnXG4gICAgICBjbGFzc2VzID0gXCJwbGFuaXQtaW5mb2JveCAje3Bvc2l0aW9ufSAje2Fycm93Q2xhc3N9XCJcbiAgICAgIEBjb250YWluZXIuZmluZChcIi4je1BsYW5pdC5pbmZvYm94Q29udGFpbmVyQ2xhc3N9XCIpLmFwcGVuZCBcIlwiXCJcbiAgICAgICAgPGRpdiBjbGFzcz1cIiN7Y2xhc3Nlc31cIiBpZD1cImluZm8tI3tpZH1cIlxuICAgICAgICAgIGRhdGEtcG9zaXRpb249XCIje3Bvc2l0aW9ufVwiPlxuICAgICAgICAgICAgI3tvcHRpb25zLmh0bWx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAgIFwiXCJcIlxuICAgICAgaWYgb3B0aW9ucy5vZmZzZXRYXG4gICAgICAgIEBjb250YWluZXIuZmluZCgnLnBsYW5pdC1pbmZvYm94JykubGFzdCgpLmF0dHJcbiAgICAgICAgICAnZGF0YS1vZmZzZXQteCc6IG9wdGlvbnMub2Zmc2V0WFxuICAgICAgaWYgb3B0aW9ucy5vZmZzZXRZXG4gICAgICAgIEBjb250YWluZXIuZmluZCgnLnBsYW5pdC1pbmZvYm94JykubGFzdCgpLmF0dHJcbiAgICAgICAgICAnZGF0YS1vZmZzZXQteSc6IG9wdGlvbnMub2Zmc2V0WVxuICAgICAgQG1hcmtlci5hdHRyKCdkYXRhLWluZm9ib3gnLCBcImluZm8tI3tpZH1cIilcbiAgICAgIEBtYXJrZXJPYmoucG9zaXRpb25JbmZvYm94KClcbiAgICAgICMgQG1hcmtlci5jbGljayAoZSkgPT5cbiAgICAgICMgICBpZihcbiAgICAgICMgICAgICFAbWFya2VyLmF0dHIoJ2RhdGEtZHJhZy1zdGFydC14JykgfHxcbiAgICAgICMgICAgICFAbWFya2VyLmF0dHIoJ2RhdGEtZHJhZy1zdGFydC15JykgfHxcbiAgICAgICMgICAgIChcbiAgICAgICMgICAgICAgTWF0aC5hYnMoZS5wYWdlWCAtIEBtYXJrZXIuYXR0cignZGF0YS1kcmFnLXN0YXJ0LXgnKSkgPCAxICYmXG4gICAgICAjICAgICAgIE1hdGguYWJzKGUucGFnZVkgLSBAbWFya2VyLmF0dHIoJ2RhdGEtZHJhZy1zdGFydC15JykpIDwgMVxuICAgICAgIyAgICAgKVxuICAgICAgIyAgIClcbiAgICAgICMgICAgIG1hcmtlciA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5wbGFuaXQtbWFya2VyJylcbiAgICAgICMgICAgICQoXCIjI3ttYXJrZXIuYXR0cignZGF0YS1pbmZvYm94Jyl9XCIpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKVxuXG4gIG1hcmtlcnM6IC0+XG4gICAgQG1hcmtlcnNDb250YWluZXIuZmluZCgnLnBsYW5pdC1tYXJrZXInKVxuXG4gIGRyYWdnaW5nTWFya2VyOiAtPlxuICAgIEBtYXJrZXJzQ29udGFpbmVyLmZpbmQoJy5wbGFuaXQtbWFya2VyLmlzLWRyYWdnaW5nJylcblxuY2xhc3MgUGxhbml0Lk1hcmtlci5DcmVhdG9yXG5cbiAgY29uc3RydWN0b3I6IChAb3B0aW9ucykgLT5cbiAgICAjIFNldCBPcHRpb25zXG4gICAgQGNvbnRhaW5lciA9IEBvcHRpb25zLmNvbnRhaW5lclxuICAgIEBtYXJrZXJzQ29udGFpbmVyID0gQGNvbnRhaW5lci5maW5kKFwiLiN7UGxhbml0Lm1hcmtlckNvbnRhaW5lckNsYXNzfVwiKS5maXJzdCgpXG4gICAgdW5sZXNzIEBvcHRpb25zLnBsYW5pdElEXG4gICAgICBAb3B0aW9ucy5wbGFuaXRJRCA9IFBsYW5pdC5yYW5kb21TdHJpbmcoMjApXG5cbiAgICAjIEFkZCBNYXJrZXJcbiAgICBpZiBAb3B0aW9ucy5jb2xvciB0aGVuIGNvbG9yID0gQG9wdGlvbnMuY29sb3IgZWxzZSBjb2xvciA9ICcjRkM1QjNGJ1xuXG4gICAgbGVmdCA9ICgocGFyc2VGbG9hdChAb3B0aW9ucy5jb29yZHNbMF0pIC8gMTAwKSAqIEBjb250YWluZXIud2lkdGgoKSkgLSAxNVxuICAgIHRvcCA9ICgocGFyc2VGbG9hdChAb3B0aW9ucy5jb29yZHNbMV0pIC8gMTAwKSAqIEBjb250YWluZXIuaGVpZ2h0KCkpIC0gMTVcbiAgICBAbWFya2Vyc0NvbnRhaW5lci5hcHBlbmQoXG4gICAgICAkKCc8ZGl2PjwvZGl2PicpXG4gICAgICAgIC5hZGRDbGFzcygncGxhbml0LW1hcmtlcicpXG4gICAgICAgIC5hdHRyXG4gICAgICAgICAgJ2RhdGEtbWFya2VyJzogQG9wdGlvbnMucGxhbml0SURcbiAgICAgICAgICAnZGF0YS14UGMnOiBAb3B0aW9ucy5jb29yZHNbMF1cbiAgICAgICAgICAnZGF0YS15UGMnOiBAb3B0aW9ucy5jb29yZHNbMV1cbiAgICAgICAgLmNzc1xuICAgICAgICAgIGxlZnQ6IFwiI3tsZWZ0fXB4XCJcbiAgICAgICAgICB0b3A6IFwiI3t0b3B9cHhcIlxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3JcbiAgICApXG4gICAgbWFya2VyID0gQG1hcmtlcnNDb250YWluZXIuZmluZCgnLnBsYW5pdC1tYXJrZXInKS5sYXN0KClcbiAgICBpZiBAb3B0aW9ucy5pZFxuICAgICAgbWFya2VyLmF0dHIoJ2RhdGEtaWQnOiBAb3B0aW9ucy5pZClcbiAgICBpZiBAb3B0aW9ucy5jbGFzc1xuICAgICAgbWFya2VyLmFkZENsYXNzKEBvcHRpb25zLmNsYXNzKVxuICAgIGlmIEBvcHRpb25zLmh0bWxcbiAgICAgIG1hcmtlci5odG1sKEBvcHRpb25zLmh0bWwpXG4gICAgaWYgQG9wdGlvbnMuc2l6ZVxuICAgICAgbWFya2VyLmNzc1xuICAgICAgICB3aWR0aDogXCIje0BvcHRpb25zLnNpemV9cHhcIlxuICAgICAgICBoZWlnaHQ6IFwiI3tAb3B0aW9ucy5zaXplfXB4XCJcblxuICAgICMgQmluZCBFdmVudHMgKGluIGEgc2VwYXJhdGUgY2xhc3MpXG4gICAgbmV3IFBsYW5pdC5NYXJrZXIuRXZlbnRzKEBvcHRpb25zKVxuXG4gICAgIyBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBtYXJrZXJcbiAgICBuZXcgUGxhbml0Lk1hcmtlcihAY29udGFpbmVyLCBAb3B0aW9ucy5wbGFuaXRJRClcbiJdfQ==