PluginProbe
Booking Calendar / 11.2.1
Booking Calendar v11.2.1
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / includes / page-form-builder / preview / _out / bfb-preview.js

bfb-preview.js in Booking Calendar 11.2.1, at includes/page-form-builder/preview/_out/bfb-preview.js

942 lines 112.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 // ---------------------------------------------------------------------------------------------------------------------
4 // == File /includes/page-form-builder/preview/_out/bfb-preview.js
5 // == BFB Preview Client — sends current structure via AJAX and loads preview URL into iframe
6 // ---------------------------------------------------------------------------------------------------------------------
7 (function (w, d) {
8 'use strict';
9
10 /**
11 * Simple logger alias (optional).
12 *
13 * @type {{log:Function, error:Function}}
14 */
15 var dev = w._wpbc && w._wpbc.dev ? w._wpbc.dev : {
16 log: function () {},
17 error: function () {}
18 };
19
20 /**
21 * Preview client class.
22 * Binds to a preview panel root that contains button + iframe.
23 */
24 class wpbc_bfb_preview_client {
25 /**
26 * @param {HTMLElement} root_el Root element of the preview panel.
27 */
28 constructor(root_el) {
29 this.root_el = root_el;
30 this.iframe = root_el.querySelector('[data-wpbc-bfb-preview-iframe="1"]');
31 this.loader = root_el.querySelector('[data-wpbc-bfb-preview-loader="1"]'); // NEW
32 this.button = null; // No local "Update Preview" button in panel anymore.
33
34 this.nonce = root_el.getAttribute('data-preview-nonce') || '';
35 this.is_busy = false;
36 if (!this.iframe) {
37 dev.error('wpbc_bfb_preview_client', 'Missing iframe element');
38 return;
39 }
40 this.bind_events();
41 }
42
43 /**
44 * Show/hide the overlay loader over the iframe.
45 *
46 * @param {boolean} is_visible
47 */
48 set_loader_visible(is_visible) {
49 if (!this.loader) {
50 return;
51 }
52 if (is_visible) {
53 this.loader.classList.add('is-visible');
54 } else {
55 this.loader.classList.remove('is-visible');
56 }
57 }
58
59 /**
60 * Bind UI events (panel-local button, if present).
61 */
62 bind_events() {
63 var self = this;
64 if (!this.button) {
65 return;
66 }
67 this.button.addEventListener('click', function () {
68 self.update_preview();
69 });
70 }
71
72 /**
73 * Get current BFB structure from global builder.
74 *
75 * @returns {Object|null}
76 */
77 get_current_structure() {
78 if (!w.wpbc_bfb || typeof w.wpbc_bfb.get_structure !== 'function') {
79 dev.error('wpbc_bfb_preview_client', 'wpbc_bfb.get_structure() is not available');
80 return null;
81 }
82 try {
83 return w.wpbc_bfb.get_structure();
84 } catch (e) {
85 dev.error('wpbc_bfb_preview_client.get_current_structure', e);
86 return null;
87 }
88 }
89
90 /**
91 * Parse combined length value like "100%", "320px", "12.5rem".
92 *
93 * @param {string} value
94 * @return {{num:string, unit:string}}
95 */
96 parse_length_value(value) {
97 var raw = String(value == null ? '' : value).trim();
98 var m = raw.match(/^\s*(-?\d+(?:\.\d+)?)\s*([a-z%]*)\s*$/i);
99 if (!m) {
100 return {
101 num: raw,
102 unit: ''
103 };
104 }
105 return {
106 num: m[1] || '',
107 unit: m[2] || ''
108 };
109 }
110
111 /**
112 * Build current form settings payload (same structure as real Save):
113 * {
114 * options: { ...source-of-truth... },
115 * css_vars: { ...compiled... }
116 * }
117 *
118 * @param {string} form_name
119 * @returns {{options:Object, css_vars:Object}}
120 */
121 get_current_form_settings(form_name) {
122 var form_settings = {
123 options: {},
124 css_vars: {}
125 };
126
127 // --- same event contract as ajax/_out/bfb-ajax.js ----------------------------------------------
128 wpbc_bfb__dispatch_event_safe('wpbc:bfb:form_settings:collect', {
129 settings: form_settings,
130 form_name: form_name || 'standard'
131 });
132
133 // Strict: require correct shape.
134 if (!form_settings || typeof form_settings !== 'object') {
135 form_settings = {
136 options: {},
137 css_vars: {}
138 };
139 }
140 if (!form_settings.options || typeof form_settings.options !== 'object') {
141 form_settings.options = {};
142 }
143 if (!form_settings.css_vars || typeof form_settings.css_vars !== 'object') {
144 form_settings.css_vars = {};
145 }
146 return form_settings;
147 }
148
149 /**
150 * Get the currently selected calendar skin URL from the Builder page.
151 *
152 * @returns {string}
153 */
154 get_selected_calendar_skin_url() {
155 var select_el = d.querySelector('.js-wpbc-bfb-calendar-skin');
156 if (select_el && select_el.options) {
157 var selected_option = select_el.options[select_el.selectedIndex];
158 if (selected_option) {
159 var selected_url = selected_option.getAttribute('data-wpbc-calendar-skin-url');
160 if (selected_url) {
161 return String(selected_url);
162 }
163 }
164 }
165 var stylesheet = d.getElementById('wpbc-calendar-skin-css');
166 if (stylesheet && stylesheet.href) {
167 return String(stylesheet.href);
168 }
169 return '';
170 }
171
172 /**
173 * Apply the unsaved Builder calendar skin inside the loaded Preview iframe.
174 *
175 * @param {string} skin_url
176 * @param {Function} done
177 * @param {number} tries
178 */
179 apply_calendar_skin_to_iframe(skin_url, done, tries) {
180 var self = this;
181 var attempt_num = Number(tries || 0);
182 if (!skin_url || !this.iframe || !this.iframe.contentWindow) {
183 if (typeof done === 'function') {
184 done();
185 }
186 return;
187 }
188 try {
189 if (typeof this.iframe.contentWindow.wpbc__calendar__change_skin === 'function') {
190 this.iframe.contentWindow.wpbc__calendar__change_skin(skin_url);
191 if (typeof done === 'function') {
192 done();
193 }
194 return;
195 }
196 } catch (e) {
197 dev.error('wpbc_bfb_preview_client.apply_calendar_skin_to_iframe', e);
198 }
199 if (attempt_num >= 20) {
200 if (typeof done === 'function') {
201 done();
202 }
203 return;
204 }
205 w.setTimeout(function () {
206 self.apply_calendar_skin_to_iframe(skin_url, done, attempt_num + 1);
207 }, 100);
208 }
209
210 /**
211 * Send snapshot to server and update iframe src with returned preview URL.
212 *
213 * @param {{source_button?:HTMLElement}} [opts]
214 */
215 update_preview(opts) {
216 if (this.is_busy) {
217 return;
218 }
219 var structure = this.get_current_structure();
220 if (!structure) {
221 return;
222 }
223 this.set_loader_visible(true);
224 var options = opts || {};
225 var source_btn = options.source_button || null;
226 var $source_btn = null;
227 if (source_btn && w.jQuery && typeof w.wpbc_bfb__button_busy_start === 'function') {
228 $source_btn = w.jQuery(source_btn);
229 if ($source_btn && $source_btn.length) {
230 w.wpbc_bfb__button_busy_start($source_btn);
231 }
232 }
233 this.is_busy = true;
234 this.set_button_busy(true); // local "Update Preview" button in the panel
235
236 var payload = new w.FormData();
237 var cfg = w.WPBC_BFB_Ajax || {};
238
239 // Build settings payload (same as real saving).
240 var form_settings = this.get_current_form_settings(cfg.form_name || 'standard');
241 payload.append('action', 'WPBC_AJX_BFB_SAVE_FORM_CONFIG');
242 payload.append('nonce', cfg.nonce_save || this.nonce || '');
243
244 // IMPORTANT:
245 // - form_name is the logical form key (usually 'standard' or selected form)
246 payload.append('form_name', cfg.form_name || 'standard');
247 payload.append('status', 'preview');
248 payload.append('return_preview_url', '1');
249 payload.append('engine', cfg.engine || 'bfb');
250 payload.append('engine_version', cfg.engine_version || '1.0');
251 payload.append('structure', JSON.stringify(structure));
252
253 // Send real settings (options + compiled css_vars).
254 payload.append('settings', JSON.stringify(form_settings));
255
256 // ----------------------------------------------------------------------------
257 // Choose where advanced_form + content_form are taken from (auto|builder|advanced)
258 // ----------------------------------------------------------------------------
259 var preview_source = wpbc_bfb_preview__get_source(cfg, source_btn);
260 payload.append('preview_source', preview_source);
261 var adv = null;
262
263 // 1) Try Advanced Mode text (if selected / auto+dirty)
264 if (preview_source === 'advanced' || preview_source === 'auto') {
265 adv = wpbc_bfb_preview__read_advanced_mode_payload(d, w);
266 var can_use_advanced = preview_source === 'advanced' || preview_source === 'auto' && adv && adv.is_dirty;
267 if (can_use_advanced) {
268 // Forced "advanced" but empty -> fallback to builder export.
269 if (!wpbc_bfb_preview__has_text(adv.advanced_form) && !wpbc_bfb_preview__has_text(adv.content_form)) {
270 if (typeof w.wpbc_admin_show_message === 'function') {
271 w.wpbc_admin_show_message('Advanced Mode is selected, but editors are empty. Using Builder export.', 'warning', 6000);
272 }
273 } else {
274 if (wpbc_bfb_preview__has_text(adv.advanced_form)) {
275 payload.append('advanced_form', adv.advanced_form);
276 }
277 if (wpbc_bfb_preview__has_text(adv.content_form)) {
278 payload.append('content_form', adv.content_form);
279 }
280 }
281 }
282 }
283
284 // 2) If not taken from Advanced Mode -> export from Builder structure (current behavior)
285 var already_has_adv = payload.has && (payload.has('advanced_form') || payload.has('content_form')); // some browsers
286 // support
287 // FormData.has
288
289 // Fallback for old browsers (no FormData.has)
290 if (typeof payload.has !== 'function') {
291 already_has_adv = false; // just try exporter if needed
292 }
293 if (!already_has_adv) {
294 if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.export_all === 'function') {
295 try {
296 var width_combined = form_settings.options.booking_form_layout_width || '';
297 var parsed_width = this.parse_length_value(width_combined);
298 var width_unit = parsed_width.unit ? parsed_width.unit : '%';
299 var export_options = {
300 gapPercent: 3,
301 form_slug: cfg.form_name || 'standard',
302 form_width_value: parsed_width.num,
303 form_width_unit: width_unit
304 };
305 var export_result = w.WPBC_BFB_Exporter.export_all(structure || [], export_options);
306 if (export_result) {
307 if (export_result.advanced_form) {
308 payload.append('advanced_form', export_result.advanced_form);
309 }
310 if (export_result.fields_data) {
311 payload.append('content_form', export_result.fields_data);
312 }
313 }
314 } catch (e) {
315 console.error('WPBC BFB: export_all error', e);
316 }
317 }
318 }
319
320 // Use shared helper if available; fallback to ajaxurl.
321 var ajax_url = '';
322 if (typeof w.wpbc_bfb__get_ajax_url === 'function') {
323 ajax_url = w.wpbc_bfb__get_ajax_url();
324 } else if (typeof w.ajaxurl !== 'undefined' && w.ajaxurl) {
325 ajax_url = w.ajaxurl;
326 }
327 var self = this;
328 var preview_calendar_skin_url = this.get_selected_calendar_skin_url();
329 function end_busy_now() {
330 self._end_busy($source_btn);
331 }
332 if (!ajax_url) {
333 dev.error('wpbc_bfb_preview_client', 'ajax URL is not defined');
334 end_busy_now();
335 return;
336 }
337 w.fetch(ajax_url, {
338 method: 'POST',
339 body: payload
340 }).then(function (response) {
341 return response.json();
342 }).then(function (data) {
343 if (!data || !data.success || !data.data || !data.data.preview_url) {
344 dev.error('wpbc_bfb_preview_client', 'Preview AJAX error', data);
345 end_busy_now();
346 return;
347 }
348 if (!self.iframe) {
349 dev.error('wpbc_bfb_preview_client', 'Missing iframe element');
350 end_busy_now();
351 return;
352 }
353
354 // Wait until iframe has really loaded the preview URL.
355 var on_load = function () {
356 self.iframe.removeEventListener('load', on_load);
357 self.apply_calendar_skin_to_iframe(preview_calendar_skin_url, end_busy_now);
358 };
359 self.iframe.addEventListener('load', on_load);
360 self.iframe.setAttribute('src', data.data.preview_url);
361 }).catch(function (err) {
362 dev.error('wpbc_bfb_preview_client', 'Preview AJAX failed', err);
363 end_busy_now();
364 });
365 }
366
367 /**
368 * Internal helper: stop busy state on panel button + optional top toolbar button.
369 *
370 * @param {jQuery|null} $source_btn
371 * @private
372 */
373 _end_busy($source_btn) {
374 this.is_busy = false;
375 this.set_button_busy(false);
376 this.set_loader_visible(false); // NEW
377
378 if ($source_btn && typeof w.wpbc_bfb__button_busy_end === 'function') {
379 w.wpbc_bfb__button_busy_end($source_btn);
380 }
381 }
382
383 /**
384 * Force-reset any busy states related to preview.
385 * This is called when switching back to Builder mode (soft-cancel UX).
386 */
387 reset_busy_state() {
388 this.is_busy = false;
389 this.set_button_busy(false); // panel button, if any
390 this.set_loader_visible(false); // NEW
391
392 if (w.jQuery && typeof w.wpbc_bfb__button_busy_end === 'function') {
393 // Top toolbar buttons that may show "Loading preview..."
394 var $btns = w.jQuery('[data-wpbc-bfb-top-preview-btn="1"],' + '[data-wpbc-bfb-top-refresh-btn="1"]');
395 $btns.each(function () {
396 var $b = w.jQuery(this);
397 if ($b.hasClass('wpbc-is-busy')) {
398 w.wpbc_bfb__button_busy_end($b);
399 }
400 });
401 }
402 }
403
404 /**
405 * Simple busy indicator for the panel "Update Preview" button.
406 * Reuses global WPBC busy helpers if available, so the spinner matches Save/Load buttons.
407 *
408 * @param {boolean} is_busy
409 */
410 set_button_busy(is_busy) {
411 if (!this.button) {
412 return;
413 }
414
415 // If jQuery + global helpers exist, use same spinner as other toolbar buttons.
416 if (w.jQuery && typeof w.wpbc_bfb__button_busy_start === 'function' && typeof w.wpbc_bfb__button_busy_end === 'function') {
417 var $btn = w.jQuery(this.button);
418 if (is_busy) {
419 w.wpbc_bfb__button_busy_start($btn);
420 } else {
421 w.wpbc_bfb__button_busy_end($btn);
422 }
423 return;
424 }
425
426 // Fallback: simple disabled state without spinner.
427 if (is_busy) {
428 this.button.setAttribute('disabled', 'disabled');
429 this.button.classList.add('wpbc_bfb__preview_btn_busy');
430 } else {
431 this.button.removeAttribute('disabled');
432 this.button.classList.remove('wpbc_bfb__preview_btn_busy');
433 }
434 }
435
436 /**
437 * Set current view mode: "builder" or "preview".
438 * Applies/removes CSS class on <body>.
439 *
440 * @param {('builder'|'preview')} mode
441 */
442 set_mode(mode) {
443 var body = d.body;
444 if (!body) {
445 return;
446 }
447 if (mode === 'preview') {
448 body.classList.add('wpbc_bfb__mode_preview');
449 } else {
450 body.classList.remove('wpbc_bfb__mode_preview');
451 }
452 }
453 }
454
455 // -- Helpers ------------------------------------------------------------------------------------------------------
456 /**
457 * Is Preview mode currently active?
458 * We prefer body class (set by client.set_mode), fallback to active tab id.
459 *
460 * @return {boolean}
461 */
462 function wpbc_bfb_preview__is_preview_mode_active() {
463 var body = d.body;
464 if (body && body.classList && body.classList.contains('wpbc_bfb__mode_preview')) {
465 return true;
466 }
467 return wpbc_bfb_preview__get_active_top_tab_id() === 'preview_tab';
468 }
469
470 /**
471 * When a form is loaded via AJAX while Preview tab is active,
472 * refresh the iframe so it shows the newly loaded form.
473 *
474 * @param {wpbc_bfb_preview_client} client
475 */
476 function wpbc_bfb_preview__bind_form_ajax_loaded_events(client) {
477 if (!client) {
478 return;
479 }
480
481 // Prevent double binding if this script is injected twice.
482 if (w.__wpbc_bfb_preview__form_ajax_loaded_bound === '1') {
483 return;
484 }
485 w.__wpbc_bfb_preview__form_ajax_loaded_bound = '1';
486 var debounce_id = null;
487 d.addEventListener('wpbc:bfb:form:ajax_loaded', function (ev) {
488 // Only do anything if Preview is currently active.
489 if (!wpbc_bfb_preview__is_preview_mode_active()) {
490 return;
491 }
492 var det = ev && ev.detail ? ev.detail : {};
493 var fn = det.form_name ? String(det.form_name) : '';
494
495 // Best-effort: keep cfg.form_name in sync for payload building.
496 if (fn) {
497 w.WPBC_BFB_Ajax = w.WPBC_BFB_Ajax || {};
498 w.WPBC_BFB_Ajax.form_name = fn;
499 }
500
501 // Debounce multiple rapid loads (or secondary events).
502 if (debounce_id) {
503 clearTimeout(debounce_id);
504 }
505 debounce_id = setTimeout(function () {
506 debounce_id = null;
507
508 // Preview might have been left while waiting.
509 if (!wpbc_bfb_preview__is_preview_mode_active()) {
510 return;
511 }
512
513 // If we are already sending preview, don't stack another request.
514 if (client.is_busy) {
515 // Try once more shortly (safe).
516 setTimeout(function () {
517 if (wpbc_bfb_preview__is_preview_mode_active() && !client.is_busy) {
518 client.update_preview({
519 source_button: null
520 });
521 }
522 }, 250);
523 return;
524 }
525
526 // Wait until builder API is present (form load can be async).
527 var tries = 0;
528 (function wait_for_builder() {
529 if (!wpbc_bfb_preview__is_preview_mode_active()) {
530 return;
531 }
532 if (w.wpbc_bfb && typeof w.wpbc_bfb.get_structure === 'function') {
533 client.update_preview({
534 source_button: null
535 });
536 return;
537 }
538 tries++;
539 if (tries < 15) {
540 setTimeout(wait_for_builder, 200);
541 }
542 })();
543 }, 180);
544 }, {
545 passive: true
546 });
547 }
548 function wpbc_bfb_preview__get_source(cfg, btn) {
549 // priority: button attr -> global cfg -> default
550 var v = '';
551 try {
552 if (btn && btn.getAttribute) {
553 v = btn.getAttribute('data-wpbc-bfb-preview-source') || btn.getAttribute('data-wpbc-bfb-save-source') || '';
554 }
555 } catch (e) {}
556 if (!v && cfg && (cfg.preview_source || cfg.save_source)) {
557 v = cfg.preview_source || cfg.save_source;
558 }
559 v = String(v || 'auto').toLowerCase();
560 if (['builder', 'advanced', 'auto'].indexOf(v) === -1) {
561 v = 'builder';
562 }
563 return v;
564 }
565 function wpbc_bfb_preview__has_text(v) {
566 return !!(v && String(v).trim());
567 }
568 function wpbc_bfb_preview__read_advanced_mode_payload(d, w) {
569 // best: API (syncs CodeMirror -> textarea)
570 if (w.wpbc_bfb_advanced_editor_api && typeof w.wpbc_bfb_advanced_editor_api.get_values === 'function') {
571 try {
572 return w.wpbc_bfb_advanced_editor_api.get_values();
573 } catch (e) {}
574 }
575
576 // fallback: read textareas directly
577 var ta_form = d.getElementById('wpbc_bfb__advanced_form_editor');
578 var ta_content = d.getElementById('wpbc_bfb__content_form_editor');
579 return {
580 advanced_form: ta_form ? String(ta_form.value || '') : '',
581 content_form: ta_content ? String(ta_content.value || '') : '',
582 is_dirty: false
583 };
584 }
585
586 /**
587 * Is this element the Preview TAB link in top tabs nav?
588 *
589 * @param {HTMLElement|null} el
590 * @return {boolean}
591 */
592 function wpbc_bfb_preview__is_preview_tab_link(el) {
593 if (!el || !el.getAttribute) {
594 return false;
595 }
596 return el.getAttribute('data-wpbc-bfb-action') === 'panel' && el.getAttribute('data-wpbc-bfb-tab') === 'preview_tab';
597 }
598
599 /**
600 * Is this element the Builder TAB link in top tabs nav?
601 *
602 * @param {HTMLElement|null} el
603 * @return {boolean}
604 */
605 function wpbc_bfb_preview__is_builder_tab_link(el) {
606 if (!el || !el.getAttribute) {
607 return false;
608 }
609 return el.getAttribute('data-wpbc-bfb-action') === 'panel' && el.getAttribute('data-wpbc-bfb-tab') === 'builder_tab';
610 }
611
612 /**
613 * Activate a "panel" tab and show its panel section (scoped).
614 *
615 * Strategy:
616 * 1) Try to click the real top-tab link (best).
617 * 2) If link does not exist (e.g. Preview tab removed from nav), do a scoped manual switch:
618 * - use nav's data-wpbc-bfb-panels-root + data-wpbc-bfb-panel-class
619 * - hide/show ONLY those outer panels
620 * - DO NOT touch inner panels
621 *
622 * @param {string} tab_id
623 * @return {boolean}
624 */
625 function wpbc_bfb__activate_panel_tab(tab_id) {
626 tab_id = String(tab_id || '').trim();
627 if (!tab_id) {
628 return false;
629 }
630
631 // 1) Best: trigger existing top-tabs switching by clicking the tab link (if it exists).
632 var tab_link = d.querySelector('[data-wpbc-bfb-action="panel"][data-wpbc-bfb-tab="' + tab_id + '"]');
633 if (tab_link && typeof tab_link.click === 'function') {
634 try {
635 tab_link.click();
636 return true;
637 } catch (_e) {}
638 }
639
640 // 2) Fallback: scoped manual toggle (outer panels only).
641 var nav = d.getElementById('wpbc_bfb__top_horisontal_nav');
642
643 // Determine outer panels root.
644 var panels_root = d;
645 var panels_root_selector = '';
646 if (nav) {
647 panels_root_selector = nav.getAttribute('data-wpbc-bfb-panels-root') || '';
648 panels_root_selector = String(panels_root_selector || '').trim();
649 }
650
651 // Fallback if attribute missing: prefer #wpbc_bfb__top_panels if present.
652 if (!panels_root_selector) {
653 panels_root_selector = '#wpbc_bfb__top_panels';
654 }
655 if (panels_root_selector) {
656 try {
657 var root_el = d.querySelector(panels_root_selector);
658 if (root_el) {
659 panels_root = root_el;
660 }
661 } catch (_e2) {}
662 }
663
664 // Determine outer base class (IMPORTANT: must be the OUTER base, not wpbc_bfb__tab_section).
665 var panel_base_class = 'wpbc_bfb__top_tab_section';
666 if (nav) {
667 var from_nav = nav.getAttribute('data-wpbc-bfb-panel-class') || '';
668 from_nav = String(from_nav || '').trim();
669 if (from_nav) {
670 panel_base_class = from_nav;
671 }
672 }
673
674 // Update active tab on nav (source of truth).
675 if (nav) {
676 nav.setAttribute('data-active-tab', tab_id);
677 }
678
679 // Hide ONLY outer panels (scoped by base class).
680 var selector_all = '.' + panel_base_class;
681 var panel_nodes = panels_root.querySelectorAll(selector_all);
682 for (var i = 0; i < panel_nodes.length; i++) {
683 panel_nodes[i].style.display = 'none';
684 }
685
686 // Show requested outer panel.
687 var selector_active = '.' + panel_base_class + '__' + tab_id;
688 var active_panel = panels_root.querySelector(selector_active);
689 if (!active_panel) {
690 // Backward-compatible fallback (if someone forgot to add outer classes).
691 active_panel = panels_root.querySelector('.wpbc_bfb__tab_section__' + tab_id);
692 }
693 if (active_panel) {
694 active_panel.style.display = '';
695 }
696
697 // Mark active item in outer nav if it exists (Preview can be missing).
698 if (nav) {
699 var items = nav.querySelectorAll('.wpbc_ui_el__horis_nav_item');
700 for (var j = 0; j < items.length; j++) {
701 items[j].classList.remove('active');
702 }
703 var active_item = nav.querySelector('.wpbc_ui_el__horis_nav_item__' + tab_id);
704 if (active_item) {
705 active_item.classList.add('active');
706 }
707 }
708
709 // Emit same event as bfb-top-tabs.js so other modules stay in sync.
710 try {
711 d.dispatchEvent(new CustomEvent('wpbc:bfb:top-tab', {
712 detail: {
713 tab: tab_id,
714 nav_id: nav && nav.id ? String(nav.id) : ''
715 }
716 }));
717 } catch (_e3) {}
718 return true;
719 }
720
721 /**
722 * Get currently active top tab id from the nav container.
723 *
724 * @return {string}
725 */
726 function wpbc_bfb_preview__get_active_top_tab_id() {
727 var nav = d.getElementById('wpbc_bfb__top_horisontal_nav');
728 if (!nav) {
729 return '';
730 }
731 return nav.getAttribute('data-active-tab') || '';
732 }
733
734 /**
735 * Sync preview "mode" with currently active top tab.
736 *
737 * Rules:
738 * - preview_tab => enable preview mode (buttons make sense)
739 * - any other tab => disable preview mode + reset busy states
740 *
741 * IMPORTANT:
742 * - We do NOT change the active top tab here (no panel switching).
743 * We only sync preview UI mode.
744 *
745 * @param {string} tab_id
746 * @param {wpbc_bfb_preview_client} client
747 */
748 function wpbc_bfb_preview__sync_mode_to_tab(tab_id, client) {
749 tab_id = String(tab_id || '');
750 if (!client) {
751 return;
752 }
753 if ('preview_tab' === tab_id) {
754 client.set_mode('preview');
755 return;
756 }
757
758 // Leaving preview -> soft-cancel busy state and hide preview-specific toolbar.
759 if (typeof client.reset_busy_state === 'function') {
760 client.reset_busy_state();
761 }
762 client.set_mode('builder');
763 }
764
765 /**
766 * Bind to top-tab switch event emitted by bfb-top-tabs.js.
767 *
768 * @param {wpbc_bfb_preview_client} client
769 */
770 function wpbc_bfb_preview__bind_top_tab_events(client) {
771 // Sync immediately (in case event already fired before this script init).
772 wpbc_bfb_preview__sync_mode_to_tab(wpbc_bfb_preview__get_active_top_tab_id(), client);
773
774 // React to future tab changes.
775 d.addEventListener('wpbc:bfb:top-tab', function (ev) {
776 var det = ev && ev.detail ? ev.detail : {};
777 var tab_id = det.tab ? String(det.tab) : '';
778 var nav_id = det.nav_id ? String(det.nav_id) : '';
779 var prev_id = det.prev_tab ? String(det.prev_tab) : '';
780
781 // If user switched to preview_tab in the MAIN top nav,
782 // remember what tab they came from.
783 if (nav_id === TOP_NAV_ID && tab_id === 'preview_tab' && prev_id && prev_id !== 'preview_tab') {
784 return_tab_id = prev_id;
785 }
786 wpbc_bfb_preview__sync_mode_to_tab(tab_id, client);
787 });
788 }
789
790 // -- Bind | Init on Load ------------------------------------------------------------------------------------------
791 var TOP_NAV_ID = 'wpbc_bfb__top_horisontal_nav';
792 var return_tab_id = 'builder_tab';
793 function remember_return_tab_from_dom() {
794 var cur = wpbc_bfb_preview__get_active_top_tab_id();
795 if (cur && cur !== 'preview_tab') {
796 return_tab_id = cur;
797 }
798 }
799 function get_return_tab_id() {
800 var t = String(return_tab_id || '').trim();
801 if (!t || t === 'preview_tab') t = 'builder_tab';
802 return t;
803 }
804
805 /**
806 * Auto-init preview client on Builder page and wire top toolbar buttons.
807 */
808 function wpbc_bfb_init_preview_client() {
809 var root = d.querySelector('[data-wpbc-bfb-preview-root="1"]');
810 if (!root) {
811 return;
812 }
813 var client = new wpbc_bfb_preview_client(root);
814 if (!w.WPBC_BFB_Preview) {
815 w.WPBC_BFB_Preview = {
816 client: client,
817 show_preview: function (opts) {
818 var opt = opts || {};
819 var src = opt.source_button || null;
820
821 // Remember where we were BEFORE switching to preview.
822 remember_return_tab_from_dom();
823 if (!wpbc_bfb_preview__is_preview_tab_link(src)) {
824 wpbc_bfb__activate_panel_tab('preview_tab');
825 }
826
827 // Enable preview mode UI (shows refresh/back buttons etc).
828 client.set_mode('preview');
829
830 // IMPORTANT: Always regenerate when show_preview() is called (Preview tab click included).
831 client.update_preview({
832 source_button: src
833 });
834 },
835 show_builder: function (opts) {
836 var opt = opts || {};
837 var src = opt.source_button || null;
838 if (client && typeof client.reset_busy_state === 'function') {
839 client.reset_busy_state();
840 }
841 var back_to = get_return_tab_id();
842
843 // If Back button itself is not a real tab link -> just activate remembered tab.
844 // If activation fails (tab removed), fallback to builder_tab.
845 if (!wpbc_bfb_preview__is_builder_tab_link(src)) {
846 if (!wpbc_bfb__activate_panel_tab(back_to)) {
847 wpbc_bfb__activate_panel_tab('builder_tab');
848 }
849 }
850 client.set_mode('builder');
851 },
852 show_advanced_tab: function (opts) {
853 var opt = opts || {};
854 if (client && typeof client.reset_busy_state === 'function') {
855 client.reset_busy_state();
856 }
857 wpbc_bfb__activate_panel_tab('advanced_tab');
858 client.set_mode('builder');
859 }
860 };
861 }
862
863 // Listen for top-tab changes and sync preview mode automatically.
864 wpbc_bfb_preview__bind_top_tab_events(client);
865
866 // When a form is loaded via AJAX, refresh preview (only if preview mode is active).
867 wpbc_bfb_preview__bind_form_ajax_loaded_events(client);
868 wpbc_bfb_bind_top_toolbar_buttons(client);
869 }
870
871 /**
872 * Bind top toolbar Builder / Preview / Refresh buttons.
873 * Supports multiple elements for each action (toolbar buttons, top tabs, etc.)
874 * via data-wpbc-bfb-top-*-btn="1".
875 */
876 function wpbc_bfb_bind_top_toolbar_buttons(client) {
877 var btn_preview_list = d.querySelectorAll('[data-wpbc-bfb-top-preview-btn="1"]');
878 var btn_builder_list = d.querySelectorAll('[data-wpbc-bfb-top-builder-btn="1"]');
879 var btn_refresh_list = d.querySelectorAll('[data-wpbc-bfb-top-refresh-btn="1"]');
880 function for_each_node(list, cb) {
881 if (!list || !list.length) {
882 return;
883 }
884 Array.prototype.forEach.call(list, function (el) {
885 if (el && typeof cb === 'function') {
886 cb(el);
887 }
888 });
889 }
890 for_each_node(btn_preview_list, function (btn_preview) {
891 // Prevent double binding if this script runs twice.
892 if (btn_preview.getAttribute('data-wpbc-bfb-bound') === '1') {
893 return;
894 }
895 btn_preview.setAttribute('data-wpbc-bfb-bound', '1');
896 btn_preview.addEventListener('click', function (e) {
897 e.preventDefault();
898 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_preview === 'function') {
899 w.WPBC_BFB_Preview.show_preview({
900 source_button: btn_preview
901 });
902 }
903 });
904 });
905 for_each_node(btn_refresh_list, function (btn_refresh) {
906 if (btn_refresh.getAttribute('data-wpbc-bfb-bound') === '1') {
907 return;
908 }
909 btn_refresh.setAttribute('data-wpbc-bfb-bound', '1');
910 btn_refresh.addEventListener('click', function (e) {
911 e.preventDefault();
912 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_preview === 'function') {
913 w.WPBC_BFB_Preview.show_preview({
914 update: true,
915 source_button: btn_refresh
916 });
917 }
918 });
919 });
920 for_each_node(btn_builder_list, function (btn_builder) {
921 if (btn_builder.getAttribute('data-wpbc-bfb-bound') === '1') {
922 return;
923 }
924 btn_builder.setAttribute('data-wpbc-bfb-bound', '1');
925 btn_builder.addEventListener('click', function (e) {
926 e.preventDefault();
927 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_builder === 'function') {
928 w.WPBC_BFB_Preview.show_builder({
929 source_button: btn_builder
930 });
931 }
932 });
933 });
934 }
935 if (d.readyState === 'complete' || d.readyState === 'interactive') {
936 setTimeout(wpbc_bfb_init_preview_client, 0);
937 } else {
938 d.addEventListener('DOMContentLoaded', wpbc_bfb_init_preview_client);
939 }
940 })(window, document);
941 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvcHJldmlldy9fb3V0L2JmYi1wcmV2aWV3LmpzIiwibmFtZXMiOlsidyIsImQiLCJkZXYiLCJfd3BiYyIsImxvZyIsImVycm9yIiwid3BiY19iZmJfcHJldmlld19jbGllbnQiLCJjb25zdHJ1Y3RvciIsInJvb3RfZWwiLCJpZnJhbWUiLCJxdWVyeVNlbGVjdG9yIiwibG9hZGVyIiwiYnV0dG9uIiwibm9uY2UiLCJnZXRBdHRyaWJ1dGUiLCJpc19idXN5IiwiYmluZF9ldmVudHMiLCJzZXRfbG9hZGVyX3Zpc2libGUiLCJpc192aXNpYmxlIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwic2VsZiIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVfcHJldmlldyIsImdldF9jdXJyZW50X3N0cnVjdHVyZSIsIndwYmNfYmZiIiwiZ2V0X3N0cnVjdHVyZSIsImUiLCJwYXJzZV9sZW5ndGhfdmFsdWUiLCJ2YWx1ZSIsInJhdyIsIlN0cmluZyIsInRyaW0iLCJtIiwibWF0Y2giLCJudW0iLCJ1bml0IiwiZ2V0X2N1cnJlbnRfZm9ybV9zZXR0aW5ncyIsImZvcm1fbmFtZSIsImZvcm1fc2V0dGluZ3MiLCJvcHRpb25zIiwiY3NzX3ZhcnMiLCJ3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSIsInNldHRpbmdzIiwiZ2V0X3NlbGVjdGVkX2NhbGVuZGFyX3NraW5fdXJsIiwic2VsZWN0X2VsIiwic2VsZWN0ZWRfb3B0aW9uIiwic2VsZWN0ZWRJbmRleCIsInNlbGVjdGVkX3VybCIsInN0eWxlc2hlZXQiLCJnZXRFbGVtZW50QnlJZCIsImhyZWYiLCJhcHBseV9jYWxlbmRhcl9za2luX3RvX2lmcmFtZSIsInNraW5fdXJsIiwiZG9uZSIsInRyaWVzIiwiYXR0ZW1wdF9udW0iLCJOdW1iZXIiLCJjb250ZW50V2luZG93Iiwid3BiY19fY2FsZW5kYXJfX2NoYW5nZV9za2luIiwic2V0VGltZW91dCIsIm9wdHMiLCJzdHJ1Y3R1cmUiLCJzb3VyY2VfYnRuIiwic291cmNlX2J1dHRvbiIsIiRzb3VyY2VfYnRuIiwialF1ZXJ5Iiwid3BiY19iZmJfX2J1dHRvbl9idXN5X3N0YXJ0IiwibGVuZ3RoIiwic2V0X2J1dHRvbl9idXN5IiwicGF5bG9hZCIsIkZvcm1EYXRhIiwiY2ZnIiwiV1BCQ19CRkJfQWpheCIsImFwcGVuZCIsIm5vbmNlX3NhdmUiLCJlbmdpbmUiLCJlbmdpbmVfdmVyc2lvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJwcmV2aWV3X3NvdXJjZSIsIndwYmNfYmZiX3ByZXZpZXdfX2dldF9zb3VyY2UiLCJhZHYiLCJ3cGJjX2JmYl9wcmV2aWV3X19yZWFkX2FkdmFuY2VkX21vZGVfcGF5bG9hZCIsImNhbl91c2VfYWR2YW5jZWQiLCJpc19kaXJ0eSIsIndwYmNfYmZiX3ByZXZpZXdfX2hhc190ZXh0IiwiYWR2YW5jZWRfZm9ybSIsImNvbnRlbnRfZm9ybSIsIndwYmNfYWRtaW5fc2hvd19tZXNzYWdlIiwiYWxyZWFkeV9oYXNfYWR2IiwiaGFzIiwiV1BCQ19CRkJfRXhwb3J0ZXIiLCJleHBvcnRfYWxsIiwid2lkdGhfY29tYmluZWQiLCJib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoIiwicGFyc2VkX3dpZHRoIiwid2lkdGhfdW5pdCIsImV4cG9ydF9vcHRpb25zIiwiZ2FwUGVyY2VudCIsImZvcm1fc2x1ZyIsImZvcm1fd2lkdGhfdmFsdWUiLCJmb3JtX3dpZHRoX3VuaXQiLCJleHBvcnRfcmVzdWx0IiwiZmllbGRzX2RhdGEiLCJjb25zb2xlIiwiYWpheF91cmwiLCJ3cGJjX2JmYl9fZ2V0X2FqYXhfdXJsIiwiYWpheHVybCIsInByZXZpZXdfY2FsZW5kYXJfc2tpbl91cmwiLCJlbmRfYnVzeV9ub3ciLCJfZW5kX2J1c3kiLCJmZXRjaCIsIm1ldGhvZCIsImJvZHkiLCJ0aGVuIiwicmVzcG9uc2UiLCJqc29uIiwiZGF0YSIsInN1Y2Nlc3MiLCJwcmV2aWV3X3VybCIsIm9uX2xvYWQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXR0cmlidXRlIiwiY2F0Y2giLCJlcnIiLCJ3cGJjX2JmYl9fYnV0dG9uX2J1c3lfZW5kIiwicmVzZXRfYnVzeV9zdGF0ZSIsIiRidG5zIiwiZWFjaCIsIiRiIiwiaGFzQ2xhc3MiLCIkYnRuIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0X21vZGUiLCJtb2RlIiwid3BiY19iZmJfcHJldmlld19faXNfcHJldmlld19tb2RlX2FjdGl2ZSIsImNvbnRhaW5zIiwid3BiY19iZmJfcHJldmlld19fZ2V0X2FjdGl2ZV90b3BfdGFiX2lkIiwid3BiY19iZmJfcHJldmlld19fYmluZF9mb3JtX2FqYXhfbG9hZGVkX2V2ZW50cyIsImNsaWVudCIsIl9fd3BiY19iZmJfcHJldmlld19fZm9ybV9hamF4X2xvYWRlZF9ib3VuZCIsImRlYm91bmNlX2lkIiwiZXYiLCJkZXQiLCJkZXRhaWwiLCJmbiIsImNsZWFyVGltZW91dCIsIndhaXRfZm9yX2J1aWxkZXIiLCJwYXNzaXZlIiwiYnRuIiwidiIsInNhdmVfc291cmNlIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwid3BiY19iZmJfYWR2YW5jZWRfZWRpdG9yX2FwaSIsImdldF92YWx1ZXMiLCJ0YV9mb3JtIiwidGFfY29udGVudCIsIndwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfdGFiX2xpbmsiLCJlbCIsIndwYmNfYmZiX3ByZXZpZXdfX2lzX2J1aWxkZXJfdGFiX2xpbmsiLCJ3cGJjX2JmYl9fYWN0aXZhdGVfcGFuZWxfdGFiIiwidGFiX2lkIiwidGFiX2xpbmsiLCJjbGljayIsIl9lIiwibmF2IiwicGFuZWxzX3Jvb3QiLCJwYW5lbHNfcm9vdF9zZWxlY3RvciIsIl9lMiIsInBhbmVsX2Jhc2VfY2xhc3MiLCJmcm9tX25hdiIsInNlbGVjdG9yX2FsbCIsInBhbmVsX25vZGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImkiLCJzdHlsZSIsImRpc3BsYXkiLCJzZWxlY3Rvcl9hY3RpdmUiLCJhY3RpdmVfcGFuZWwiLCJpdGVtcyIsImoiLCJhY3RpdmVfaXRlbSIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInRhYiIsIm5hdl9pZCIsImlkIiwiX2UzIiwid3BiY19iZmJfcHJldmlld19fc3luY19tb2RlX3RvX3RhYiIsIndwYmNfYmZiX3ByZXZpZXdfX2JpbmRfdG9wX3RhYl9ldmVudHMiLCJwcmV2X2lkIiwicHJldl90YWIiLCJUT1BfTkFWX0lEIiwicmV0dXJuX3RhYl9pZCIsInJlbWVtYmVyX3JldHVybl90YWJfZnJvbV9kb20iLCJjdXIiLCJnZXRfcmV0dXJuX3RhYl9pZCIsInQiLCJ3cGJjX2JmYl9pbml0X3ByZXZpZXdfY2xpZW50Iiwicm9vdCIsIldQQkNfQkZCX1ByZXZpZXciLCJzaG93X3ByZXZpZXciLCJvcHQiLCJzcmMiLCJzaG93X2J1aWxkZXIiLCJiYWNrX3RvIiwic2hvd19hZHZhbmNlZF90YWIiLCJ3cGJjX2JmYl9iaW5kX3RvcF90b29sYmFyX2J1dHRvbnMiLCJidG5fcHJldmlld19saXN0IiwiYnRuX2J1aWxkZXJfbGlzdCIsImJ0bl9yZWZyZXNoX2xpc3QiLCJmb3JfZWFjaF9ub2RlIiwibGlzdCIsImNiIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJmb3JFYWNoIiwiY2FsbCIsImJ0bl9wcmV2aWV3IiwicHJldmVudERlZmF1bHQiLCJidG5fcmVmcmVzaCIsInVwZGF0ZSIsImJ0bl9idWlsZGVyIiwicmVhZHlTdGF0ZSIsIndpbmRvdyIsImRvY3VtZW50Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvcHJldmlldy9fc3JjL2JmYi1wcmV2aWV3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyA9PSBGaWxlICAvaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvcHJldmlldy9fb3V0L2JmYi1wcmV2aWV3LmpzXHJcbi8vID09IEJGQiBQcmV2aWV3IENsaWVudCDigJQgc2VuZHMgY3VycmVudCBzdHJ1Y3R1cmUgdmlhIEFKQVggYW5kIGxvYWRzIHByZXZpZXcgVVJMIGludG8gaWZyYW1lXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKHcsIGQpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbXBsZSBsb2dnZXIgYWxpYXMgKG9wdGlvbmFsKS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHt7bG9nOkZ1bmN0aW9uLCBlcnJvcjpGdW5jdGlvbn19XHJcblx0ICovXHJcblx0dmFyIGRldiA9ICh3Ll93cGJjICYmIHcuX3dwYmMuZGV2KSA/IHcuX3dwYmMuZGV2IDoge1xyXG5cdFx0bG9nOiBmdW5jdGlvbiAoKSB7fSxcclxuXHRcdGVycm9yOiBmdW5jdGlvbiAoKSB7fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZXZpZXcgY2xpZW50IGNsYXNzLlxyXG5cdCAqIEJpbmRzIHRvIGEgcHJldmlldyBwYW5lbCByb290IHRoYXQgY29udGFpbnMgYnV0dG9uICsgaWZyYW1lLlxyXG5cdCAqL1xyXG5cdGNsYXNzIHdwYmNfYmZiX3ByZXZpZXdfY2xpZW50IHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvb3RfZWwgUm9vdCBlbGVtZW50IG9mIHRoZSBwcmV2aWV3IHBhbmVsLlxyXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3Rvcihyb290X2VsKSB7XHJcblx0XHRcdHRoaXMucm9vdF9lbCA9IHJvb3RfZWw7XHJcblx0XHRcdHRoaXMuaWZyYW1lICA9IHJvb3RfZWwucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtYmZiLXByZXZpZXctaWZyYW1lPVwiMVwiXScgKTtcclxuXHRcdFx0dGhpcy5sb2FkZXIgID0gcm9vdF9lbC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1iZmItcHJldmlldy1sb2FkZXI9XCIxXCJdJyApOyAvLyBORVdcclxuXHRcdFx0dGhpcy5idXR0b24gID0gbnVsbDsgLy8gTm8gbG9jYWwgXCJVcGRhdGUgUHJldmlld1wiIGJ1dHRvbiBpbiBwYW5lbCBhbnltb3JlLlxyXG5cclxuXHRcdFx0dGhpcy5ub25jZSAgID0gcm9vdF9lbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXByZXZpZXctbm9uY2UnICkgfHwgJyc7XHJcblx0XHRcdHRoaXMuaXNfYnVzeSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYgKCAhdGhpcy5pZnJhbWUgKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnTWlzc2luZyBpZnJhbWUgZWxlbWVudCcgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYmluZF9ldmVudHMoKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaG93L2hpZGUgdGhlIG92ZXJsYXkgbG9hZGVyIG92ZXIgdGhlIGlmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzX3Zpc2libGVcclxuXHRcdCAqL1xyXG5cdFx0c2V0X2xvYWRlcl92aXNpYmxlKGlzX3Zpc2libGUpIHtcclxuXHRcdFx0aWYgKCAhdGhpcy5sb2FkZXIgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggaXNfdmlzaWJsZSApIHtcclxuXHRcdFx0XHR0aGlzLmxvYWRlci5jbGFzc0xpc3QuYWRkKCAnaXMtdmlzaWJsZScgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmxvYWRlci5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtdmlzaWJsZScgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQmluZCBVSSBldmVudHMgKHBhbmVsLWxvY2FsIGJ1dHRvbiwgaWYgcHJlc2VudCkuXHJcblx0XHQgKi9cclxuXHRcdGJpbmRfZXZlbnRzKCkge1xyXG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAoICEgdGhpcy5idXR0b24gKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0c2VsZi51cGRhdGVfcHJldmlldygpO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHZXQgY3VycmVudCBCRkIgc3RydWN0dXJlIGZyb20gZ2xvYmFsIGJ1aWxkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybnMge09iamVjdHxudWxsfVxyXG5cdFx0ICovXHJcblx0XHRnZXRfY3VycmVudF9zdHJ1Y3R1cmUoKSB7XHJcblx0XHRcdGlmICggISB3LndwYmNfYmZiIHx8IHR5cGVvZiB3LndwYmNfYmZiLmdldF9zdHJ1Y3R1cmUgIT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnd3BiY19iZmIuZ2V0X3N0cnVjdHVyZSgpIGlzIG5vdCBhdmFpbGFibGUnICk7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0cmV0dXJuIHcud3BiY19iZmIuZ2V0X3N0cnVjdHVyZSgpO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQuZ2V0X2N1cnJlbnRfc3RydWN0dXJlJywgZSApO1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBQYXJzZSBjb21iaW5lZCBsZW5ndGggdmFsdWUgbGlrZSBcIjEwMCVcIiwgXCIzMjBweFwiLCBcIjEyLjVyZW1cIi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcclxuXHRcdCAqIEByZXR1cm4ge3tudW06c3RyaW5nLCB1bml0OnN0cmluZ319XHJcblx0XHQgKi9cclxuXHRcdHBhcnNlX2xlbmd0aF92YWx1ZSh2YWx1ZSkge1xyXG5cdFx0XHR2YXIgcmF3ID0gU3RyaW5nKHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlKS50cmltKCk7XHJcblx0XHRcdHZhciBtID0gcmF3Lm1hdGNoKC9eXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pXFxzKihbYS16JV0qKVxccyokL2kpO1xyXG5cdFx0XHRpZiAoIW0pIHtcclxuXHRcdFx0XHRyZXR1cm4geyBudW06IHJhdywgdW5pdDogJycgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4geyBudW06IChtWzFdIHx8ICcnKSwgdW5pdDogKG1bMl0gfHwgJycpIH07XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCdWlsZCBjdXJyZW50IGZvcm0gc2V0dGluZ3MgcGF5bG9hZCAoc2FtZSBzdHJ1Y3R1cmUgYXMgcmVhbCBTYXZlKTpcclxuXHRcdCAqIHtcclxuXHRcdCAqICAgb3B0aW9uczogeyAuLi5zb3VyY2Utb2YtdHJ1dGguLi4gfSxcclxuXHRcdCAqICAgY3NzX3ZhcnM6IHsgLi4uY29tcGlsZWQuLi4gfVxyXG5cdFx0ICogfVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtX25hbWVcclxuXHRcdCAqIEByZXR1cm5zIHt7b3B0aW9uczpPYmplY3QsIGNzc192YXJzOk9iamVjdH19XHJcblx0XHQgKi9cclxuXHRcdGdldF9jdXJyZW50X2Zvcm1fc2V0dGluZ3MoZm9ybV9uYW1lKSB7XHJcblxyXG5cdFx0XHR2YXIgZm9ybV9zZXR0aW5ncyA9IHtcclxuXHRcdFx0XHRvcHRpb25zIDoge30sXHJcblx0XHRcdFx0Y3NzX3ZhcnM6IHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyAtLS0gc2FtZSBldmVudCBjb250cmFjdCBhcyBhamF4L19vdXQvYmZiLWFqYXguanMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSggJ3dwYmM6YmZiOmZvcm1fc2V0dGluZ3M6Y29sbGVjdCcsIHtcclxuXHRcdFx0XHRzZXR0aW5ncyA6IGZvcm1fc2V0dGluZ3MsXHJcblx0XHRcdFx0Zm9ybV9uYW1lOiBmb3JtX25hbWUgfHwgJ3N0YW5kYXJkJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBTdHJpY3Q6IHJlcXVpcmUgY29ycmVjdCBzaGFwZS5cclxuXHRcdFx0aWYgKCAhZm9ybV9zZXR0aW5ncyB8fCB0eXBlb2YgZm9ybV9zZXR0aW5ncyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdFx0Zm9ybV9zZXR0aW5ncyA9IHsgb3B0aW9uczoge30sIGNzc192YXJzOiB7fSB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggIWZvcm1fc2V0dGluZ3Mub3B0aW9ucyB8fCB0eXBlb2YgZm9ybV9zZXR0aW5ncy5vcHRpb25zICE9PSAnb2JqZWN0JyApIHtcclxuXHRcdFx0XHRmb3JtX3NldHRpbmdzLm9wdGlvbnMgPSB7fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoICFmb3JtX3NldHRpbmdzLmNzc192YXJzIHx8IHR5cGVvZiBmb3JtX3NldHRpbmdzLmNzc192YXJzICE9PSAnb2JqZWN0JyApIHtcclxuXHRcdFx0XHRmb3JtX3NldHRpbmdzLmNzc192YXJzID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmb3JtX3NldHRpbmdzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2FsZW5kYXIgc2tpbiBVUkwgZnJvbSB0aGUgQnVpbGRlciBwYWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdGdldF9zZWxlY3RlZF9jYWxlbmRhcl9za2luX3VybCgpIHtcclxuXHRcdFx0dmFyIHNlbGVjdF9lbCA9IGQucXVlcnlTZWxlY3RvciggJy5qcy13cGJjLWJmYi1jYWxlbmRhci1za2luJyApO1xyXG5cdFx0XHRpZiAoIHNlbGVjdF9lbCAmJiBzZWxlY3RfZWwub3B0aW9ucyApIHtcclxuXHRcdFx0XHR2YXIgc2VsZWN0ZWRfb3B0aW9uID0gc2VsZWN0X2VsLm9wdGlvbnNbIHNlbGVjdF9lbC5zZWxlY3RlZEluZGV4IF07XHJcblx0XHRcdFx0aWYgKCBzZWxlY3RlZF9vcHRpb24gKSB7XHJcblx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRfdXJsID0gc2VsZWN0ZWRfb3B0aW9uLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1jYWxlbmRhci1za2luLXVybCcgKTtcclxuXHRcdFx0XHRcdGlmICggc2VsZWN0ZWRfdXJsICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKCBzZWxlY3RlZF91cmwgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBzdHlsZXNoZWV0ID0gZC5nZXRFbGVtZW50QnlJZCggJ3dwYmMtY2FsZW5kYXItc2tpbi1jc3MnICk7XHJcblx0XHRcdGlmICggc3R5bGVzaGVldCAmJiBzdHlsZXNoZWV0LmhyZWYgKSB7XHJcblx0XHRcdFx0cmV0dXJuIFN0cmluZyggc3R5bGVzaGVldC5ocmVmICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFwcGx5IHRoZSB1bnNhdmVkIEJ1aWxkZXIgY2FsZW5kYXIgc2tpbiBpbnNpZGUgdGhlIGxvYWRlZCBQcmV2aWV3IGlmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc2tpbl91cmxcclxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB0cmllc1xyXG5cdFx0ICovXHJcblx0XHRhcHBseV9jYWxlbmRhcl9za2luX3RvX2lmcmFtZShza2luX3VybCwgZG9uZSwgdHJpZXMpIHtcclxuXHRcdFx0dmFyIHNlbGYgICAgICAgID0gdGhpcztcclxuXHRcdFx0dmFyIGF0dGVtcHRfbnVtID0gTnVtYmVyKCB0cmllcyB8fCAwICk7XHJcblxyXG5cdFx0XHRpZiAoICEgc2tpbl91cmwgfHwgISB0aGlzLmlmcmFtZSB8fCAhIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cgKSB7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdGRvbmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGlmICggdHlwZW9mIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cud3BiY19fY2FsZW5kYXJfX2NoYW5nZV9za2luID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0dGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy53cGJjX19jYWxlbmRhcl9fY2hhbmdlX3NraW4oIHNraW5fdXJsICk7XHJcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRkb25lKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRkZXYuZXJyb3IoICd3cGJjX2JmYl9wcmV2aWV3X2NsaWVudC5hcHBseV9jYWxlbmRhcl9za2luX3RvX2lmcmFtZScsIGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBhdHRlbXB0X251bSA+PSAyMCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBkb25lID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0ZG9uZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHcuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHNlbGYuYXBwbHlfY2FsZW5kYXJfc2tpbl90b19pZnJhbWUoIHNraW5fdXJsLCBkb25lLCBhdHRlbXB0X251bSArIDEgKTtcclxuXHRcdFx0fSwgMTAwICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZW5kIHNuYXBzaG90IHRvIHNlcnZlciBhbmQgdXBkYXRlIGlmcmFtZSBzcmMgd2l0aCByZXR1cm5lZCBwcmV2aWV3IFVSTC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3tzb3VyY2VfYnV0dG9uPzpIVE1MRWxlbWVudH19IFtvcHRzXVxyXG5cdFx0ICovXHJcblx0XHR1cGRhdGVfcHJldmlldyggb3B0cyApIHtcclxuXHRcdFx0aWYgKCB0aGlzLmlzX2J1c3kgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgc3RydWN0dXJlID0gdGhpcy5nZXRfY3VycmVudF9zdHJ1Y3R1cmUoKTtcclxuXHRcdFx0aWYgKCAhIHN0cnVjdHVyZSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2V0X2xvYWRlcl92aXNpYmxlKCB0cnVlICk7XHJcblxyXG5cdFx0XHR2YXIgb3B0aW9ucyAgICA9IG9wdHMgfHwge307XHJcblx0XHRcdHZhciBzb3VyY2VfYnRuID0gb3B0aW9ucy5zb3VyY2VfYnV0dG9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHR2YXIgJHNvdXJjZV9idG4gPSBudWxsO1xyXG5cdFx0XHRpZiAoIHNvdXJjZV9idG4gJiYgdy5qUXVlcnkgJiYgdHlwZW9mIHcud3BiY19iZmJfX2J1dHRvbl9idXN5X3N0YXJ0ID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdCRzb3VyY2VfYnRuID0gdy5qUXVlcnkoIHNvdXJjZV9idG4gKTtcclxuXHRcdFx0XHRpZiAoICRzb3VyY2VfYnRuICYmICRzb3VyY2VfYnRuLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdHcud3BiY19iZmJfX2J1dHRvbl9idXN5X3N0YXJ0KCAkc291cmNlX2J0biApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5pc19idXN5ID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5zZXRfYnV0dG9uX2J1c3koIHRydWUgKTsgLy8gbG9jYWwgXCJVcGRhdGUgUHJldmlld1wiIGJ1dHRvbiBpbiB0aGUgcGFuZWxcclxuXHJcblx0XHRcdHZhciBwYXlsb2FkID0gbmV3IHcuRm9ybURhdGEoKTtcclxuXHRcdFx0dmFyIGNmZyAgICAgPSB3LldQQkNfQkZCX0FqYXggfHwge307XHJcblxyXG5cdFx0XHQvLyBCdWlsZCBzZXR0aW5ncyBwYXlsb2FkIChzYW1lIGFzIHJlYWwgc2F2aW5nKS5cclxuXHRcdFx0dmFyIGZvcm1fc2V0dGluZ3MgPSB0aGlzLmdldF9jdXJyZW50X2Zvcm1fc2V0dGluZ3MoIGNmZy5mb3JtX25hbWUgfHwgJ3N0YW5kYXJkJyApO1xyXG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdhY3Rpb24nLCAnV1BCQ19BSlhfQkZCX1NBVkVfRk9STV9DT05GSUcnICk7XHJcblx0XHRcdHBheWxvYWQuYXBwZW5kKCAnbm9uY2UnLCAoIGNmZy5ub25jZV9zYXZlIHx8IHRoaXMubm9uY2UgfHwgJycgKSApO1xyXG5cclxuXHRcdFx0Ly8gSU1QT1JUQU5UOlxyXG5cdFx0XHQvLyAtIGZvcm1fbmFtZSBpcyB0aGUgbG9naWNhbCBmb3JtIGtleSAodXN1YWxseSAnc3RhbmRhcmQnIG9yIHNlbGVjdGVkIGZvcm0pXHJcblx0XHRcdHBheWxvYWQuYXBwZW5kKCAnZm9ybV9uYW1lJywgKCBjZmcuZm9ybV9uYW1lIHx8ICdzdGFuZGFyZCcgKSApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ3N0YXR1cycsICdwcmV2aWV3JyApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ3JldHVybl9wcmV2aWV3X3VybCcsICcxJyApO1xyXG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdlbmdpbmUnLCAoIGNmZy5lbmdpbmUgfHwgJ2JmYicgKSApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2VuZ2luZV92ZXJzaW9uJywgKCBjZmcuZW5naW5lX3ZlcnNpb24gfHwgJzEuMCcgKSApO1xyXG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdzdHJ1Y3R1cmUnLCBKU09OLnN0cmluZ2lmeSggc3RydWN0dXJlICkgKTtcclxuXHJcblx0XHRcdC8vIFNlbmQgcmVhbCBzZXR0aW5ncyAob3B0aW9ucyArIGNvbXBpbGVkIGNzc192YXJzKS5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdzZXR0aW5ncycsIEpTT04uc3RyaW5naWZ5KCBmb3JtX3NldHRpbmdzICkgKTtcclxuXHJcblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gQ2hvb3NlIHdoZXJlIGFkdmFuY2VkX2Zvcm0gKyBjb250ZW50X2Zvcm0gYXJlIHRha2VuIGZyb20gKGF1dG98YnVpbGRlcnxhZHZhbmNlZClcclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHR2YXIgcHJldmlld19zb3VyY2UgPSB3cGJjX2JmYl9wcmV2aWV3X19nZXRfc291cmNlKCBjZmcsIHNvdXJjZV9idG4gKTtcclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdwcmV2aWV3X3NvdXJjZScsIHByZXZpZXdfc291cmNlICk7XHJcblxyXG5cdFx0XHR2YXIgYWR2ID0gbnVsbDtcclxuXHJcblx0XHRcdC8vIDEpIFRyeSBBZHZhbmNlZCBNb2RlIHRleHQgKGlmIHNlbGVjdGVkIC8gYXV0bytkaXJ0eSlcclxuXHRcdFx0aWYgKCBwcmV2aWV3X3NvdXJjZSA9PT0gJ2FkdmFuY2VkJyB8fCBwcmV2aWV3X3NvdXJjZSA9PT0gJ2F1dG8nICkge1xyXG5cclxuXHRcdFx0XHRhZHYgPSB3cGJjX2JmYl9wcmV2aWV3X19yZWFkX2FkdmFuY2VkX21vZGVfcGF5bG9hZCggZCwgdyApO1xyXG5cclxuXHRcdFx0XHR2YXIgY2FuX3VzZV9hZHZhbmNlZCA9XHJcblx0XHRcdFx0XHRcdChwcmV2aWV3X3NvdXJjZSA9PT0gJ2FkdmFuY2VkJykgfHxcclxuXHRcdFx0XHRcdFx0KHByZXZpZXdfc291cmNlID09PSAnYXV0bycgJiYgYWR2ICYmIGFkdi5pc19kaXJ0eSk7XHJcblxyXG5cdFx0XHRcdGlmICggY2FuX3VzZV9hZHZhbmNlZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBGb3JjZWQgXCJhZHZhbmNlZFwiIGJ1dCBlbXB0eSAtPiBmYWxsYmFjayB0byBidWlsZGVyIGV4cG9ydC5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19oYXNfdGV4dCggYWR2LmFkdmFuY2VkX2Zvcm0gKSAmJiAhIHdwYmNfYmZiX3ByZXZpZXdfX2hhc190ZXh0KCBhZHYuY29udGVudF9mb3JtICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB3LndwYmNfYWRtaW5fc2hvd19tZXNzYWdlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdHcud3BiY19hZG1pbl9zaG93X21lc3NhZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHQnQWR2YW5jZWQgTW9kZSBpcyBzZWxlY3RlZCwgYnV0IGVkaXRvcnMgYXJlIGVtcHR5LiBVc2luZyBCdWlsZGVyIGV4cG9ydC4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3dhcm5pbmcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0NjAwMFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB3cGJjX2JmYl9wcmV2aWV3X19oYXNfdGV4dCggYWR2LmFkdmFuY2VkX2Zvcm0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2FkdmFuY2VkX2Zvcm0nLCBhZHYuYWR2YW5jZWRfZm9ybSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggd3BiY19iZmJfcHJldmlld19faGFzX3RleHQoIGFkdi5jb250ZW50X2Zvcm0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2NvbnRlbnRfZm9ybScsIGFkdi5jb250ZW50X2Zvcm0gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIDIpIElmIG5vdCB0YWtlbiBmcm9tIEFkdmFuY2VkIE1vZGUgLT4gZXhwb3J0IGZyb20gQnVpbGRlciBzdHJ1Y3R1cmUgKGN1cnJlbnQgYmVoYXZpb3IpXHJcblx0XHRcdHZhciBhbHJlYWR5X2hhc19hZHYgPVxyXG5cdFx0XHRcdFx0cGF5bG9hZC5oYXMgJiYgKHBheWxvYWQuaGFzKCAnYWR2YW5jZWRfZm9ybScgKSB8fCBwYXlsb2FkLmhhcyggJ2NvbnRlbnRfZm9ybScgKSk7IC8vIHNvbWUgYnJvd3NlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIC8vIHN1cHBvcnRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIC8vIEZvcm1EYXRhLmhhc1xyXG5cclxuXHRcdFx0Ly8gRmFsbGJhY2sgZm9yIG9sZCBicm93c2VycyAobm8gRm9ybURhdGEuaGFzKVxyXG5cdFx0XHRpZiAoIHR5cGVvZiBwYXlsb2FkLmhhcyAhPT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRhbHJlYWR5X2hhc19hZHYgPSBmYWxzZTsgLy8ganVzdCB0cnkgZXhwb3J0ZXIgaWYgbmVlZGVkXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggISBhbHJlYWR5X2hhc19hZHYgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdy5XUEJDX0JGQl9FeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9FeHBvcnRlci5leHBvcnRfYWxsID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHRcdHZhciB3aWR0aF9jb21iaW5lZCA9IGZvcm1fc2V0dGluZ3Mub3B0aW9ucy5ib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHR2YXIgcGFyc2VkX3dpZHRoICAgPSB0aGlzLnBhcnNlX2xlbmd0aF92YWx1ZSggd2lkdGhfY29tYmluZWQgKTtcclxuXHRcdFx0XHRcdFx0dmFyIHdpZHRoX3VuaXQgICAgID0gcGFyc2VkX3dpZHRoLnVuaXQgPyBwYXJzZWRfd2lkdGgudW5pdCA6ICclJztcclxuXHJcblx0XHRcdFx0XHRcdHZhciBleHBvcnRfb3B0aW9ucyA9IHtcclxuXHRcdFx0XHRcdFx0XHRnYXBQZXJjZW50ICAgICAgOiAzLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1fc2x1ZyAgICAgICA6IChjZmcuZm9ybV9uYW1lIHx8ICdzdGFuZGFyZCcpLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1fd2lkdGhfdmFsdWU6IHBhcnNlZF93aWR0aC5udW0sXHJcblx0XHRcdFx0XHRcdFx0Zm9ybV93aWR0aF91bml0IDogd2lkdGhfdW5pdFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGV4cG9ydF9yZXN1bHQgPSB3LldQQkNfQkZCX0V4cG9ydGVyLmV4cG9ydF9hbGwoIHN0cnVjdHVyZSB8fCBbXSwgZXhwb3J0X29wdGlvbnMgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZXhwb3J0X3Jlc3VsdCApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGV4cG9ydF9yZXN1bHQuYWR2YW5jZWRfZm9ybSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHBheWxvYWQuYXBwZW5kKCAnYWR2YW5jZWRfZm9ybScsIGV4cG9ydF9yZXN1bHQuYWR2YW5jZWRfZm9ybSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGV4cG9ydF9yZXN1bHQuZmllbGRzX2RhdGEgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2NvbnRlbnRfZm9ybScsIGV4cG9ydF9yZXN1bHQuZmllbGRzX2RhdGEgKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgQkZCOiBleHBvcnRfYWxsIGVycm9yJywgZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdC8vIFVzZSBzaGFyZWQgaGVscGVyIGlmIGF2YWlsYWJsZTsgZmFsbGJhY2sgdG8gYWpheHVybC5cclxuXHRcdFx0dmFyIGFqYXhfdXJsID0gJyc7XHJcblx0XHRcdGlmICggdHlwZW9mIHcud3BiY19iZmJfX2dldF9hamF4X3VybCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRhamF4X3VybCA9IHcud3BiY19iZmJfX2dldF9hamF4X3VybCgpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2Ygdy5hamF4dXJsICE9PSAndW5kZWZpbmVkJyAmJiB3LmFqYXh1cmwgKSB7XHJcblx0XHRcdFx0YWpheF91cmwgPSB3LmFqYXh1cmw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBzZWxmID0gdGhpcztcclxuXHRcdFx0dmFyIHByZXZpZXdfY2FsZW5kYXJfc2tpbl91cmwgPSB0aGlzLmdldF9zZWxlY3RlZF9jYWxlbmRhcl9za2luX3VybCgpO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZW5kX2J1c3lfbm93KCkge1xyXG5cdFx0XHRcdHNlbGYuX2VuZF9idXN5KCAkc291cmNlX2J0biApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICEgYWpheF91cmwgKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnYWpheCBVUkwgaXMgbm90IGRlZmluZWQnICk7XHJcblx0XHRcdFx0ZW5kX2J1c3lfbm93KCk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR3LmZldGNoKCBhamF4X3VybCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGJvZHk6ICAgcGF5bG9hZFxyXG5cdFx0XHR9IClcclxuXHRcdFx0LnRoZW4oIGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG5cdFx0XHRcdHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcblx0XHRcdH0gKVxyXG5cdFx0XHQudGhlbiggZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRpZiAoICEgZGF0YSB8fCAhIGRhdGEuc3VjY2VzcyB8fCAhIGRhdGEuZGF0YSB8fCAhIGRhdGEuZGF0YS5wcmV2aWV3X3VybCApIHtcclxuXHRcdFx0XHRcdGRldi5lcnJvciggJ3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50JywgJ1ByZXZpZXcgQUpBWCBlcnJvcicsIGRhdGEgKTtcclxuXHRcdFx0XHRcdGVuZF9idXN5X25vdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIHNlbGYuaWZyYW1lICkge1xyXG5cdFx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnTWlzc2luZyBpZnJhbWUgZWxlbWVudCcgKTtcclxuXHRcdFx0XHRcdGVuZF9idXN5X25vdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gV2FpdCB1bnRpbCBpZnJhbWUgaGFzIHJlYWxseSBsb2FkZWQgdGhlIHByZXZpZXcgVVJMLlxyXG5cdFx0XHRcdHZhciBvbl9sb2FkID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0c2VsZi5pZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbl9sb2FkICk7XHJcblx0XHRcdFx0XHRzZWxmLmFwcGx5X2NhbGVuZGFyX3NraW5fdG9faWZyYW1lKCBwcmV2aWV3X2NhbGVuZGFyX3NraW5fdXJsLCBlbmRfYnVzeV9ub3cgKTtcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRzZWxmLmlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uX2xvYWQgKTtcclxuXHRcdFx0XHRzZWxmLmlmcmFtZS5zZXRBdHRyaWJ1dGUoICdzcmMnLCBkYXRhLmRhdGEucHJldmlld191cmwgKTtcclxuXHRcdFx0fSApXHJcblx0XHRcdC5jYXRjaCggZnVuY3Rpb24gKGVycikge1xyXG5cdFx0XHRcdGRldi5lcnJvciggJ3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50JywgJ1ByZXZpZXcgQUpBWCBmYWlsZWQnLCBlcnIgKTtcclxuXHRcdFx0XHRlbmRfYnVzeV9ub3coKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZXJuYWwgaGVscGVyOiBzdG9wIGJ1c3kgc3RhdGUgb24gcGFuZWwgYnV0dG9uICsgb3B0aW9uYWwgdG9wIHRvb2xiYXIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fG51bGx9ICRzb3VyY2VfYnRuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfZW5kX2J1c3koJHNvdXJjZV9idG4pIHtcclxuXHRcdFx0dGhpcy5pc19idXN5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuc2V0X2J1dHRvbl9idXN5KCBmYWxzZSApO1xyXG5cdFx0XHR0aGlzLnNldF9sb2FkZXJfdmlzaWJsZSggZmFsc2UgKTsgLy8gTkVXXHJcblxyXG5cdFx0XHRpZiAoICRzb3VyY2VfYnRuICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfZW5kKCAkc291cmNlX2J0biApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JjZS1yZXNldCBhbnkgYnVzeSBzdGF0ZXMgcmVsYXRlZCB0byBwcmV2aWV3LlxyXG5cdFx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBCdWlsZGVyIG1vZGUgKHNvZnQtY2FuY2VsIFVYKS5cclxuXHRcdCAqL1xyXG5cdFx0cmVzZXRfYnVzeV9zdGF0ZSgpIHtcclxuXHRcdFx0dGhpcy5pc19idXN5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuc2V0X2J1dHRvbl9idXN5KCBmYWxzZSApOyAvLyBwYW5lbCBidXR0b24sIGlmIGFueVxyXG5cdFx0XHR0aGlzLnNldF9sb2FkZXJfdmlzaWJsZSggZmFsc2UgKTsgLy8gTkVXXHJcblxyXG5cdFx0XHRpZiAoIHcualF1ZXJ5ICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0Ly8gVG9wIHRvb2xiYXIgYnV0dG9ucyB0aGF0IG1heSBzaG93IFwiTG9hZGluZyBwcmV2aWV3Li4uXCJcclxuXHRcdFx0XHR2YXIgJGJ0bnMgPSB3LmpRdWVyeShcclxuXHRcdFx0XHRcdCdbZGF0YS13cGJjLWJmYi10b3AtcHJldmlldy1idG49XCIxXCJdLCcgK1xyXG5cdFx0XHRcdFx0J1tkYXRhLXdwYmMtYmZiLXRvcC1yZWZyZXNoLWJ0bj1cIjFcIl0nXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0JGJ0bnMuZWFjaCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0dmFyICRiID0gdy5qUXVlcnkoIHRoaXMgKTtcclxuXHRcdFx0XHRcdGlmICggJGIuaGFzQ2xhc3MoICd3cGJjLWlzLWJ1c3knICkgKSB7XHJcblx0XHRcdFx0XHRcdHcud3BiY19iZmJfX2J1dHRvbl9idXN5X2VuZCggJGIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbXBsZSBidXN5IGluZGljYXRvciBmb3IgdGhlIHBhbmVsIFwiVXBkYXRlIFByZXZpZXdcIiBidXR0b24uXHJcblx0XHQgKiBSZXVzZXMgZ2xvYmFsIFdQQkMgYnVzeSBoZWxwZXJzIGlmIGF2YWlsYWJsZSwgc28gdGhlIHNwaW5uZXIgbWF0Y2hlcyBTYXZlL0xvYWQgYnV0dG9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzX2J1c3lcclxuXHRcdCAqL1xyXG5cdFx0c2V0X2J1dHRvbl9idXN5KCBpc19idXN5ICkge1xyXG5cdFx0XHRpZiAoICEgdGhpcy5idXR0b24gKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiBqUXVlcnkgKyBnbG9iYWwgaGVscGVycyBleGlzdCwgdXNlIHNhbWUgc3Bpbm5lciBhcyBvdGhlciB0b29sYmFyIGJ1dHRvbnMuXHJcblx0XHRcdGlmICggdy5qUXVlcnkgJiYgdHlwZW9mIHcud3BiY19iZmJfX2J1dHRvbl9idXN5X3N0YXJ0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0dmFyICRidG4gPSB3LmpRdWVyeSggdGhpcy5idXR0b24gKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpc19idXN5ICkge1xyXG5cdFx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfc3RhcnQoICRidG4gKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfZW5kKCAkYnRuICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZhbGxiYWNrOiBzaW1wbGUgZGlzYWJsZWQgc3RhdGUgd2l0aG91dCBzcGlubmVyLlxyXG5cdFx0XHRpZiAoIGlzX2J1c3kgKSB7XHJcblx0XHRcdFx0dGhpcy5idXR0b24uc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0dGhpcy5idXR0b24uY2xhc3NMaXN0LmFkZCggJ3dwYmNfYmZiX19wcmV2aWV3X2J0bl9idXN5JyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuYnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApO1xyXG5cdFx0XHRcdHRoaXMuYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoICd3cGJjX2JmYl9fcHJldmlld19idG5fYnVzeScgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGN1cnJlbnQgdmlldyBtb2RlOiBcImJ1aWxkZXJcIiBvciBcInByZXZpZXdcIi5cclxuXHRcdCAqIEFwcGxpZXMvcmVtb3ZlcyBDU1MgY2xhc3Mgb24gPGJvZHk+LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7KCdidWlsZGVyJ3wncHJldmlldycpfSBtb2RlXHJcblx0XHQgKi9cclxuXHRcdHNldF9tb2RlKCBtb2RlICkge1xyXG5cdFx0XHR2YXIgYm9keSA9IGQuYm9keTtcclxuXHRcdFx0aWYgKCAhIGJvZHkgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1vZGUgPT09ICdwcmV2aWV3JyApIHtcclxuXHRcdFx0XHRib2R5LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fbW9kZV9wcmV2aWV3JyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGJvZHkuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19tb2RlX3ByZXZpZXcnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyAtLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIElzIFByZXZpZXcgbW9kZSBjdXJyZW50bHkgYWN0aXZlP1xyXG5cdCAqIFdlIHByZWZlciBib2R5IGNsYXNzIChzZXQgYnkgY2xpZW50LnNldF9tb2RlKSwgZmFsbGJhY2sgdG8gYWN0aXZlIHRhYiBpZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19faXNfcHJldmlld19tb2RlX2FjdGl2ZSgpIHtcclxuXHRcdHZhciBib2R5ID0gZC5ib2R5O1xyXG5cdFx0aWYgKCBib2R5ICYmIGJvZHkuY2xhc3NMaXN0ICYmIGJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX21vZGVfcHJldmlldycgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKHdwYmNfYmZiX3ByZXZpZXdfX2dldF9hY3RpdmVfdG9wX3RhYl9pZCgpID09PSAncHJldmlld190YWInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gYSBmb3JtIGlzIGxvYWRlZCB2aWEgQUpBWCB3aGlsZSBQcmV2aWV3IHRhYiBpcyBhY3RpdmUsXHJcblx0ICogcmVmcmVzaCB0aGUgaWZyYW1lIHNvIGl0IHNob3dzIHRoZSBuZXdseSBsb2FkZWQgZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7d3BiY19iZmJfcHJldmlld19jbGllbnR9IGNsaWVudFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX3ByZXZpZXdfX2JpbmRfZm9ybV9hamF4X2xvYWRlZF9ldmVudHMoY2xpZW50KSB7XHJcblxyXG5cdFx0aWYgKCAhIGNsaWVudCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFByZXZlbnQgZG91YmxlIGJpbmRpbmcgaWYgdGhpcyBzY3JpcHQgaXMgaW5qZWN0ZWQgdHdpY2UuXHJcblx0XHRpZiAoIHcuX193cGJjX2JmYl9wcmV2aWV3X19mb3JtX2FqYXhfbG9hZGVkX2JvdW5kID09PSAnMScgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHcuX193cGJjX2JmYl9wcmV2aWV3X19mb3JtX2FqYXhfbG9hZGVkX2JvdW5kID0gJzEnO1xyXG5cclxuXHRcdHZhciBkZWJvdW5jZV9pZCA9IG51bGw7XHJcblxyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKFxyXG5cdFx0XHQnd3BiYzpiZmI6Zm9ybTphamF4X2xvYWRlZCcsXHJcblx0XHRcdGZ1bmN0aW9uIChldikge1xyXG5cclxuXHRcdFx0XHQvLyBPbmx5IGRvIGFueXRoaW5nIGlmIFByZXZpZXcgaXMgY3VycmVudGx5IGFjdGl2ZS5cclxuXHRcdFx0XHRpZiAoICEgd3BiY19iZmJfcHJldmlld19faXNfcHJldmlld19tb2RlX2FjdGl2ZSgpICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGRldCA9IChldiAmJiBldi5kZXRhaWwpID8gZXYuZGV0YWlsIDoge307XHJcblx0XHRcdFx0dmFyIGZuICA9IGRldC5mb3JtX25hbWUgPyBTdHJpbmcoIGRldC5mb3JtX25hbWUgKSA6ICcnO1xyXG5cclxuXHRcdFx0XHQvLyBCZXN0LWVmZm9ydDoga2VlcCBjZmcuZm9ybV9uYW1lIGluIHN5bmMgZm9yIHBheWxvYWQgYnVpbGRpbmcuXHJcblx0XHRcdFx0aWYgKCBmbiApIHtcclxuXHRcdFx0XHRcdHcuV1BCQ19CRkJfQWpheCAgICAgICAgICAgPSB3LldQQkNfQkZCX0FqYXggfHwge307XHJcblx0XHRcdFx0XHR3LldQQkNfQkZCX0FqYXguZm9ybV9uYW1lID0gZm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBEZWJvdW5jZSBtdWx0aXBsZSByYXBpZCBsb2FkcyAob3Igc2Vjb25kYXJ5IGV2ZW50cykuXHJcblx0XHRcdFx0aWYgKCBkZWJvdW5jZV9pZCApIHtcclxuXHRcdFx0XHRcdGNsZWFyVGltZW91dCggZGVib3VuY2VfaWQgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRlYm91bmNlX2lkID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0ZGVib3VuY2VfaWQgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdC8vIFByZXZpZXcgbWlnaHQgaGF2ZSBiZWVuIGxlZnQgd2hpbGUgd2FpdGluZy5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19pc19wcmV2aWV3X21vZGVfYWN0aXZlKCkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgYWxyZWFkeSBzZW5kaW5nIHByZXZpZXcsIGRvbid0IHN0YWNrIGFub3RoZXIgcmVxdWVzdC5cclxuXHRcdFx0XHRcdGlmICggY2xpZW50LmlzX2J1c3kgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFRyeSBvbmNlIG1vcmUgc2hvcnRseSAoc2FmZSkuXHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfbW9kZV9hY3RpdmUoKSAmJiAhIGNsaWVudC5pc19idXN5ICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xpZW50LnVwZGF0ZV9wcmV2aWV3KCB7IHNvdXJjZV9idXR0b246IG51bGwgfSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSwgMjUwICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBXYWl0IHVudGlsIGJ1aWxkZXIgQVBJIGlzIHByZXNlbnQgKGZvcm0gbG9hZCBjYW4gYmUgYXN5bmMpLlxyXG5cdFx0XHRcdFx0dmFyIHRyaWVzID0gMDtcclxuXHRcdFx0XHRcdChmdW5jdGlvbiB3YWl0X2Zvcl9idWlsZGVyKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfbW9kZV9hY3RpdmUoKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdy53cGJjX2JmYiAmJiB0eXBlb2Ygdy53cGJjX2JmYi5nZXRfc3RydWN0dXJlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdGNsaWVudC51cGRhdGVfcHJldmlldyggeyBzb3VyY2VfYnV0dG9uOiBudWxsIH0gKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRyaWVzKys7XHJcblx0XHRcdFx0XHRcdGlmICggdHJpZXMgPCAxNSApIHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCB3YWl0X2Zvcl9idWlsZGVyLCAyMDAgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR9LCAxODAgKTtcclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdHsgcGFzc2l2ZTogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fZ2V0X3NvdXJjZShjZmcsIGJ0bikge1xyXG5cclxuXHRcdC8vIHByaW9yaXR5OiBidXR0b24gYXR0ciAtPiBnbG9iYWwgY2ZnIC0+IGRlZmF1bHRcclxuXHRcdHZhciB2ID0gJyc7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIGJ0biAmJiBidG4uZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRcdHYgPSBidG4uZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1wcmV2aWV3LXNvdXJjZScgKSB8fCBidG4uZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1zYXZlLXNvdXJjZScgKSB8fCAnJztcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoIGUgKSB7fVxyXG5cclxuXHRcdGlmICggISB2ICYmIGNmZyAmJiAoY2ZnLnByZXZpZXdfc291cmNlIHx8IGNmZy5zYXZlX3NvdXJjZSkgKSB7XHJcblx0XHRcdHYgPSBjZmcucHJldmlld19zb3VyY2UgfHwgY2ZnLnNhdmVfc291cmNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHYgPSBTdHJpbmcoIHYgfHwgJ2F1dG8nICkudG9Mb3dlckNhc2UoKTtcclxuXHRcdGlmICggWyAnYnVpbGRlcicsICdhZHZhbmNlZCcsICdhdXRvJyBdLmluZGV4T2YoIHYgKSA9PT0gLTEgKSB7XHJcblx0XHRcdHYgPSAnYnVpbGRlcic7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdjtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX3ByZXZpZXdfX2hhc190ZXh0KHYpIHtcclxuXHRcdHJldHVybiAhISAodiAmJiBTdHJpbmcoIHYgKS50cmltKCkpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fcmVhZF9hZHZhbmNlZF9tb2RlX3BheWxvYWQoZCwgdykge1xyXG5cclxuXHRcdC8vIGJlc3Q6IEFQSSAoc3luY3MgQ29kZU1pcnJvciAtPiB0ZXh0YXJlYSlcclxuXHRcdGlmICggdy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpICYmIHR5cGVvZiB3LndwYmNfYmZiX2FkdmFuY2VkX2VkaXRvcl9hcGkuZ2V0X3ZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm4gdy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpLmdldF92YWx1ZXMoKTtcclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZhbGxiYWNrOiByZWFkIHRleHRhcmVhcyBkaXJlY3RseVxyXG5cdFx0dmFyIHRhX2Zvcm0gICAgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2FkdmFuY2VkX2Zvcm1fZWRpdG9yJyApO1xyXG5cdFx0dmFyIHRhX2NvbnRlbnQgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2NvbnRlbnRfZm9ybV9lZGl0b3InICk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YWR2YW5jZWRfZm9ybTogdGFfZm9ybSA/IFN0cmluZyggdGFfZm9ybS52YWx1ZSB8fCAnJyApIDogJycsXHJcblx0XHRcdGNvbnRlbnRfZm9ybSA6IHRhX2NvbnRlbnQgPyBTdHJpbmcoIHRhX2NvbnRlbnQudmFsdWUgfHwgJycgKSA6ICcnLFxyXG5cdFx0XHRpc19kaXJ0eSAgICAgOiBmYWxzZVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElzIHRoaXMgZWxlbWVudCB0aGUgUHJldmlldyBUQUIgbGluayBpbiB0b3AgdGFicyBuYXY/XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGVsXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19pc19wcmV2aWV3X3RhYl9saW5rKGVsKSB7XHJcblx0XHRpZiAoICFlbCB8fCAhZWwuZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWFjdGlvbicgKSA9PT0gJ3BhbmVsJyAmJlxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSA9PT0gJ3ByZXZpZXdfdGFiJ1xyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElzIHRoaXMgZWxlbWVudCB0aGUgQnVpbGRlciBUQUIgbGluayBpbiB0b3AgdGFicyBuYXY/XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGVsXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19pc19idWlsZGVyX3RhYl9saW5rKGVsKSB7XHJcblx0XHRpZiAoICFlbCB8fCAhZWwuZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWFjdGlvbicgKSA9PT0gJ3BhbmVsJyAmJlxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSA9PT0gJ2J1aWxkZXJfdGFiJ1xyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjdGl2YXRlIGEgXCJwYW5lbFwiIHRhYiBhbmQgc2hvdyBpdHMgcGFuZWwgc2VjdGlvbiAoc2NvcGVkKS5cclxuXHQgKlxyXG5cdCAqIFN0cmF0ZWd5OlxyXG5cdCAqIDEpIFRyeSB0byBjbGljayB0aGUgcmVhbCB0b3AtdGFiIGxpbmsgKGJlc3QpLlxyXG5cdCAqIDIpIElmIGxpbmsgZG9lcyBub3QgZXhpc3QgKGUuZy4gUHJldmlldyB0YWIgcmVtb3ZlZCBmcm9tIG5hdiksIGRvIGEgc2NvcGVkIG1hbnVhbCBzd2l0Y2g6XHJcblx0ICogICAgLSB1c2UgbmF2J3MgZGF0YS13cGJjLWJmYi1wYW5lbHMtcm9vdCArIGRhdGEtd3BiYy1iZmItcGFuZWwtY2xhc3NcclxuXHQgKiAgICAtIGhpZGUvc2hvdyBPTkxZIHRob3NlIG91dGVyIHBhbmVsc1xyXG5cdCAqICAgIC0gRE8gTk9UIHRvdWNoIGlubmVyIHBhbmVsc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhYl9pZFxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfX2FjdGl2YXRlX3BhbmVsX3RhYih0YWJfaWQpIHtcclxuXHJcblx0XHR0YWJfaWQgPSBTdHJpbmcoIHRhYl9pZCB8fCAnJyApLnRyaW0oKTtcclxuXHRcdGlmICggISB0YWJfaWQgKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAxKSBCZXN0OiB0cmlnZ2VyIGV4aXN0aW5nIHRvcC10YWJzIHN3aXRjaGluZyBieSBjbGlja2luZyB0aGUgdGFiIGxpbmsgKGlmIGl0IGV4aXN0cykuXHJcblx0XHR2YXIgdGFiX2xpbmsgPSBkLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJmYi1hY3Rpb249XCJwYW5lbFwiXVtkYXRhLXdwYmMtYmZiLXRhYj1cIicgKyB0YWJfaWQgKyAnXCJdJyApO1xyXG5cdFx0aWYgKCB0YWJfbGluayAmJiB0eXBlb2YgdGFiX2xpbmsuY2xpY2sgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dGFiX2xpbmsuY2xpY2soKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge31cclxuXHRcdH1cclxuXHJcblx0XHQvLyAyKSBGYWxsYmFjazogc2NvcGVkIG1hbnVhbCB0b2dnbGUgKG91dGVyIHBhbmVscyBvbmx5KS5cclxuXHRcdHZhciBuYXYgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX3RvcF9ob3Jpc29udGFsX25hdicgKTtcclxuXHJcblx0XHQvLyBEZXRlcm1pbmUgb3V0ZXIgcGFuZWxzIHJvb3QuXHJcblx0XHR2YXIgcGFuZWxzX3Jvb3QgICAgICAgICAgPSBkO1xyXG5cdFx0dmFyIHBhbmVsc19yb290X3NlbGVjdG9yID0gJyc7XHJcblxyXG5cdFx0aWYgKCBuYXYgKSB7XHJcblx0XHRcdHBhbmVsc19yb290X3NlbGVjdG9yID0gbmF2LmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItcGFuZWxzLXJvb3QnICkgfHwgJyc7XHJcblx0XHRcdHBhbmVsc19yb290X3NlbGVjdG9yID0gU3RyaW5nKCBwYW5lbHNfcm9vdF9zZWxlY3RvciB8fCAnJyApLnRyaW0oKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGYWxsYmFjayBpZiBhdHRyaWJ1dGUgbWlzc2luZzogcHJlZmVyICN3cGJjX2JmYl9fdG9wX3BhbmVscyBpZiBwcmVzZW50LlxyXG5cdFx0aWYgKCAhIHBhbmVsc19yb290X3NlbGVjdG9yICkge1xyXG5cdFx0XHRwYW5lbHNfcm9vdF9zZWxlY3RvciA9ICcjd3BiY19iZmJfX3RvcF9wYW5lbHMnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGFuZWxzX3Jvb3Rfc2VsZWN0b3IgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIHJvb3RfZWwgPSBkLnF1ZXJ5U2VsZWN0b3IoIHBhbmVsc19yb290X3NlbGVjdG9yICk7XHJcblx0XHRcdFx0aWYgKCByb290X2VsICkge1xyXG5cdFx0XHRcdFx0cGFuZWxzX3Jvb3QgPSByb290X2VsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIF9lMiApIHt9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIG91dGVyIGJhc2UgY2xhc3MgKElNUE9SVEFOVDogbXVzdCBiZSB0aGUgT1VURVIgYmFzZSwgbm90IHdwYmNfYmZiX190YWJfc2VjdGlvbikuXHJcblx0XHR2YXIgcGFuZWxfYmFzZV9jbGFzcyA9ICd3cGJjX2JmYl9fdG9wX3RhYl9zZWN0aW9uJztcclxuXHRcdGlmICggbmF2ICkge1xyXG5cdFx0XHR2YXIgZnJvbV9uYXYgPSBuYXYuZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1wYW5lbC1jbGFzcycgKSB8fCAnJztcclxuXHRcdFx0ZnJvbV9uYXYgICAgID0gU3RyaW5nKCBmcm9tX25hdiB8fCAnJyApLnRyaW0oKTtcclxuXHRcdFx0aWYgKCBmcm9tX25hdiApIHtcclxuXHRcdFx0XHRwYW5lbF9iYXNlX2NsYXNzID0gZnJvbV9uYXY7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgYWN0aXZlIHRhYiBvbiBuYXYgKHNvdXJjZSBvZiB0cnV0aCkuXHJcblx0XHRpZiAoIG5hdiApIHtcclxuXHRcdFx0bmF2LnNldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aXZlLXRhYicsIHRhYl9pZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhpZGUgT05MWSBvdXRlciBwYW5lbHMgKHNjb3BlZCBieSBiYXNlIGNsYXNzKS5cclxuXHRcdHZhciBzZWxlY3Rvcl9hbGwgPSAnLicgKyBwYW5lbF9iYXNlX2NsYXNzO1xyXG5cdFx0dmFyIHBhbmVsX25vZGVzICA9IHBhbmVsc19yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yX2FsbCApO1xyXG5cclxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBhbmVsX25vZGVzLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRwYW5lbF9ub2Rlc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNob3cgcmVxdWVzdGVkIG91dGVyIHBhbmVsLlxyXG5cdFx0dmFyIHNlbGVjdG9yX2FjdGl2ZSA9ICcuJyArIHBhbmVsX2Jhc2VfY2xhc3MgKyAnX18nICsgdGFiX2lkO1xyXG5cdFx0dmFyIGFjdGl2ZV9wYW5lbCAgICA9IHBhbmVsc19yb290LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yX2FjdGl2ZSApO1xyXG5cclxuXHRcdGlmICggISBhY3RpdmVfcGFuZWwgKSB7XHJcblx0XHRcdC8vIEJhY2t3YXJkLWNvbXBhdGlibGUgZmFsbGJhY2sgKGlmIHNvbWVvbmUgZm9yZ290IHRvIGFkZCBvdXRlciBjbGFzc2VzKS5cclxuXHRcdFx0YWN0aXZlX3BhbmVsID0gcGFuZWxzX3Jvb3QucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fdGFiX3NlY3Rpb25fXycgKyB0YWJfaWQgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGFjdGl2ZV9wYW5lbCApIHtcclxuXHRcdFx0YWN0aXZlX3BhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBNYXJrIGFjdGl2ZSBpdGVtIGluIG91dGVyIG5hdiBpZiBpdCBleGlzdHMgKFByZXZpZXcgY2FuIGJlIG1pc3NpbmcpLlxyXG5cdFx0aWYgKCBuYXYgKSB7XHJcblx0XHRcdHZhciBpdGVtcyA9IG5hdi5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfdWlfZWxfX2hvcmlzX25hdl9pdGVtJyApO1xyXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKyApIHtcclxuXHRcdFx0XHRpdGVtc1tqXS5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlJyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgYWN0aXZlX2l0ZW0gPSBuYXYucXVlcnlTZWxlY3RvciggJy53cGJjX3VpX2VsX19ob3Jpc19uYXZfaXRlbV9fJyArIHRhYl9pZCApO1xyXG5cdFx0XHRpZiAoIGFjdGl2ZV9pdGVtICkge1xyXG5cdFx0XHRcdGFjdGl2ZV9pdGVtLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBFbWl0IHNhbWUgZXZlbnQgYXMgYmZiLXRvcC10YWJzLmpzIHNvIG90aGVyIG1vZHVsZXMgc3RheSBpbiBzeW5jLlxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZC5kaXNwYXRjaEV2ZW50KFxyXG5cdFx0XHRcdG5ldyBDdXN0b21FdmVudCggJ3dwYmM6YmZiOnRvcC10YWInLCB7XHJcblx0XHRcdFx0XHRkZXRhaWw6IHtcclxuXHRcdFx0XHRcdFx0dGFiICAgOiB0YWJfaWQsXHJcblx0XHRcdFx0XHRcdG5hdl9pZDogKG5hdiAmJiBuYXYuaWQpID8gU3RyaW5nKCBuYXYuaWQgKSA6ICcnXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApXHJcblx0XHRcdCk7XHJcblx0XHR9IGNhdGNoICggX2UzICkge31cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgY3VycmVudGx5IGFjdGl2ZSB0b3AgdGFiIGlkIGZyb20gdGhlIG5hdiBjb250YWluZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCkge1xyXG5cdFx0dmFyIG5hdiA9IGQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9fdG9wX2hvcmlzb250YWxfbmF2JyApO1xyXG5cdFx0aWYgKCAhbmF2ICkge1xyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmF2LmdldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aXZlLXRhYicgKSB8fCAnJztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN5bmMgcHJldmlldyBcIm1vZGVcIiB3aXRoIGN1cnJlbnRseSBhY3RpdmUgdG9wIHRhYi5cclxuXHQgKlxyXG5cdCAqIFJ1bGVzOlxyXG5cdCAqIC0gcHJldmlld190YWIgPT4gZW5hYmxlIHByZXZpZXcgbW9kZSAoYnV0dG9ucyBtYWtlIHNlbnNlKVxyXG5cdCAqIC0gYW55IG90aGVyIHRhYiA9PiBkaXNhYmxlIHByZXZpZXcgbW9kZSArIHJlc2V0IGJ1c3kgc3RhdGVzXHJcblx0ICpcclxuXHQgKiBJTVBPUlRBTlQ6XHJcblx0ICogLSBXZSBkbyBOT1QgY2hhbmdlIHRoZSBhY3RpdmUgdG9wIHRhYiBoZXJlIChubyBwYW5lbCBzd2l0Y2hpbmcpLlxyXG5cdCAqICAgV2Ugb25seSBzeW5jIHByZXZpZXcgVUkgbW9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWJfaWRcclxuXHQgKiBAcGFyYW0ge3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50fSBjbGllbnRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19zeW5jX21vZGVfdG9fdGFiKHRhYl9pZCwgY2xpZW50KSB7XHJcblxyXG5cdFx0dGFiX2lkID0gU3RyaW5nKCB0YWJfaWQgfHwgJycgKTtcclxuXHJcblx0XHRpZiAoICFjbGllbnQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICdwcmV2aWV3X3RhYicgPT09IHRhYl9pZCApIHtcclxuXHRcdFx0Y2xpZW50LnNldF9tb2RlKCAncHJldmlldycgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExlYXZpbmcgcHJldmlldyAtPiBzb2Z0LWNhbmNlbCBidXN5IHN0YXRlIGFuZCBoaWRlIHByZXZpZXctc3BlY2lmaWMgdG9vbGJhci5cclxuXHRcdGlmICggdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0fVxyXG5cdFx0Y2xpZW50LnNldF9tb2RlKCAnYnVpbGRlcicgKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJpbmQgdG8gdG9wLXRhYiBzd2l0Y2ggZXZlbnQgZW1pdHRlZCBieSBiZmItdG9wLXRhYnMuanMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50fSBjbGllbnRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19iaW5kX3RvcF90YWJfZXZlbnRzKGNsaWVudCkge1xyXG5cclxuXHRcdC8vIFN5bmMgaW1tZWRpYXRlbHkgKGluIGNhc2UgZXZlbnQgYWxyZWFkeSBmaXJlZCBiZWZvcmUgdGhpcyBzY3JpcHQgaW5pdCkuXHJcblx0XHR3cGJjX2JmYl9wcmV2aWV3X19zeW5jX21vZGVfdG9fdGFiKCB3cGJjX2JmYl9wcmV2aWV3X19nZXRfYWN0aXZlX3RvcF90YWJfaWQoKSwgY2xpZW50ICk7XHJcblxyXG5cdFx0Ly8gUmVhY3QgdG8gZnV0dXJlIHRhYiBjaGFuZ2VzLlxyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6dG9wLXRhYicsIGZ1bmN0aW9uIChldikge1xyXG5cdFx0XHR2YXIgZGV0ICAgICA9IChldiAmJiBldi5kZXRhaWwpID8gZXYuZGV0YWlsIDoge307XHJcblx0XHRcdHZhciB0YWJfaWQgID0gZGV0LnRhYiA/IFN0cmluZyggZGV0LnRhYiApIDogJyc7XHJcblx0XHRcdHZhciBuYXZfaWQgID0gZGV0Lm5hdl9pZCA/IFN0cmluZyggZGV0Lm5hdl9pZCApIDogJyc7XHJcblx0XHRcdHZhciBwcmV2X2lkID0gZGV0LnByZXZfdGFiID8gU3RyaW5nKCBkZXQucHJldl90YWIgKSA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gSWYgdXNlciBzd2l0Y2hlZCB0byBwcmV2aWV3X3RhYiBpbiB0aGUgTUFJTiB0b3AgbmF2LFxyXG5cdFx0XHQvLyByZW1lbWJlciB3aGF0IHRhYiB0aGV5IGNhbWUgZnJvbS5cclxuXHRcdFx0aWYgKCBuYXZfaWQgPT09IFRPUF9OQVZfSUQgJiYgdGFiX2lkID09PSAncHJldmlld190YWInICYmIHByZXZfaWQgJiYgcHJldl9pZCAhPT0gJ3ByZXZpZXdfdGFiJyApIHtcclxuXHRcdFx0XHRyZXR1cm5fdGFiX2lkID0gcHJldl9pZDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d3BiY19iZmJfcHJldmlld19fc3luY19tb2RlX3RvX3RhYiggdGFiX2lkLCBjbGllbnQgKTtcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gLS0gQmluZCB8IEluaXQgb24gTG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgVE9QX05BVl9JRCA9ICd3cGJjX2JmYl9fdG9wX2hvcmlzb250YWxfbmF2JztcclxuXHR2YXIgcmV0dXJuX3RhYl9pZCA9ICdidWlsZGVyX3RhYic7XHJcblxyXG5cdGZ1bmN0aW9uIHJlbWVtYmVyX3JldHVybl90YWJfZnJvbV9kb20oKSB7XHJcblx0XHR2YXIgY3VyID0gd3BiY19iZmJfcHJldmlld19fZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCk7XHJcblx0XHRpZiAoY3VyICYmIGN1ciAhPT0gJ3ByZXZpZXdfdGFiJykge1xyXG5cdFx0XHRyZXR1cm5fdGFiX2lkID0gY3VyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0X3JldHVybl90YWJfaWQoKSB7XHJcblx0XHR2YXIgdCA9IFN0cmluZyhyZXR1cm5fdGFiX2lkIHx8ICcnKS50cmltKCk7XHJcblx0XHRpZiAoIXQgfHwgdCA9PT0gJ3ByZXZpZXdfdGFiJykgdCA9ICdidWlsZGVyX3RhYic7XHJcblx0XHRyZXR1cm4gdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF1dG8taW5pdCBwcmV2aWV3IGNsaWVudCBvbiBCdWlsZGVyIHBhZ2UgYW5kIHdpcmUgdG9wIHRvb2xiYXIgYnV0dG9ucy5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9pbml0X3ByZXZpZXdfY2xpZW50KCkge1xyXG5cdFx0dmFyIHJvb3QgPSBkLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJmYi1wcmV2aWV3LXJvb3Q9XCIxXCJdJyApO1xyXG5cclxuXHRcdGlmICggIXJvb3QgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgY2xpZW50ID0gbmV3IHdwYmNfYmZiX3ByZXZpZXdfY2xpZW50KCByb290ICk7XHJcblxyXG5cdFx0aWYgKCAhdy5XUEJDX0JGQl9QcmV2aWV3ICkge1xyXG5cdFx0XHR3LldQQkNfQkZCX1ByZXZpZXcgPSB7XHJcblx0XHRcdFx0Y2xpZW50OiBjbGllbnQsXHJcblxyXG5cdFx0XHRcdHNob3dfcHJldmlldzogZnVuY3Rpb24gKG9wdHMpIHtcclxuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRzIHx8IHt9O1xyXG5cdFx0XHRcdFx0dmFyIHNyYyA9IG9wdC5zb3VyY2VfYnV0dG9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hlcmUgd2Ugd2VyZSBCRUZPUkUgc3dpdGNoaW5nIHRvIHByZXZpZXcuXHJcblx0XHRcdFx0XHRyZW1lbWJlcl9yZXR1cm5fdGFiX2Zyb21fZG9tKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfdGFiX2xpbmsoIHNyYyApICkge1xyXG5cdFx0XHRcdFx0XHR3cGJjX2JmYl9fYWN0aXZhdGVfcGFuZWxfdGFiKCAncHJldmlld190YWInICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gRW5hYmxlIHByZXZpZXcgbW9kZSBVSSAoc2hvd3MgcmVmcmVzaC9iYWNrIGJ1dHRvbnMgZXRjKS5cclxuXHRcdFx0XHRcdGNsaWVudC5zZXRfbW9kZSggJ3ByZXZpZXcnICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSU1QT1JUQU5UOiBBbHdheXMgcmVnZW5lcmF0ZSB3aGVuIHNob3dfcHJldmlldygpIGlzIGNhbGxlZCAoUHJldmlldyB0YWIgY2xpY2sgaW5jbHVkZWQpLlxyXG5cdFx0XHRcdFx0Y2xpZW50LnVwZGF0ZV9wcmV2aWV3KCB7IHNvdXJjZV9idXR0b246IHNyYyB9ICk7XHJcblx0XHRcdFx0fSxcclxuXHJcblxyXG5cdFx0XHRcdHNob3dfYnVpbGRlcjogZnVuY3Rpb24gKG9wdHMpIHtcclxuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRzIHx8IHt9O1xyXG5cdFx0XHRcdFx0dmFyIHNyYyA9IG9wdC5zb3VyY2VfYnV0dG9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjbGllbnQgJiYgdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBiYWNrX3RvID0gZ2V0X3JldHVybl90YWJfaWQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBJZiBCYWNrIGJ1dHRvbiBpdHNlbGYgaXMgbm90IGEgcmVhbCB0YWIgbGluayAtPiBqdXN0IGFjdGl2YXRlIHJlbWVtYmVyZWQgdGFiLlxyXG5cdFx0XHRcdFx0Ly8gSWYgYWN0aXZhdGlvbiBmYWlscyAodGFiIHJlbW92ZWQpLCBmYWxsYmFjayB0byBidWlsZGVyX3RhYi5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19pc19idWlsZGVyX3RhYl9saW5rKCBzcmMgKSApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX19hY3RpdmF0ZV9wYW5lbF90YWIoIGJhY2tfdG8gKSApIHtcclxuXHRcdFx0XHRcdFx0XHR3cGJjX2JmYl9fYWN0aXZhdGVfcGFuZWxfdGFiKCAnYnVpbGRlcl90YWInICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjbGllbnQuc2V0X21vZGUoICdidWlsZGVyJyApO1xyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdHNob3dfYWR2YW5jZWRfdGFiOiBmdW5jdGlvbiAob3B0cykge1xyXG5cdFx0XHRcdFx0dmFyIG9wdCA9IG9wdHMgfHwge307XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjbGllbnQgJiYgdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0d3BiY19iZmJfX2FjdGl2YXRlX3BhbmVsX3RhYiggJ2FkdmFuY2VkX3RhYicgKTtcclxuXHRcdFx0XHRcdGNsaWVudC5zZXRfbW9kZSggJ2J1aWxkZXInICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTGlzdGVuIGZvciB0b3AtdGFiIGNoYW5nZXMgYW5kIHN5bmMgcHJldmlldyBtb2RlIGF1dG9tYXRpY2FsbHkuXHJcblx0XHR3cGJjX2JmYl9wcmV2aWV3X19iaW5kX3RvcF90YWJfZXZlbnRzKCBjbGllbnQgKTtcclxuXHJcblx0XHQvLyBXaGVuIGEgZm9ybSBpcyBsb2FkZWQgdmlhIEFKQVgsIHJlZnJlc2ggcHJldmlldyAob25seSBpZiBwcmV2aWV3IG1vZGUgaXMgYWN0aXZlKS5cclxuXHRcdHdwYmNfYmZiX3ByZXZpZXdfX2JpbmRfZm9ybV9hamF4X2xvYWRlZF9ldmVudHMoIGNsaWVudCApO1xyXG5cclxuXHRcdHdwYmNfYmZiX2JpbmRfdG9wX3Rvb2xiYXJfYnV0dG9ucyggY2xpZW50ICk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQmluZCB0b3AgdG9vbGJhciBCdWlsZGVyIC8gUHJldmlldyAvIFJlZnJlc2ggYnV0dG9ucy5cclxuXHQgKiBTdXBwb3J0cyBtdWx0aXBsZSBlbGVtZW50cyBmb3IgZWFjaCBhY3Rpb24gKHRvb2xiYXIgYnV0dG9ucywgdG9wIHRhYnMsIGV0Yy4pXHJcblx0ICogdmlhIGRhdGEtd3BiYy1iZmItdG9wLSotYnRuPVwiMVwiLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX2JpbmRfdG9wX3Rvb2xiYXJfYnV0dG9ucyhjbGllbnQpIHtcclxuXHJcblx0XHR2YXIgYnRuX3ByZXZpZXdfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1wcmV2aWV3LWJ0bj1cIjFcIl0nICk7XHJcblx0XHR2YXIgYnRuX2J1aWxkZXJfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1idWlsZGVyLWJ0bj1cIjFcIl0nICk7XHJcblx0XHR2YXIgYnRuX3JlZnJlc2hfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1yZWZyZXNoLWJ0bj1cIjFcIl0nICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZm9yX2VhY2hfbm9kZShsaXN0LCBjYikge1xyXG5cdFx0XHRpZiAoICFsaXN0IHx8ICFsaXN0Lmxlbmd0aCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggbGlzdCwgZnVuY3Rpb24gKGVsKSB7XHJcblx0XHRcdFx0aWYgKCBlbCAmJiB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRjYiggZWwgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmb3JfZWFjaF9ub2RlKCBidG5fcHJldmlld19saXN0LCBmdW5jdGlvbiAoYnRuX3ByZXZpZXcpIHtcclxuXHJcblx0XHRcdC8vIFByZXZlbnQgZG91YmxlIGJpbmRpbmcgaWYgdGhpcyBzY3JpcHQgcnVucyB0d2ljZS5cclxuXHRcdFx0aWYgKCBidG5fcHJldmlldy5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWJvdW5kJyApID09PSAnMScgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJ0bl9wcmV2aWV3LnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItYm91bmQnLCAnMScgKTtcclxuXHJcblx0XHRcdGJ0bl9wcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIHcuV1BCQ19CRkJfUHJldmlldyAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9QcmV2aWV3LnNob3dfcHJldmlldyA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdHcuV1BCQ19CRkJfUHJldmlldy5zaG93X3ByZXZpZXcoIHtcclxuXHRcdFx0XHRcdFx0c291cmNlX2J1dHRvbjogYnRuX3ByZXZpZXdcclxuXHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH0gKTtcclxuXHJcblx0XHRmb3JfZWFjaF9ub2RlKCBidG5fcmVmcmVzaF9saXN0LCBmdW5jdGlvbiAoYnRuX3JlZnJlc2gpIHtcclxuXHJcblx0XHRcdGlmICggYnRuX3JlZnJlc2guZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1ib3VuZCcgKSA9PT0gJzEnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRidG5fcmVmcmVzaC5zZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWJvdW5kJywgJzEnICk7XHJcblxyXG5cdFx0XHRidG5fcmVmcmVzaC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0aWYgKCB3LldQQkNfQkZCX1ByZXZpZXcgJiYgdHlwZW9mIHcuV1BCQ19CRkJfUHJldmlldy5zaG93X3ByZXZpZXcgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHR3LldQQkNfQkZCX1ByZXZpZXcuc2hvd19wcmV2aWV3KCB7XHJcblx0XHRcdFx0XHRcdHVwZGF0ZSAgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHRcdHNvdXJjZV9idXR0b246IGJ0bl9yZWZyZXNoXHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Zm9yX2VhY2hfbm9kZSggYnRuX2J1aWxkZXJfbGlzdCwgZnVuY3Rpb24gKGJ0bl9idWlsZGVyKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJ0bl9idWlsZGVyLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItYm91bmQnICkgPT09ICcxJyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0YnRuX2J1aWxkZXIuc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1ib3VuZCcsICcxJyApO1xyXG5cclxuXHRcdFx0YnRuX2J1aWxkZXIuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGlmICggdy5XUEJDX0JGQl9QcmV2aWV3ICYmIHR5cGVvZiB3LldQQkNfQkZCX1ByZXZpZXcuc2hvd19idWlsZGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0dy5XUEJDX0JGQl9QcmV2aWV3LnNob3dfYnVpbGRlciggeyBzb3VyY2VfYnV0dG9uOiBidG5fYnVpbGRlciB9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0aWYgKCBkLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgZC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnICkge1xyXG5cdFx0c2V0VGltZW91dCggd3BiY19iZmJfaW5pdF9wcmV2aWV3X2NsaWVudCwgMCApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRkLmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgd3BiY19iZmJfaW5pdF9wcmV2aWV3X2NsaWVudCApO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEIsWUFBWTs7RUFFWjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0VBQ0MsSUFBSUMs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
942