PageSourceSearch

https://www.fairfieldhistory.org/wp-content/plugins/booking/includ…/_out/booking-appointment.js?ver=11.8.4

js fairfieldhistory.org collected 2026-09-26 02:55:57 UTC 149,316 bytes, 954 lines download raw bytes

1"use strict";
2
3(function (window, $) {
4  'use strict';
5
6  var config = window.wpbc_booking_appointment_config || {};
7  var active_native_contexts = {};
8  var loaded_script_urls = {};
9  $('script[src]').each(function () {
10    loaded_script_urls[String(this.src || '')] = true;
11  });
12
13  /** Return a normalized integer from a selector field. */
14  function get_selected_id($form, name) {
15    return Number($form.find('[name="' + name + '"]:checked, [name="' + name + '"][type="hidden"]').first().val() || 0);
16  }
17
18  /**
19   * Apply public text search to one server-authorized Appointment catalog.
20   *
21   * @param {jQuery} $catalog Appointment catalog root.
22   * @return {void}
23   */
24  function filter_appointment_catalog($catalog) {
25    var search_term = String($catalog.find('[data-wpbc-appointment-catalog-search]').val() || '').toLocaleLowerCase().trim();
26    var catalog_type = String($catalog.attr('data-catalog-type') || 'services');
27    var visible_count = 0;
28    $catalog.find('[data-wpbc-appointment-catalog-card]').each(function () {
29      var $card = $(this);
30      var searchable_text = String($card.attr('data-appointment-catalog-search') || '').toLocaleLowerCase();
31      var is_visible = !search_term || searchable_text.indexOf(search_term) !== -1;
32      var $choice_input = $card.find('input[type="radio"]').first();
33      $card.prop('hidden', !is_visible);
34      $choice_input.prop('disabled', !is_visible);
35      if (is_visible) {
36        visible_count += 1;
37      } else if ($choice_input.prop('checked')) {
38        $choice_input.prop('checked', false);
39        $card.removeClass('is-selected');
40      }
41    });
42    $catalog.find('[data-wpbc-appointment-catalog-empty]').prop('hidden', 0 !== visible_count);
43    $catalog.find('[data-wpbc-appointment-catalog-status]').text(String(visible_count) + ' ' + ('providers' === catalog_type ? 1 === visible_count ? config.provider_found || 'Provider found.' : config.providers_found || 'Providers found.' : 1 === visible_count ? config.service_found || 'Service found.' : config.services_found || 'Services found.'));
44  }
45
46  /** Toggle one component loading state without clearing its current stage. */
47  function set_loading($root, is_loading) {
48    $root.toggleClass('is-loading', is_loading).attr('aria-busy', is_loading ? 'true' : 'false');
49    $root.find('> .wpbc_booking_appointment__stage').attr('aria-busy', is_loading ? 'true' : 'false');
50    $root.find('> .wpbc_booking_appointment__loading').prop('hidden', !is_loading).attr('aria-hidden', is_loading ? 'false' : 'true');
51    $root.find('.wpbc_booking_appointment__selection_form :input').prop('disabled', is_loading);
52    if (!is_loading) {
53      $root.find('[data-wpbc-appointment-catalog]').each(function () {
54        filter_appointment_catalog($(this));
55      });
56    }
57  }
58
59  /**
60   * Display and focus an AJAX or initialization error in one component.
61   *
62   * @param {jQuery} $root        Appointment component root.
63   * @param {string} message      Error message.
64   * @param {string} action_url   Optional trusted administration action URL.
65   * @param {string} action_label Optional action link label.
66   * @return {void}
67   */
68  function show_error($root, message, action_url, action_label) {
69    var $notice = $root.find('> .wpbc_booking_appointment__ajax_notice');
70    $notice.empty().append($('<span>').text(message || config.error || 'Unable to load the Appointment form.'));
71    if (action_url && action_label) {
72      $notice.append(' ', $('<a>', {
73        'class': 'wpbc_booking_appointment__notice_action',
74        href: action_url,
75        text: action_label
76      }));
77    }
78    $notice.prop('hidden', false);
79    if ($notice.get(0) && typeof $notice.get(0).focus === 'function') {
80      $notice.trigger('focus');
81    }
82  }
83
84  /** Clear the component AJAX error. */
85  function clear_error($root) {
86    $root.find('> .wpbc_booking_appointment__ajax_notice').empty().prop('hidden', true);
87  }
88
89  /** Return a registered native context only while its DOM element is live. */
90  function get_native_context(provider_id) {
91    provider_id = Number(provider_id || 0);
92    var context = active_native_contexts[provider_id];
93    if (!context || !context.element || !document.documentElement.contains(context.element)) {
94      delete active_native_contexts[provider_id];
95      return null;
96    }
97    return context;
98  }
99
100  /** Detect another live native Booking Calendar form for the same Provider. */
101  function has_duplicate_provider_form($root, provider_id) {
102    provider_id = Number(provider_id || 0);
103    if (!provider_id) {
104      return false;
105    }
106    var context = get_native_context(provider_id);
107    if (context && !$.contains($root.get(0), context.element)) {
108      return true;
109    }
110    return $('[id="booking_form' + provider_id + '"]').filter(function () {
111      return !$.contains($root.get(0), this);
112    }).length > 0;
113  }
114
115  /** Register the exact signed native form context used by booking submission. */
116  function register_native_form($native) {
117    var provider_id = Number($native.data('provider-id') || 0);
118    var service_id = Number($native.data('service-id') || 0);
119    var context_token = String($native.attr('data-appointment-context-token') || '');
120    var allow_past = '1' === String($native.attr('data-allow-past') || '0') ? 1 : 0;
121    var existing = get_native_context(provider_id);
122    if (!provider_id || !service_id || !context_token) {
123      return false;
124    }
125    if (existing && existing.element !== $native.get(0)) {
126      return false;
127    }
128    active_native_contexts[provider_id] = {
129      element: $native.get(0),
130      service_id: service_id,
131      provider_id: provider_id,
132      context_token: context_token,
133      allow_past: allow_past
134    };
135    return true;
136  }
137
138  /** Remove a native form from the local submission-context registry. */
139  function unregister_native_form($native) {
140    var provider_id = Number($native.data('provider-id') || 0);
141    var context = get_native_context(provider_id);
142    if (context && context.element === $native.get(0)) {
143      delete active_native_contexts[provider_id];
144    }
145  }
146
147  /** Return the native Start Time field used by the fixed Service duration. */
148  function get_start_time_field($native) {
149    var provider_id = Number($native.data('provider-id') || 0);
150    return $native.find('[name="starttime' + provider_id + '"], [name="starttime' + provider_id + '[]"]').not('[data-wpbc-booking-submit-ignore="1"]').first();
151  }
152
153  /** Return selected calendar dates in the server's strict SQL-date format. */
154  function get_selected_dates($native) {
155    var provider_id = Number($native.data('provider-id') || 0);
156    if (provider_id && typeof window.wpbc_get__selected_dates_sql__as_arr === 'function') {
157      return window.wpbc_get__selected_dates_sql__as_arr(provider_id);
158    }
159    var value = String($native.find('#date_booking' + provider_id).val() || '');
160    return value.split(',').map(function (date_value) {
161      var parts = $.trim(date_value).split('.');
162      return 3 === parts.length ? parts[2] + '-' + parts[1] + '-' + parts[0] : '';
163    }).filter(function (date_value) {
164      return /^\d{4}-\d{2}-\d{2}$/.test(date_value);
165    });
166  }
167
168  /** Read the current date/start selection and its stable request signature. */
169  function get_time_selection($native) {
170    var $start = get_start_time_field($native);
171    var dates = get_selected_dates($native);
172    var start_time = $start.length ? String($start.val() || '') : '';
173    return {
174      $start: $start,
175      dates: dates,
176      start_time: start_time,
177      complete: !!(dates.length && /^\d{1,2}:\d{2}(?::\d{2})?$/.test(start_time)),
178      signature: dates.join(',') + '|' + start_time
179    };
180  }
181
182  /** Determine whether the Start Time field belongs to the visible wizard step. */
183  function is_time_selection_stage_active(selection) {
184    var $step = selection.$start.closest('.wpbc_wizard_step');
185    return !$step.length || $step.is(':visible') && !$step.hasClass('wpbc_wizard_step_hidden');
186  }
187
188  /** Find the visible Start Time UI beneath which validation is explained. */
189  function get_time_notice_anchor(selection) {
190    var $picker = selection.$start.nextAll('.wpbc_times_selector').first();
191    return $picker.length ? $picker : selection.$start;
192  }
193
194  /** Remove the Appointment buffer warning and invalid field semantics. */
195  function clear_time_notice($native) {
196    $native.find('.wpbc_booking_appointment__time_notice').remove();
197    get_start_time_field($native).removeAttr('aria-invalid').nextAll('.wpbc_times_selector').first().removeAttr('aria-invalid');
198  }
199
200  /** Show a persistent warning using Booking Calendar's frontend message UI. */
201  function show_time_notice($native, selection, message) {
202    clear_time_notice($native);
203    var $anchor = get_time_notice_anchor(selection);
204    if (!$anchor.length) {
205      $anchor = $native.find('.bk_calendar_frame').first();
206    }
207    if (!$anchor.length) {
208      return;
209    }
210    selection.$start.attr('aria-invalid', 'true').nextAll('.wpbc_times_selector').first().attr('aria-invalid', 'true');
211    $('<div>', {
212      'class': 'wpbc_booking_appointment__time_notice wpbc_front_end__message wpbc_fe_message wpbc_fe_message_warning',
213      role: 'alert'
214    }).append($('<i>', {
215      'class': 'menu_icon icon-1x wpbc_icn_warning',
216      'aria-hidden': 'true'
217    })).append($('<span>').text(message || config.validation_error || config.error)).insertAfter($anchor);
218  }
219
220  /** Return or initialize the validation state owned by one native form. */
221  function get_time_validation_state($native) {
222    var state = $native.data('wpbc-appointment-time-validation');
223    if (!state) {
224      state = {
225        sequence: 0,
226        signature: '',
227        status: 'incomplete',
228        request: null,
229        promise: null,
230        timer: null,
231        availability_sequence: 0,
232        availability_request: null,
233        availability_timer: null,
234        available_slots: {}
235      };
236      $native.data('wpbc-appointment-time-validation', state);
237    }
238    return state;
239  }
240
241  /** Restore only option state previously owned by the Appointment filter. */
242  function clear_appointment_disabled_times($start) {
243    $start.find('option[data-wpbc-appointment-unavailable="1"]').each(function () {
244      var $option = $(this);
245      if (!$option.hasClass('booked')) {
246        $option.prop('disabled', false);
247      }
248      $option.removeAttr('data-wpbc-appointment-unavailable');
249    });
250  }
251
252  /** Rebuild the optional plate-style picker from the filtered native select. */
253  function refresh_start_time_picker($start) {
254    if ($start.length && typeof $start.wpbc_timeselector === 'function' && $start.nextAll('.wpbc_times_selector').length) {
255      $start.wpbc_timeselector();
256    }
257  }
258
259  /** Read all options still allowed by the ordinary Booking Calendar engine. */
260  function get_core_available_start_times($start) {
261    var values = [];
262    $start.find('option').each(function () {
263      var $option = $(this);
264      var value = String($option.val() || '');
265      var appointment_disabled = '1' === String($option.attr('data-wpbc-appointment-unavailable') || '');
266      if (/^\d{1,2}:\d{2}(?::\d{2})?$/.test(value) && (!$option.prop('disabled') || appointment_disabled && !$option.hasClass('booked'))) {
267        values.push(value);
268      }
269    });
270    return values;
271  }
272
273  /** Convert a browser time string to minutes from the start of its day. */
274  function debug_time_to_minutes(time_value) {
275    var parts = String(time_value || '').split(':');
276    if (parts.length < 2) {
277      return null;
278    }
279    return Number(parts[0]) * 60 + Number(parts[1]);
280  }
281
282  /** Format debug time while retaining a previous/next-day boundary. */
283  function debug_format_minutes(total_minutes) {
284    var day_offset = 0;
285    while (total_minutes < 0) {
286      total_minutes += 1440;
287      day_offset--;
288    }
289    while (total_minutes >= 1440) {
290      total_minutes -= 1440;
291      day_offset++;
292    }
293    var hours = ('0' + Math.floor(total_minutes / 60)).slice(-2);
294    var minutes = ('0' + total_minutes % 60).slice(-2);
295    return hours + ':' + minutes + (day_offset ? ' (' + (day_offset > 0 ? '+' : '') + day_offset + ' day)' : '');
296  }
297
298  /** Explain the asynchronous Service-aware availability pass in the console. */
299  function log_start_time_filter_request($native, dates, start_times) {
300    if (!window.console || typeof window.console.info !== 'function') {
301      return;
302    }
303    window.console.info('[Booking Calendar Appointment] Rechecking Start Times with Service duration and buffers. The initial list comes from Provider calendar availability and may now be reduced.', {
304      service_id: Number($native.data('service-id') || 0),
305      provider_id: Number($native.data('provider-id') || 0),
306      dates: dates.slice(0),
307      initial_start_times: start_times.slice(0)
308    });
309  }
310
311  /** Log only scheduling data needed to understand removed Start Times. */
312  function log_start_time_filter_result($native, dates, data) {
313    if (!window.console || typeof window.console.info !== 'function') {
314      return;
315    }
316    var buffer_before = Number(data.buffer_before || 0);
317    var buffer_after = Number(data.buffer_after || 0);
318    var blocked = [];
319    Object.keys(data.slots || {}).forEach(function (start_time) {
320      var result = data.slots[start_time];
321      if (!result || false !== result.valid) {
322        return;
323      }
324      var end_time = String(result.end_time || '');
325      var start_minutes = debug_time_to_minutes(start_time);
326      var end_minutes = debug_time_to_minutes(end_time);
327      blocked.push({
328        start_time: start_time,
329        appointment_time: end_time ? start_time + ' - ' + end_time : start_time,
330        provider_reserved: null !== start_minutes && null !== end_minutes ? debug_format_minutes(start_minutes - buffer_before) + ' - ' + debug_format_minutes(end_minutes + buffer_after) : '',
331        reason: result.message || result.code || config.validation_error
332      });
333    });
334    window.console.info('[Booking Calendar Appointment] Service-aware Start Time check completed.', {
335      service_id: Number($native.data('service-id') || 0),
336      provider_id: Number($native.data('provider-id') || 0),
337      dates: dates.slice(0),
338      duration_minutes: Number(data.duration || 0),
339      buffer_before_minutes: buffer_before,
340      buffer_after_minutes: buffer_after,
341      blocked_start_times: blocked.map(function (item) {
342        return item.start_time;
343      })
344    });
345    if (blocked.length && typeof window.console.table === 'function') {
346      window.console.table(blocked);
347    }
348  }
349
350  /** Apply one server response without exposing another customer's booking. */
351  function apply_available_start_times($native, slots) {
352    var selection = get_time_selection($native);
353    var $start = selection.$start;
354    var selected_value = selection.start_time;
355    var selected_message = '';
356    clear_appointment_disabled_times($start);
357    $start.find('option').each(function () {
358      var $option = $(this);
359      var value = String($option.val() || '');
360      var result = slots && slots[value] ? slots[value] : null;
361      if (result && false === result.valid && !$option.hasClass('booked')) {
362        $option.prop('disabled', true).attr('data-wpbc-appointment-unavailable', '1');
363        if (selected_value === value) {
364          selected_message = result.message || config.validation_error;
365        }
366      }
367    });
368    if (selected_message) {
369      $start.val('');
370      show_time_notice($native, selection, selected_message);
371    }
372    refresh_start_time_picker($start);
373  }
374
375  /** Filter the complete Start Time list with one bounded server request. */
376  function load_available_start_times($native) {
377    var state = get_time_validation_state($native);
378    var $start = get_start_time_field($native);
379    var dates = get_selected_dates($native);
380    var start_times = get_core_available_start_times($start);
381    var sequence = ++state.availability_sequence;
382    if (state.availability_request && 4 !== state.availability_request.readyState) {
383      state.availability_request.abort();
384    }
385    if (!$start.length || !dates.length || !start_times.length) {
386      clear_appointment_disabled_times($start);
387      refresh_start_time_picker($start);
388      state.available_slots = {};
389      return;
390    }
391    log_start_time_filter_request($native, dates, start_times);
392    state.availability_request = $.post(config.ajax_url, {
393      action: config.validate_action,
394      nonce: config.nonce,
395      service_id: Number($native.data('service-id') || 0),
396      provider_id: Number($native.data('provider-id') || 0),
397      context_token: String($native.attr('data-appointment-context-token') || ''),
398      dates: dates,
399      start_times: start_times
400    });
401    state.availability_request.done(function (response) {
402      if (sequence !== state.availability_sequence) {
403        return;
404      }
405      var data = response && response.data ? response.data : {};
406      if (!response || !response.success || !data.slots) {
407        return;
408      }
409      state.available_slots = data.slots;
410      log_start_time_filter_result($native, dates, data);
411      apply_available_start_times($native, data.slots);
412    }).fail(function (xhr, status) {
413      if ('abort' === status || sequence !== state.availability_sequence) {
414        return;
415      }
416      clear_appointment_disabled_times($start);
417      refresh_start_time_picker($start);
418      state.available_slots = {};
419    });
420  }
421
422  /** Debounce the whole-list filter after core availability has refreshed. */
423  function schedule_available_start_times($native) {
424    var state = get_time_validation_state($native);
425    window.clearTimeout(state.availability_timer);
426    state.availability_timer = window.setTimeout(function () {
427      load_available_start_times($native);
428    }, 30);
429  }
430
431  /** Validate current Service duration/buffers through the authoritative server. */
432  function validate_time_selection($native) {
433    var selection = get_time_selection($native);
434    var state = get_time_validation_state($native);
435    if (!selection.complete) {
436      if (state.request && 4 !== state.request.readyState) {
437        state.request.abort();
438      }
439      state.signature = selection.signature;
440      state.status = 'incomplete';
441      state.promise = null;
442      clear_time_notice($native);
443      return $.Deferred().resolve(false, 'incomplete').promise();
444    }
445    if (selection.signature === state.signature && 'valid' === state.status) {
446      return $.Deferred().resolve(true, 'valid').promise();
447    }
448    if (selection.signature === state.signature && 'invalid' === state.status) {
449      return $.Deferred().resolve(false, 'invalid').promise();
450    }
451    if (selection.signature === state.signature && 'pending' === state.status && state.promise) {
452      return state.promise;
453    }
454    if (state.request && 4 !== state.request.readyState) {
455      state.request.abort();
456    }
457    var deferred = $.Deferred();
458    var sequence = ++state.sequence;
459    state.signature = selection.signature;
460    state.status = 'pending';
461    state.promise = deferred.promise();
462    clear_time_notice($native);
463    state.request = $.post(config.ajax_url, {
464      action: config.validate_action,
465      nonce: config.nonce,
466      service_id: Number($native.data('service-id') || 0),
467      provider_id: Number($native.data('provider-id') || 0),
468      context_token: String($native.attr('data-appointment-context-token') || ''),
469      dates: selection.dates,
470      start_time: selection.start_time
471    });
472    state.request.done(function (response) {
473      if (sequence !== state.sequence || selection.signature !== get_time_selection($native).signature) {
474        deferred.reject('stale');
475        return;
476      }
477      var data = response && response.data ? response.data : {};
478      if (response && response.success && true === data.valid) {
479        state.status = 'valid';
480        clear_time_notice($native);
481        deferred.resolve(true, 'valid');
482        return;
483      }
484      state.status = 'invalid';
485      show_time_notice($native, selection, data.message || config.validation_error);
486      deferred.resolve(false, 'invalid');
487    }).fail(function (xhr, status) {
488      if ('abort' === status || sequence !== state.sequence) {
489        deferred.reject('stale');
490        return;
491      }
492      var response = xhr.responseJSON;
493      var message = response && response.data && response.data.message ? response.data.message : config.validation_error;
494      state.status = 'invalid';
495      show_time_notice($native, selection, message);
496      deferred.resolve(false, 'invalid');
497    });
498    return state.promise;
499  }
500
501  /** Debounce validation after calendar or Start Time changes. */
502  function schedule_time_validation($native) {
503    var state = get_time_validation_state($native);
504    window.clearTimeout(state.timer);
505    state.status = 'changed';
506    clear_time_notice($native);
507    if (!is_time_selection_stage_active(get_time_selection($native))) {
508      return;
509    }
510    state.timer = window.setTimeout(function () {
511      validate_time_selection($native);
512    }, 120);
513  }
514
515  /** Block forward wizard navigation until the current time preflight passes. */
516  function capture_wizard_navigation(event, $native) {
517    var $button = $(event.target).closest('.wpbc_wizard_step_button');
518    if (!$button.length || !$.contains($native.get(0), $button.get(0))) {
519      return;
520    }
521    if ($button.get(0).wpbc_appointment_preflight_bypass) {
522      $button.get(0).wpbc_appointment_preflight_bypass = false;
523      return;
524    }
525    var target_match = String($button.attr('class') || '').match(/wpbc_wizard_step_(\d+)/);
526    var current_match = String($button.closest('.wpbc_wizard_step').attr('class') || '').match(/wpbc_wizard_step(\d+)/);
527    if (!target_match || current_match && Number(target_match[1]) <= Number(current_match[1])) {
528      return;
529    }
530    var selection = get_time_selection($native);
531    var $current_step = $button.closest('.wpbc_wizard_step');
532    var $time_step = selection.$start.closest('.wpbc_wizard_step');
533    if ($time_step.length && $current_step.length && $time_step.get(0) !== $current_step.get(0)) {
534      return;
535    }
536    if (!selection.complete) {
537      return;
538    }
539    var state = get_time_validation_state($native);
540    if (selection.signature === state.signature && 'valid' === state.status) {
541      return;
542    }
543    event.preventDefault();
544    event.stopImmediatePropagation();
545    validate_time_selection($native).done(function (valid) {
546      if (valid && document.documentElement.contains($button.get(0))) {
547        $button.get(0).wpbc_appointment_preflight_bypass = true;
548        $button.get(0).click();
549      }
550    });
551  }
552
553  /** Attach isolated buffer preflight behavior to one native Appointment form. */
554  function initialize_time_preflight($native) {
555    if (!config.ajax_url || !config.validate_action || !$native.length) {
556      return;
557    }
558    var native_element = $native.get(0);
559    if (native_element.wpbc_appointment_time_preflight_ready) {
560      return;
561    }
562    native_element.wpbc_appointment_time_preflight_ready = true;
563    native_element.addEventListener('click', function (event) {
564      capture_wizard_navigation(event, $native);
565    }, true);
566    $native.on('change.wpbc_appointment_time_preflight', '[name^="starttime"]', function () {
567      schedule_time_validation($native);
568    });
569    $native.on('date_selected.wpbc_appointment_time_preflight wpbc_hook_timeslots_disabled.wpbc_appointment_time_preflight', function (event, provider_id) {
570      if (Number(provider_id || 0) === Number($native.data('provider-id') || 0)) {
571        schedule_available_start_times($native);
572        schedule_time_validation($native);
573      }
574    });
575    schedule_available_start_times($native);
576  }
577
578  /**
579   * Lock a native duration field to the selected Service duration.
580   *
581   * The core save handler independently derives duration from the Service row;
582   * this client step only keeps the visible form and serialized data aligned.
583   */
584  function prepare_native_form($scope) {
585    var $native = $scope.find('.wpbc_booking_appointment__native_form').first();
586    if (!$native.length) {
587      return true;
588    }
589    if (!register_native_form($native)) {
590      return false;
591    }
592    var resource_id = Number($native.data('provider-id') || 0);
593    var duration = String($native.data('duration') || '');
594    var field_name = 'durationtime' + resource_id;
595    var $form = $native.find('#booking_form' + resource_id);
596    $form.find('.wpbc_booking_appointment__duration_proxy').remove();
597    var $duration_fields = $form.find('[name="' + field_name + '"], [name="' + field_name + '[]"]');
598    var $derived_time_fields = $form.find('[name="endtime' + resource_id + '"], [name="endtime' + resource_id + '[]"], [name="rangetime' + resource_id + '"], [name="rangetime' + resource_id + '[]"]');
599    $duration_fields.each(function () {
600      var $field = $(this);
601      if ($field.is('select') && !$field.find('option[value="' + duration.replace(/"/g, '\\"') + '"]').length) {
602        $field.append($('<option>', {
603          value: duration,
604          text: duration
605        }));
606      }
607      $field.val(duration).prop('disabled', true).attr('aria-disabled', 'true');
608      $field.closest('.wpdev-form-control-wrap').addClass('wpbc_booking_appointment__fixed_duration_field');
609    });
610    $derived_time_fields.each(function () {
611      var $field = $(this);
612      $field.prop('disabled', true).attr('aria-disabled', 'true');
613      $field.closest('.wpdev-form-control-wrap').addClass('wpbc_booking_appointment__fixed_duration_field');
614    });
615    if (!$duration_fields.length) {
616      var $duration_proxy = $('<select>', {
617        name: field_name,
618        'class': 'wpbc_booking_appointment__duration_value',
619        'aria-hidden': 'true',
620        tabindex: '-1',
621        'data-wpbc-appointment-generated': '1'
622      }).append($('<option>', {
623        value: duration,
624        text: duration,
625        selected: true
626      }));
627      $form.append($('<span>', {
628        'class': 'wpdev-form-control-wrap wpbc_booking_appointment__fixed_duration_field wpbc_booking_appointment__duration_proxy',
629        'aria-hidden': 'true'
630      }).append($duration_proxy));
631    }
632    initialize_time_preflight($native);
633    return true;
634  }
635
636  /** Convert a script URL to the same absolute representation as DOM script.src. */
637  function get_absolute_script_url(url) {
638    var anchor = document.createElement('a');
639    anchor.href = String(url || '');
640    return anchor.href;
641  }
642
643  /** Execute renderer scripts sequentially while the request still owns the stage. */
644  function execute_scripts(scripts, owns_stage) {
645    var sequence = $.Deferred().resolve().promise();
646    $.each(scripts, function (index, script) {
647      sequence = sequence.then(function () {
648        if (!owns_stage()) {
649          return rejected_stage('');
650        }
651        if (script.src) {
652          var absolute_url = get_absolute_script_url(script.src);
653          if (loaded_script_urls[absolute_url]) {
654            return undefined;
655          }
656          return $.ajax({
657            url: absolute_url,
658            dataType: 'script',
659            cache: true
660          }).then(function () {
661            loaded_script_urls[absolute_url] = true;
662          });
663        }
664        if (script.code) {
665          $.globalEval(script.code);
666        }
667        return undefined;
668      });
669    });
670    return sequence;
671  }
672
673  /** Initialize controls whose core handlers normally bind on document ready. */
674  function initialize_ajax_form_controls() {
675    if (typeof window.wpbc_hook__init_booking_form_wizard_buttons === 'function') {
676      window.wpbc_hook__init_booking_form_wizard_buttons();
677    }
678  }
679
680  /** Destroy native calendar instances and unregister context before removal. */
681  function cleanup_native_form($root) {
682    $root.find('.wpbc_booking_appointment__native_form').each(function () {
683      var $native = $(this);
684      var resource_id = Number($native.data('provider-id') || 0);
685      var $calendar = $native.find('#calendar_booking' + resource_id);
686      unregister_native_form($native);
687      if (!resource_id || !$calendar.length || !$.datepick || typeof $calendar.datepick !== 'function') {
688        return;
689      }
690      try {
691        var instance = typeof $.datepick._getInst === 'function' ? $.datepick._getInst($calendar.get(0)) : null;
692        if (instance) {
693          $calendar.datepick('destroy');
694        }
695      } catch (error) {
696        $calendar.removeClass('hasDatepick');
697      }
698    });
699  }
700
701  /** Restore the previously selected Service when navigating back one stage. */
702  function restore_service_selection($root) {
703    var service_id = Number($root.attr('data-selected-service-id') || 0);
704    if (!service_id) {
705      return;
706    }
707    var $input = $root.find('.wpbc_booking_appointment__selection_form [n
707ame="wpbc_appointment_service"][value="' + service_id + '"]').first();
708    if ($input.length) {
709      $input.prop('checked', true).closest('.wpbc_booking_appointment__choice').addClass('is-selected');
710    }
711  }
712
713  /** Focus the new stage heading without forcing motion for reduced-motion users. */
714  function focus_stage($root) {
715    var $target = $root.find('> .wpbc_booking_appointment__stage .wpbc_booking_appointment__heading h3, > .wpbc_booking_appointment__stage .wpbc_booking_appointment__notice').first();
716    if ($target.length) {
717      $target.attr('tabindex', '-1');
718      try {
719        $target.get(0).focus({
720          preventScroll: true
721        });
722      } catch (error) {
723        $target.trigger('focus');
724      }
725    }
726    if ($root.get(0) && typeof $root.get(0).scrollIntoView === 'function') {
727      var reduce_motion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
728      $root.get(0).scrollIntoView({
729        behavior: reduce_motion ? 'auto' : 'smooth',
730        block: 'nearest'
731      });
732    }
733  }
734
735  /** Return a rejected promise carrying one controlled initialization message. */
736  function rejected_stage(message) {
737    var deferred = $.Deferred();
738    deferred.reject({
739      wpbc_message: message
740    });
741    return deferred.promise();
742  }
743
744  /** Replace a stage while guaranteeing DOM-before-script initialization order. */
745  function replace_stage($root, html, stage, provider_id, request_id) {
746    if (!is_current_request($root, request_id)) {
747      return rejected_stage('');
748    }
749    if ('booking' === stage && has_duplicate_provider_form($root, provider_id)) {
750      return rejected_stage(config.duplicate_provider);
751    }
752    var parsed = $.parseHTML(String(html || ''), document, true) || [];
753    var scripts = [];
754    var $container = $('<div>').append(parsed);
755    $container.find('script').addBack('script').each(function () {
756      scripts.push({
757        src: this.src || '',
758        code: this.src ? '' : this.text || this.textContent || ''
759      });
760      $(this).remove();
761    });
762    cleanup_native_form($root);
763    $root.attr('data-appointment-stage', stage);
764    $root.find('> .wpbc_booking_appointment__stage').empty().append($container.contents());
765    if (!prepare_native_form($root)) {
766      cleanup_native_form($root);
767      $root.find('.wpbc_booking_appointment__native_form :input').prop('disabled', true);
768      return rejected_stage(config.initialization_error || config.error);
769    }
770    return execute_scripts(scripts, function () {
771      return is_current_request($root, request_id);
772    }).then(function () {
773      if (!is_current_request($root, request_id)) {
774        return rejected_stage('');
775      }
776      initialize_ajax_form_controls();
777      if ('service' === stage) {
778        restore_service_selection($root);
779      }
780    });
781  }
782
783  /** Determine whether an AJAX callback still owns the component state. */
784  function is_current_request($root, request_id) {
785    return Number($root.data('wpbc-appointment-request-id') || 0) === Number(request_id);
786  }
787
788  /** Finish only the current request so stale callbacks cannot alter the UI. */
789  function finish_request($root, request_id) {
790    if (!is_current_request($root, request_id)) {
791      return;
792    }
793    $root.removeData('wpbc-appointment-request');
794    set_loading($root, false);
795  }
796
797  /** Request and render the next Appointment workflow stage. */
798  function resolve_stage($root, service_id, provider_id) {
799    if (!$root || !$root.length) {
800      return;
801    }
802    service_id = Number(service_id || 0);
803    provider_id = Number(provider_id || 0);
804    if (service_id) {
805      $root.attr('data-selected-service-id', service_id);
806    }
807    if (provider_id) {
808      $root.attr('data-selected-provider-id', provider_id);
809    }
810    var previous_request = $root.data('wpbc-appointment-request');
811    var request_id = Number($root.data('wpbc-appointment-request-id') || 0) + 1;
812    $root.data('wpbc-appointment-request-id', request_id);
813    if (previous_request && previous_request.readyState !== 4) {
814      previous_request.abort();
815    }
816    clear_error($root);
817    set_loading($root, true);
818    var request = $.post(config.ajax_url, {
819      action: config.action,
820      nonce: config.nonce,
821      config_token: $root.attr('data-config-token') || '',
822      service_id: service_id,
823      provider_id: provider_id
824    });
825    $root.data('wpbc-appointment-request', request);
826    request.done(function (response) {
827      if (!is_current_request($root, request_id)) {
828        return;
829      }
830      if (!response || !response.success || !response.data) {
831        show_error($root, response && response.data && response.data.message ? response.data.message : config.error, response && response.data ? response.data.action_url : '', response && response.data ? response.data.action_label : '');
832        finish_request($root, request_id);
833        return;
834      }
835      var stage = response.data.stage || '';
836      var replacement = replace_stage($root, response.data.html, stage, response.data.provider_id, request_id);
837      replacement.done(function () {
838        if (!is_current_request($root, request_id)) {
839          return;
840        }
841        if (Number(response.data.service_id || 0)) {
842          $root.attr('data-selected-service-id', Number(response.data.service_id));
843        }
844        if (Number(response.data.provider_id || 0)) {
845          $root.attr('data-selected-provider-id', Number(response.data.provider_id));
846        }
847        finish_request($root, request_id);
848        focus_stage($root);
849      }).fail(function (error) {
850        if (!is_current_request($root, request_id)) {
851          return;
852        }
853        var message = error && error.wpbc_message ? error.wpbc_message : config.initialization_error || config.error;
854        show_error($root, message);
855        finish_request($root, request_id);
856      });
857    }).fail(function (xhr, status) {
858      if ('abort' === status || !is_current_request($root, request_id)) {
859        return;
860      }
861      var response = xhr.responseJSON;
862      show_error($root, response && response.data && response.data.message ? response.data.message : config.error, response && response.data ? response.data.action_url : '', response && response.data ? response.data.action_label : '');
863      finish_request($root, request_id);
864    });
865  }
866
867  /** Handle Service and Provider fallback forms through AJAX. */
868  $(document).on('submit', '.wpbc_booking_appointment__selection_form', function (event) {
869    if (!config.ajax_url || !config.action) {
870      return;
871    }
872    event.preventDefault();
873    var $form = $(this);
874    var $root = $form.closest('.wpbc_booking_appointment');
875    resolve_stage($root, get_selected_id($form, 'wpbc_appointment_service'), get_selected_id($form, 'wpbc_appointment_provider'));
876  });
877
878  /** Keep plate selection styling independent from CSS :has() support. */
879  $(document).on('change', '.wpbc_booking_appointment__choice > input', function () {
880    var $input = $(this);
881    $input.closest('.wpbc_booking_appointment__choices').find('.wpbc_booking_appointment__choice').removeClass('is-selected');
882    $input.closest('.wpbc_booking_appointment__choice').addClass('is-selected');
883  });
884
885  /** Filter Service and Provider cards without changing the signed catalog. */
886  $(document).on('input search', '[data-wpbc-appointment-catalog-search]', function () {
887    filter_appointment_catalog($(this).closest('[data-wpbc-appointment-catalog]'));
888  });
889
890  /** Return to Service selection while preserving the last valid Service. */
891  $(document).on('click', '.wpbc_booking_appointment [data-appointment-back="service"]', function () {
892    var $root = $(this).closest('.wpbc_booking_appointment');
893    if ($root.hasClass('is-loading')) {
894      return;
895    }
896    resolve_stage($root, 0, 0);
897  });
898
899  /** Return to the first selectable Appointment stage without reloading the page. */
900  $(document).on('click', '.wpbc_booking_appointment [data-wpbc-appointment-action="start-over"], .wpb
900c_booking_appointment .wpbc_booking_appointment__change', function (event) {
901    if (!config.ajax_url || !config.action) {
902      return;
903    }
904    event.preventDefault();
905    var $root = $(this).closest('.wpbc_booking_appointment');
906    if ($root.hasClass('is-loading')) {
907      return;
908    }
909    $root.removeAttr('data-selected-service-id data-selected-provider-id');
910    resolve_stage($root, 0, 0);
911  });
912
913  /** Add the registered signed and server-authorized context to the core booking request. */
914  $('body').on('wpbc_before_booking_create.wpbc_booking_appointment', function (event, resource_id, params) {
915    var context = get_native_context(resource_id);
916    if (!context) {
917      return;
918    }
919    params.service_id = context.service_id;
920    params.appointment_service_required = 1;
921    params.appointment_context_token = context.context_token;
922    params.allow_past = context.allow_past;
923  });
924
925  /** Add the signed Appointment pair to the existing live-cost request. */
926  $(document).on('wpbc_before_cost_request.wpbc_booking_appointment', function (event, resource_id, params) {
927    var context = get_native_context(resource_id);
928    if (!context || !params) {
929      return;
930    }
931    params.appointment_service_id = context.service_id;
932    params.appointment_context_token = context.context_token;
933  });
934  $(function () {
935    $('.wpbc_booking_appointment').each(function () {
936      var $root = $(this);
937      $root.find('[data-wpbc-appointment-catalog]').each(function () {
938        filter_appointment_catalog($(this));
939      });
940      var $native = $root.find('.wpbc_booking_appointment__native_form').first();
941      if ($native.length) {
942        $root.attr('data-selected-service-id', Number($native.data('service-id') || 0));
943        $root.attr('data-selected-provider-id', Number($native.data('provider-id') || 0));
944      }
945      if (!prepare_native_form($root)) {
946        var duplicate = $native.length && has_duplicate_provider_form($root, Number($native.data('provider-id') || 0));
947        cleanup_native_form($root);
948        $root.find('.wpbc_booking_appointment__native_form :input').prop('disabled', true);
949        show_error($root, duplicate ? config.duplicate_provider : config.initialization_error);
950      }
951    });
952  });
953})(window, jQuery);
954//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvYm9va2luZy1hcHBvaW50bWVudC9fb3V0L2Jvb2tpbmctYXBwb2ludG1lbnQuanMiLCJuYW1lcyI6WyJ3aW5kb3ciLCIkIiwiY29uZmlnIiwid3BiY19ib29raW5nX2FwcG9pbnRtZW50X2NvbmZpZyIsImFjdGl2ZV9uYXRpdmVfY29udGV4dHMiLCJsb2FkZWRfc2NyaXB0X3VybHMiLCJlYWNoIiwiU3RyaW5nIiwic3JjIiwiZ2V0X3NlbGVjdGVkX2lkIiwiJGZvcm0iLCJuYW1lIiwiTnVtYmVyIiwiZmluZCIsImZpcnN0IiwidmFsIiwiZmlsdGVyX2FwcG9pbnRtZW50X2NhdGFsb2ciLCIkY2F0YWxvZyIsInNlYXJjaF90ZXJtIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJ0cmltIiwiY2F0YWxvZ190eXBlIiwiYXR0ciIsInZpc2libGVfY291bnQiLCIkY2FyZCIsInNlYXJjaGFibGVfdGV4dCIsImlzX3Zpc2libGUiLCJpbmRleE9mIiwiJGNob2ljZV9pbnB1dCIsInByb3AiLCJyZW1vdmVDbGFzcyIsInRleHQiLCJwcm92aWRlcl9mb3VuZCIsInByb3ZpZGVyc19mb3VuZCIsInNlcnZpY2VfZm91bmQiLCJzZXJ2aWNlc19mb3VuZCIsInNldF9sb2FkaW5nIiwiJHJvb3QiLCJpc19sb2FkaW5nIiwidG9nZ2xlQ2xhc3MiLCJzaG93X2Vycm9yIiwibWVzc2FnZSIsImFjdGlvbl91cmwiLCJhY3Rpb25fbGFiZWwiLCIkbm90aWNlIiwiZW1wdHkiLCJhcHBlbmQiLCJlcnJvciIsImhyZWYiLCJnZXQiLCJmb2N1cyIsInRyaWdnZXIiLCJjbGVhcl9lcnJvciIsImdldF9uYXRpdmVfY29udGV4dCIsInByb3ZpZGVyX2lkIiwiY29udGV4dCIsImVsZW1lbnQiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsImNvbnRhaW5zIiwiaGFzX2R1cGxpY2F0ZV9wcm92aWRlcl9mb3JtIiwiZmlsdGVyIiwibGVuZ3RoIiwicmVnaXN0ZXJfbmF0aXZlX2Zvcm0iLCIkbmF0aXZlIiwiZGF0YSIsInNlcnZpY2VfaWQiLCJjb250ZXh0X3Rva2VuIiwiYWxsb3dfcGFzdCIsImV4aXN0aW5nIiwidW5yZWdpc3Rlcl9uYXRpdmVfZm9ybSIsImdldF9zdGFydF90aW1lX2ZpZWxkIiwibm90IiwiZ2V0X3NlbGVjdGVkX2RhdGVzIiwid3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyIiwidmFsdWUiLCJzcGxpdCIsIm1hcCIsImRhdGVfdmFsdWUiLCJwYXJ0cyIsInRlc3QiLCJnZXRfdGltZV9zZWxlY3Rpb24iLCIkc3RhcnQiLCJkYXRlcyIsInN0YXJ0X3RpbWUiLCJjb21wbGV0ZSIsInNpZ25hdHVyZSIsImpvaW4iLCJpc190aW1lX3NlbGVjdGlvbl9zdGFnZV9hY3RpdmUiLCJzZWxlY3Rpb24iLCIkc3RlcCIsImNsb3Nlc3QiLCJpcyIsImhhc0NsYXNzIiwiZ2V0X3RpbWVfbm90aWNlX2FuY2hvciIsIiRwaWNrZXIiLCJuZXh0QWxsIiwiY2xlYXJfdGltZV9ub3RpY2UiLCJyZW1vdmUiLCJyZW1vdmVBdHRyIiwic2hvd190aW1lX25vdGljZSIsIiRhbmNob3IiLCJyb2xlIiwidmFsaWRhdGlvbl9lcnJvciIsImluc2VydEFmdGVyIiwiZ2V0X3RpbWVfdmFsaWRhdGlvbl9zdGF0ZSIsInN0YXRlIiwic2VxdWVuY2UiLCJzdGF0dXMiLCJyZXF1ZXN0IiwicHJvbWlzZSIsInRpbWVyIiwiYXZhaWxhYmlsaXR5X3NlcXVlbmNlIiwiYXZhaWxhYmlsaXR5X3JlcXVlc3QiLCJhdmFpbGFiaWxpdHlfdGltZXIiLCJhdmFpbGFibGVfc2xvdHMiLCJ
954jbGVhcl9hcHBvaW50bWVudF9kaXNhYmxlZF90aW1lcyIsIiRvcHRpb24iLCJyZWZyZXNoX3N0YXJ0X3RpbWVfcGlja2VyIiwid3BiY190aW1lc2VsZWN0b3IiLCJnZXRfY29yZV9hdmFpbGFibGVfc3RhcnRfdGltZXMiLCJ2YWx1ZXMiLCJhcHBvaW50bWVudF9kaXNhYmxlZCIsInB1c2giLCJkZWJ1Z190aW1lX3RvX21pbnV0ZXMiLCJ0aW1lX3ZhbHVlIiwiZGVidWdfZm9ybWF0X21pbnV0ZXMiLCJ0b3RhbF9taW51dGVzIiwiZGF5X29mZnNldCIsImhvdXJzIiwiTWF0aCIsImZsb29yIiwic2xpY2UiLCJtaW51dGVzIiwibG9nX3N0YXJ0X3RpbWVfZmlsdGVyX3JlcXVlc3QiLCJzdGFydF90aW1lcyIsImNvbnNvbGUiLCJpbmZvIiwiaW5pdGlhbF9zdGFydF90aW1lcyIsImxvZ19zdGFydF90aW1lX2ZpbHRlcl9yZXN1bHQiLCJidWZmZXJfYmVmb3JlIiwiYnVmZmVyX2FmdGVyIiwiYmxvY2tlZCIsIk9iamVjdCIsImtleXMiLCJzbG90cyIsImZvckVhY2giLCJyZXN1bHQiLCJ2YWxpZCIsImVuZF90aW1lIiwic3RhcnRfbWludXRlcyIsImVuZF9taW51dGVzIiwiYXBwb2ludG1lbnRfdGltZSIsInByb3ZpZGVyX3Jlc2VydmVkIiwicmVhc29uIiwiY29kZSIsImR1cmF0aW9uX21pbnV0ZXMiLCJkdXJhdGlvbiIsImJ1ZmZlcl9iZWZvcmVfbWludXRlcyIsImJ1ZmZlcl9hZnRlcl9taW51dGVzIiwiYmxvY2tlZF9zdGFydF90aW1lcyIsIml0ZW0iLCJ0YWJsZSIsImFwcGx5X2F2YWlsYWJsZV9zdGFydF90aW1lcyIsInNlbGVjdGVkX3ZhbHVlIiwic2VsZWN0ZWRfbWVzc2FnZSIsImxvYWRfYXZhaWxhYmxlX3N0YXJ0X3RpbWVzIiwicmVhZHlTdGF0ZSIsImFib3J0IiwicG9zdCIsImFqYXhfdXJsIiwiYWN0aW9uIiwidmFsaWRhdGVfYWN0aW9uIiwibm9uY2UiLCJkb25lIiwicmVzcG9uc2UiLCJzdWNjZXNzIiwiZmFpbCIsInhociIsInNjaGVkdWxlX2F2YWlsYWJsZV9zdGFydF90aW1lcyIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJ2YWxpZGF0ZV90aW1lX3NlbGVjdGlvbiIsIkRlZmVycmVkIiwicmVzb2x2ZSIsImRlZmVycmVkIiwicmVqZWN0IiwicmVzcG9uc2VKU09OIiwic2NoZWR1bGVfdGltZV92YWxpZGF0aW9uIiwiY2FwdHVyZV93aXphcmRfbmF2aWdhdGlvbiIsImV2ZW50IiwiJGJ1dHRvbiIsInRhcmdldCIsIndwYmNfYXBwb2ludG1lbnRfcHJlZmxpZ2h0X2J5cGFzcyIsInRhcmdldF9tYXRjaCIsIm1hdGNoIiwiY3VycmVudF9tYXRjaCIsIiRjdXJyZW50X3N0ZXAiLCIkdGltZV9zdGVwIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJjbGljayIsImluaXRpYWxpemVfdGltZV9wcmVmbGlnaHQiLCJuYXRpdmVfZWxlbWVudCIsIndwYmNfYXBwb2ludG1lbnRfdGltZV9wcmVmbGlnaHRfcmVhZHkiLCJhZGRFdmVudExpc3RlbmVyIiwib24iLCJwcmVwYXJlX25hdGl2ZV9mb3JtIiwiJHNjb3BlIiwicmVzb3VyY2VfaWQiLCJmaWVsZF9uYW1lIiwiJGR1cmF0aW9uX2ZpZWxkcyIsIiRkZXJpdmVkX3RpbWVfZmllbGRzIiwiJGZpZWxkIiwicmVwbGFjZSIsImFkZENsYXNzIiwiJGR1cmF0aW9uX3Byb3h5IiwidGFiaW5kZXgiLCJzZWxlY3RlZCIsImdldF9hYnNvbHV0ZV9zY3JpcHRfdXJsIiwidXJsIiwiYW5jaG9yIiwiY3JlYXRlRWxlbWVudCIsImV4ZWN1dGVfc2NyaXB0cyIsInNjcmlwdHMiLCJvd25zX3N0YWdlIiwiaW5kZXgiLCJzY3JpcHQiLCJ0aGVuIiwicmVqZWN0ZWRfc3RhZ2UiLCJhYnNvbHV0ZV91cmwiLCJ1bmRlZmluZWQiLCJhamF4IiwiZGF0YVR5cGUiLCJjYWNoZSIsImdsb2JhbEV2YWwiLCJpbml0aWFsaXplX2FqYXhfZm9ybV9jb250cm9scyIsIndwYmNfaG9va19faW5pdF9ib29raW5nX2Zvcm1fd2l6YXJkX2J1dHRvbnMiLCJjbGVhbnVwX25hdGl2ZV9mb3JtIiwiJGNhbGVuZGFyIiwiZGF0ZXBpY2siLCJpbnN0YW5jZSIsIl9nZXRJbnN0IiwicmVzdG9yZV9zZXJ2aWNlX3NlbGVjdGlvbiIsIiRpbnB1dCIsImZvY3VzX3N0YWdlIiwiJHRhcmdldCIsInByZXZlbnRTY3JvbGwiLCJzY3JvbGxJbnRvVmlldyIsInJlZHVjZV9tb3Rpb24iLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsImJlaGF2aW9yIiwiYmxvY2siLCJ3cGJjX21lc3NhZ2UiLCJyZXBsYWNlX3N0YWdlIiwiaHRtbCIsInN0YWdlIiwicmVxdWVzdF9pZCIsImlzX2N1cnJlbnRfcmVxdWVzdCIsImR1cGxpY2F0ZV9wcm92aWRlciIsInBhcnNlZCIsInBhcnNlSFRNTCIsIiRjb250YWluZXIiLCJhZGRCYWNrIiwidGV4dENvbnRlbnQiLCJjb250ZW50cyIsImluaXRpYWxpemF0aW9uX2Vycm9yIiwiZmluaXNoX3JlcXVlc3QiLCJyZW1vdmVEYXRhIiwicmVzb2x2ZV9zdGFnZSIsInByZXZpb3VzX3JlcXVlc3QiLCJjb25maWdfdG9rZW4iLCJyZXBsYWNlbWVudCIsInBhcmFtcyIsImFwcG9pbnRtZW50X3NlcnZpY2VfcmVxdWlyZWQiLCJhcHBvaW50bWVudF9jb250ZXh0X3Rva2VuIiwiYXBwb2ludG1lbnRfc2VydmljZV9pZCIsImR1cGxpY2F0ZSIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL2Jvb2tpbmctYXBwb2ludG1lbnQvX3NyYy9ib29raW5nLWFwcG9pbnRtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiggZnVuY3Rpb24gKCB3aW5kb3csICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgY29uZmlnID0gd2luZG93LndwYmNfYm9va2luZ19hcHBvaW50bWVudF9jb25maWcgfHwge307XG5cdHZhciBhY3RpdmVfbmF0aXZlX2NvbnRleHRzID0ge307XG5cdHZhciBsb2FkZWRfc2NyaXB0X3VybHMgPSB7fTtcblxuXHQkKCAnc2NyaXB0W3NyY10nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdGxvYWRlZF9zY3JpcHRfdXJsc1sgU3RyaW5nKCB0aGlzLnNyYyB8fCAnJyApIF0gPSB0cnVlO1xuXHR9ICk7XG5cblx0LyoqIFJldHVybiBhIG5vcm1hbGl6ZWQgaW50ZWdlciBmcm9tIGEgc2VsZWN0b3IgZmllbGQuICovXG5cdGZ1bmN0aW9uIGdldF9zZWxlY3RlZF9pZCggJGZvcm0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIE51bWJlciggJGZvcm0uZmluZCggJ1tuYW1lPVwiJyArIG5hbWUgKyAnXCJdOmNoZWNrZWQsIFtuYW1lPVwiJyArIG5hbWUgKyAnXCJdW3R5cGU9XCJoaWRkZW5cIl0nICkuZmlyc3QoKS52YWw
954oKSB8fCAwICk7XG5cdH1cblxuXHQvKipcblx0ICogQXBwbHkgcHVibGljIHRleHQgc2VhcmNoIHRvIG9uZSBzZXJ2ZXItYXV0aG9yaXplZCBBcHBvaW50bWVudCBjYXRhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gJGNhdGFsb2cgQXBwb2ludG1lbnQgY2F0YWxvZyByb290LlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gZmlsdGVyX2FwcG9pbnRtZW50X2NhdGFsb2coICRjYXRhbG9nICkge1xuXHRcdHZhciBzZWFyY2hfdGVybSA9IFN0cmluZyggJGNhdGFsb2cuZmluZCggJ1tkYXRhLXdwYmMtYXBwb2ludG1lbnQtY2F0YWxvZy1zZWFyY2hdJyApLnZhbCgpIHx8ICcnICkudG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCk7XG5cdFx0dmFyIGNhdGFsb2dfdHlwZSA9IFN0cmluZyggJGNhdGFsb2cuYXR0ciggJ2RhdGEtY2F0YWxvZy10eXBlJyApIHx8ICdzZXJ2aWNlcycgKTtcblx0XHR2YXIgdmlzaWJsZV9jb3VudCA9IDA7XG5cblx0XHQkY2F0YWxvZy5maW5kKCAnW2RhdGEtd3BiYy1hcHBvaW50bWVudC1jYXRhbG9nLWNhcmRdJyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciAkY2FyZCA9ICQoIHRoaXMgKTtcblx0XHRcdHZhciBzZWFyY2hhYmxlX3RleHQgPSBTdHJpbmcoICRjYXJkLmF0dHIoICdkYXRhLWFwcG9pbnRtZW50LWNhdGFsb2ctc2VhcmNoJyApIHx8ICcnICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcblx0XHRcdHZhciBpc192aXNpYmxlID0gISBzZWFyY2hfdGVybSB8fCBzZWFyY2hhYmxlX3RleHQuaW5kZXhPZiggc2VhcmNoX3Rlcm0gKSAhPT0gLTE7XG5cdFx0XHR2YXIgJGNob2ljZV9pbnB1dCA9ICRjYXJkLmZpbmQoICdpbnB1dFt0eXBlPVwicmFkaW9cIl0nICkuZmlyc3QoKTtcblxuXHRcdFx0JGNhcmQucHJvcCggJ2hpZGRlbicsICEgaXNfdmlzaWJsZSApO1xuXHRcdFx0JGNob2ljZV9pbnB1dC5wcm9wKCAnZGlzYWJsZWQnLCAhIGlzX3Zpc2libGUgKTtcblx0XHRcdGlmICggaXNfdmlzaWJsZSApIHtcblx0XHRcdFx0dmlzaWJsZV9jb3VudCArPSAxO1xuXHRcdFx0fSBlbHNlIGlmICggJGNob2ljZV9pbnB1dC5wcm9wKCAnY2hlY2tlZCcgKSApIHtcblx0XHRcdFx0JGNob2ljZV9pbnB1dC5wcm9wKCAnY2hlY2tlZCcsIGZhbHNlICk7XG5cdFx0XHRcdCRjYXJkLnJlbW92ZUNsYXNzKCAnaXMtc2VsZWN0ZWQnICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0JGNhdGFsb2cuZmluZCggJ1tkYXRhLXdwYmMtYXBwb2ludG1lbnQtY2F0YWxvZy1lbXB0eV0nICkucHJvcCggJ2hpZGRlbicsIDAgIT09IHZpc2libGVfY291bnQgKTtcblx0XHQkY2F0YWxvZy5maW5kKCAnW2RhdGEtd3BiYy1hcHBvaW50bWVudC1jYXRhbG9nLXN0YXR1c10nICkudGV4dChcblx0XHRcdFN0cmluZyggdmlzaWJsZV9jb3VudCApICsgJyAnICsgKFxuXHRcdFx0XHQncHJvdmlkZXJzJyA9PT0gY2F0YWxvZ190eXBlXG5cdFx0XHRcdFx0PyAoIDEgPT09IHZpc2libGVfY291bnQgPyAoIGNvbmZpZy5wcm92aWRlcl9mb3VuZCB8fCAnUHJvdmlkZXIgZm91bmQuJyApIDogKCBjb25maWcucHJvdmlkZXJzX2ZvdW5kIHx8ICdQcm92aWRlcnMgZm91bmQuJyApIClcblx0XHRcdFx0XHQ6ICggMSA9PT0gdmlzaWJsZV9jb3VudCA/ICggY29uZmlnLnNlcnZpY2VfZm91bmQgfHwgJ1NlcnZpY2UgZm91bmQuJyApIDogKCBjb25maWcuc2VydmljZXNfZm91bmQgfHwgJ1NlcnZpY2VzIGZvdW5kLicgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdC8qKiBUb2dnbGUgb25lIGNvbXBvbmVudCBsb2FkaW5nIHN0YXRlIHdpdGhvdXQgY2xlYXJpbmcgaXRzIGN1cnJlbnQgc3RhZ2UuICovXG5cdGZ1bmN0aW9uIHNldF9sb2FkaW5nKCAkcm9vdCwgaXNfbG9hZGluZyApIHtcblx0XHQkcm9vdC50b2dnbGVDbGFzcyggJ2lzLWxvYWRpbmcnLCBpc19sb2FkaW5nICkuYXR0ciggJ2FyaWEtYnVzeScsIGlzX2xvYWRpbmcgPyAndHJ1ZScgOiAnZmFsc2UnICk7XG5cdFx0JHJvb3QuZmluZCggJz4gLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc3RhZ2UnICkuYXR0ciggJ2FyaWEtYnVzeScsIGlzX2xvYWRpbmcgPyAndHJ1ZScgOiAnZmFsc2UnICk7XG5cdFx0JHJvb3QuZmluZCggJz4gLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fbG9hZGluZycgKS5wcm9wKCAnaGlkZGVuJywgISBpc19sb2FkaW5nICkuYXR0ciggJ2FyaWEtaGlkZGVuJywgaXNfbG9hZGluZyA/ICdmYWxzZScgOiAndHJ1ZScgKTtcblx0XHQkcm9vdC5maW5kKCAnLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc2VsZWN0aW9uX2Zvcm0gOmlucHV0JyApLnByb3AoICdkaXNhYmxlZCcsIGlzX2xvYWRpbmcgKTtcblx0XHRpZiAoICEgaXNfbG9hZGluZyApIHtcblx0XHRcdCRyb290LmZpbmQoICdbZGF0YS13cGJjLWFwcG9pbnRtZW50LWNhdGFsb2ddJyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0ZmlsdGVyX2FwcG9pbnRtZW50X2NhdGFsb2coICQoIHRoaXMgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5IGFuZCBmb2N1cyBhbiBBSkFYIG9yIGluaXRpYWxpemF0aW9uIGVycm9yIGluIG9uZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSAkcm9vdCAgICAgICAgQXBwb2ludG1lbnQgY29tcG9uZW50IHJvb3QuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlICAgICAgRXJyb3IgbWVzc2FnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbl91cmwgICBPcHRpb25hbCB0cnVzdGVkIGFkbWluaXN0cmF0aW9uIGFjdGlvbiBVUkwuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25fbGFiZWwgT3B0aW9uYWwgYWN0aW9uIGxpbmsgbGFiZWwuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBzaG93X2Vycm9yKCAkcm9vdCwgbWVzc2FnZSwgYWN0aW9uX3VybCwgYWN0aW9uX2xhYmVsICkge1xuXHRcdHZhciAkbm90aWNlID0gJHJvb3QuZmluZCggJz4gLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fYWpheF9ub3RpY2UnICk7XG5cdFx0JG5vdGljZS5lbXB0eSgpLmFwcGVuZCggJCggJzxzcGFuPicgKS50ZXh0KCBtZXNzYWdlIHx8IGNvbmZpZy5lcnJvciB8fCAnVW5hYmxlIHRvIGxvYWQgdGhlIEFwcG9pbnRtZW50IGZvcm0uJyApICk7XG5cdFx0aWYgKCBhY3Rpb25fdXJsICYmIGFjdGlvbl9sYWJlbCApIHtcblx0XHRcdCRub3RpY2UuYXBwZW5kKCAnICcsICQoICc8YT4nLCB7ICdjbGFzcyc6ICd3cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25vdGljZV9hY3Rpb24nLCBocmVmOiBhY3Rpb25fdXJsLCB0ZXh0OiBhY3Rpb25fbGFiZWwgfSApICk7XG5cdFx0fVxuXHRcdCRub3RpY2UucHJvcCggJ2hpZGRlbicsIGZhbHNlICk7XG5cdFx0aWYgKCAkbm90aWNlLmdldCggMCApICYmIHR5cGVvZiAkbm90aWNlLmdldCggMCApLmZvY3VzID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0JG5vdGljZS50cmlnZ2VyKCAnZm9jdXMnICk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIENsZWFyIHRoZSBjb21wb25lbnQgQUpBWCBlcnJvci4gKi9cblx0ZnVuY3Rpb24gY2xlYXJfZXJyb3IoICRyb290ICkge1xuXHRcdCRyb290LmZpbmQoICc+IC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2FqYXhfbm90aWNlJyApLmVtcHR5KCkucHJvcCggJ2hpZGRlbicsIHRydWUgKTtcblx0fVxuXG5cdC8qKiBSZXR1cm4gYSByZWdpc3RlcmVkIG5hdGl2ZSBjb250ZXh0IG9ubHkgd2hpbGUgaXRzIERPTSBlbGVtZW50IGlzIGxpdmUuICovXG5cdGZ1bmN0aW9uIGdldF9uYXRpdmVfY29udGV4dCggcHJvdmlkZXJfaWQgKSB7XG5cdFx0cHJvdmlkZXJfaWQgPSBOdW1iZXIoIHByb3ZpZGVyX2lkIHx8IDAgKTtcblx0XHR2YXIgY29udGV4dCA9IGFjdGl2ZV9uYXRpdmVfY29udGV4dHNbIHByb3ZpZGVyX2lkIF07XG5cdFx0aWYgKCAhIGNvbnRleHQgfHwgISBjb250ZXh0LmVsZW1lbnQgfHwgISBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMoIGNvbnRleHQuZWxlbWVudCApICkge1xuXHRcdFx0ZGVsZXRlIGFjdGl2ZV9uYXRpdmVfY29udGV4dHNbIHByb3ZpZGVyX2lkIF07XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHQ7XG5cdH1cblxuXHQvKiogRGV0ZWN0IGFub3RoZXIgbGl2ZSBuYXRpdmUgQm9va2luZyBDYWxlbmRhciBmb3JtIGZvciB0aGUgc2FtZSBQcm92aWRlci4gKi9cblx0ZnVuY3Rpb24gaGFzX2R1cGxpY2F0ZV9wcm92aWRlcl9mb3JtKCAkcm9vdCwgcHJvdmlkZXJfaWQgKSB7XG5cdFx0cHJvdmlkZXJfaWQgPSBOdW1iZXIoIHByb3ZpZGVyX2lkIHx8IDAgKTtcblx0XHRpZiAoICEgcHJvdmlkZXJfaWQgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRleHQgPSBnZXRfbmF0aXZlX2NvbnRleHQoIHByb3ZpZGVyX2lkICk7XG5cdFx0aWYgKCBjb250ZXh0ICYmICEgJC5jb250YWlucyggJHJvb3QuZ2V0KCAwICksIGNvbnRleHQuZWxlbWVudCApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICQoICdbaWQ9XCJib29raW5nX2Zvcm0nICsgcHJvdmlkZXJfaWQgKyAnXCJdJyApLmZpbHRlciggZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuICEgJC5jb250YWlucyggJHJvb3QuZ2V0KCAwICksIHRoaXMgKTtcblx0XHR9ICkubGVuZ3RoID4gMDtcblx0fVxuXG5cdC8qKiBSZWdpc3RlciB0aGUgZXhhY3Qgc2lnbmVkIG5hdGl2ZSBmb3JtIGNvbnRleHQgdXNlZCBieSBib29raW5nIHN1Ym1pc3Npb24uICovXG5cdGZ1bmN0aW9uIHJlZ2lzdGVyX25hdGl2ZV9mb3JtKCAkbmF0aXZlICkge1xuXHRcdHZhciBwcm92aWRlcl9pZCA9IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncHJvdmlkZXItaWQnICkgfHwgMCApO1xuXHRcdHZhciBzZXJ2aWNlX2lkID0gTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdzZXJ2aWNlLWlkJyApIHx8IDAgKTtcblx0XHR2YXIgY29udGV4dF90b2tlbiA9IFN0cmluZyggJG5hdGl2ZS5hdHRyKCAnZGF0YS1hcHBvaW50bWVudC1jb250ZXh0LXRva2VuJyApIHx8ICcnICk7XG5cdFx0dmFyIGFsbG93X3Bhc3QgPSAoICcxJyA9PT0gU3RyaW5nKCAkbmF0aXZlLmF0dHIoICdkYXRhLWFsbG93LXBhc3QnICkgfHwgJzAnICkgKSA/IDEgOiAwO1xuXHRcdHZhciBleGlzdGluZyA9IGdldF9uYXRpdmVfY29udGV4dCggcHJvdmlkZXJfaWQgKTtcblxuXHRcdGlmICggISBwcm92aWRlcl9pZCB8fCAhIHNlcnZpY2VfaWQgfHwgISBjb250ZXh0X3Rva2VuICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIGV4aXN0aW5nICYmIGV4aXN0aW5nLmVsZW1lbnQgIT09ICRuYXRpdmUuZ2V0KCAwICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0YWN0aXZlX25hdGl2ZV9jb250ZXh0c1sgcHJvdmlkZXJfaWQgXSA9IHtcblx0XHRcdGVsZW1lbnQ6ICRuYXRpdmUuZ2V0KCAwICksXG5cdFx0XHRzZXJ2aWNlX2lkOiBzZXJ2aWNlX2lkLFxuXHRcdFx0cHJvdmlkZXJfaWQ6IHByb3ZpZGVyX2lkLFxuXHRcdFx0Y29udGV4dF90b2tlbjogY29udGV4dF90b2tlbixcblx0XHRcdGFsbG93X3Bhc3Q6IGFsbG93X3Bhc3Rcblx0XHR9O1xuXHRcdHJldHVybi
954B0cnVlO1xuXHR9XG5cblx0LyoqIFJlbW92ZSBhIG5hdGl2ZSBmb3JtIGZyb20gdGhlIGxvY2FsIHN1Ym1pc3Npb24tY29udGV4dCByZWdpc3RyeS4gKi9cblx0ZnVuY3Rpb24gdW5yZWdpc3Rlcl9uYXRpdmVfZm9ybSggJG5hdGl2ZSApIHtcblx0XHR2YXIgcHJvdmlkZXJfaWQgPSBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKTtcblx0XHR2YXIgY29udGV4dCA9IGdldF9uYXRpdmVfY29udGV4dCggcHJvdmlkZXJfaWQgKTtcblx0XHRpZiAoIGNvbnRleHQgJiYgY29udGV4dC5lbGVtZW50ID09PSAkbmF0aXZlLmdldCggMCApICkge1xuXHRcdFx0ZGVsZXRlIGFjdGl2ZV9uYXRpdmVfY29udGV4dHNbIHByb3ZpZGVyX2lkIF07XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJldHVybiB0aGUgbmF0aXZlIFN0YXJ0IFRpbWUgZmllbGQgdXNlZCBieSB0aGUgZml4ZWQgU2VydmljZSBkdXJhdGlvbi4gKi9cblx0ZnVuY3Rpb24gZ2V0X3N0YXJ0X3RpbWVfZmllbGQoICRuYXRpdmUgKSB7XG5cdFx0dmFyIHByb3ZpZGVyX2lkID0gTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdwcm92aWRlci1pZCcgKSB8fCAwICk7XG5cdFx0cmV0dXJuICRuYXRpdmUuZmluZCggJ1tuYW1lPVwic3RhcnR0aW1lJyArIHByb3ZpZGVyX2lkICsgJ1wiXSwgW25hbWU9XCJzdGFydHRpbWUnICsgcHJvdmlkZXJfaWQgKyAnW11cIl0nICkubm90KCAnW2RhdGEtd3BiYy1ib29raW5nLXN1Ym1pdC1pZ25vcmU9XCIxXCJdJyApLmZpcnN0KCk7XG5cdH1cblxuXHQvKiogUmV0dXJuIHNlbGVjdGVkIGNhbGVuZGFyIGRhdGVzIGluIHRoZSBzZXJ2ZXIncyBzdHJpY3QgU1FMLWRhdGUgZm9ybWF0LiAqL1xuXHRmdW5jdGlvbiBnZXRfc2VsZWN0ZWRfZGF0ZXMoICRuYXRpdmUgKSB7XG5cdFx0dmFyIHByb3ZpZGVyX2lkID0gTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdwcm92aWRlci1pZCcgKSB8fCAwICk7XG5cdFx0aWYgKCBwcm92aWRlcl9pZCAmJiB0eXBlb2Ygd2luZG93LndwYmNfZ2V0X19zZWxlY3RlZF9kYXRlc19zcWxfX2FzX2FyciA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdHJldHVybiB3aW5kb3cud3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyKCBwcm92aWRlcl9pZCApO1xuXHRcdH1cblxuXHRcdHZhciB2YWx1ZSA9IFN0cmluZyggJG5hdGl2ZS5maW5kKCAnI2RhdGVfYm9va2luZycgKyBwcm92aWRlcl9pZCApLnZhbCgpIHx8ICcnICk7XG5cdFx0cmV0dXJuIHZhbHVlLnNwbGl0KCAnLCcgKS5tYXAoIGZ1bmN0aW9uICggZGF0ZV92YWx1ZSApIHtcblx0XHRcdHZhciBwYXJ0cyA9ICQudHJpbSggZGF0ZV92YWx1ZSApLnNwbGl0KCAnLicgKTtcblx0XHRcdHJldHVybiAzID09PSBwYXJ0cy5sZW5ndGggPyBwYXJ0c1sgMiBdICsgJy0nICsgcGFydHNbIDEgXSArICctJyArIHBhcnRzWyAwIF0gOiAnJztcblx0XHR9ICkuZmlsdGVyKCBmdW5jdGlvbiAoIGRhdGVfdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoIGRhdGVfdmFsdWUgKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvKiogUmVhZCB0aGUgY3VycmVudCBkYXRlL3N0YXJ0IHNlbGVjdGlvbiBhbmQgaXRzIHN0YWJsZSByZXF1ZXN0IHNpZ25hdHVyZS4gKi9cblx0ZnVuY3Rpb24gZ2V0X3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICkge1xuXHRcdHZhciAkc3RhcnQgPSBnZXRfc3RhcnRfdGltZV9maWVsZCggJG5hdGl2ZSApO1xuXHRcdHZhciBkYXRlcyA9IGdldF9zZWxlY3RlZF9kYXRlcyggJG5hdGl2ZSApO1xuXHRcdHZhciBzdGFydF90aW1lID0gJHN0YXJ0Lmxlbmd0aCA/IFN0cmluZyggJHN0YXJ0LnZhbCgpIHx8ICcnICkgOiAnJztcblx0XHRyZXR1cm4ge1xuXHRcdFx0JHN0YXJ0OiAkc3RhcnQsXG5cdFx0XHRkYXRlczogZGF0ZXMsXG5cdFx0XHRzdGFydF90aW1lOiBzdGFydF90aW1lLFxuXHRcdFx0Y29tcGxldGU6ICEhICggZGF0ZXMubGVuZ3RoICYmIC9eXFxkezEsMn06XFxkezJ9KD86OlxcZHsyfSk/JC8udGVzdCggc3RhcnRfdGltZSApICksXG5cdFx0XHRzaWduYXR1cmU6IGRhdGVzLmpvaW4oICcsJyApICsgJ3wnICsgc3RhcnRfdGltZVxuXHRcdH07XG5cdH1cblxuXHQvKiogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFN0YXJ0IFRpbWUgZmllbGQgYmVsb25ncyB0byB0aGUgdmlzaWJsZSB3aXphcmQgc3RlcC4gKi9cblx0ZnVuY3Rpb24gaXNfdGltZV9zZWxlY3Rpb25fc3RhZ2VfYWN0aXZlKCBzZWxlY3Rpb24gKSB7XG5cdFx0dmFyICRzdGVwID0gc2VsZWN0aW9uLiRzdGFydC5jbG9zZXN0KCAnLndwYmNfd2l6YXJkX3N0ZXAnICk7XG5cdFx0cmV0dXJuICEgJHN0ZXAubGVuZ3RoIHx8ICggJHN0ZXAuaXMoICc6dmlzaWJsZScgKSAmJiAhICRzdGVwLmhhc0NsYXNzKCAnd3BiY193aXphcmRfc3RlcF9oaWRkZW4nICkgKTtcblx0fVxuXG5cdC8qKiBGaW5kIHRoZSB2aXNpYmxlIFN0YXJ0IFRpbWUgVUkgYmVuZWF0aCB3aGljaCB2YWxpZGF0aW9uIGlzIGV4cGxhaW5lZC4gKi9cblx0ZnVuY3Rpb24gZ2V0X3RpbWVfbm90aWNlX2FuY2hvciggc2VsZWN0aW9uICkge1xuXHRcdHZhciAkcGlja2VyID0gc2VsZWN0aW9uLiRzdGFydC5uZXh0QWxsKCAnLndwYmNfdGltZXNfc2VsZWN0b3InICkuZmlyc3QoKTtcblx0XHRyZXR1cm4gJHBpY2tlci5sZW5ndGggPyAkcGlja2VyIDogc2VsZWN0aW9uLiRzdGFydDtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlIEFwcG9pbnRtZW50IGJ1ZmZlciB3YXJuaW5nIGFuZCBpbnZhbGlkIGZpZWxkIHNlbWFudGljcy4gKi9cblx0ZnVuY3Rpb24gY2xlYXJfdGltZV9ub3RpY2UoICRuYXRpdmUgKSB7XG5cdFx0JG5hdGl2ZS5maW5kKCAnLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fdGltZV9ub3RpY2UnICkucmVtb3ZlKCk7XG5cdFx0Z2V0X3N0YXJ0X3RpbWVfZmllbGQoICRuYXRpdmUgKS5yZW1vdmVBdHRyKCAnYXJpYS1pbnZhbGlkJyApLm5leHRBbGwoICcud3BiY190aW1lc19zZWxlY3RvcicgKS5maXJzdCgpLnJlbW92ZUF0dHIoICdhcmlhLWludmFsaWQnICk7XG5cdH1cblxuXHQvKiogU2hvdyBhIHBlcnNpc3RlbnQgd2FybmluZyB1c2luZyBCb29raW5nIENhbGVuZGFyJ3MgZnJvbnRlbmQgbWVzc2FnZSBVSS4gKi9cblx0ZnVuY3Rpb24gc2hvd190aW1lX25vdGljZSggJG5hdGl2ZSwgc2VsZWN0aW9uLCBtZXNzYWdlICkge1xuXHRcdGNsZWFyX3RpbWVfbm90aWNlKCAkbmF0aXZlICk7XG5cdFx0dmFyICRhbmNob3IgPSBnZXRfdGltZV9ub3RpY2VfYW5jaG9yKCBzZWxlY3Rpb24gKTtcblx0XHRpZiAoICEgJGFuY2hvci5sZW5ndGggKSB7XG5cdFx0XHQkYW5jaG9yID0gJG5hdGl2ZS5maW5kKCAnLmJrX2NhbGVuZGFyX2ZyYW1lJyApLmZpcnN0KCk7XG5cdFx0fVxuXHRcdGlmICggISAkYW5jaG9yLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZWxlY3Rpb24uJHN0YXJ0LmF0dHIoICdhcmlhLWludmFsaWQnLCAndHJ1ZScgKS5uZXh0QWxsKCAnLndwYmNfdGltZXNfc2VsZWN0b3InICkuZmlyc3QoKS5hdHRyKCAnYXJpYS1pbnZhbGlkJywgJ3RydWUnICk7XG5cdFx0JCggJzxkaXY+Jywge1xuXHRcdFx0J2NsYXNzJzogJ3dwYmNfYm9va2luZ19hcHBvaW50bWVudF9fdGltZV9ub3RpY2Ugd3BiY19mcm9udF9lbmRfX21lc3NhZ2Ugd3BiY19mZV9tZXNzYWdlIHdwYmNfZmVfbWVzc2FnZV93YXJuaW5nJyxcblx0XHRcdHJvbGU6ICdhbGVydCdcblx0XHR9ICkuYXBwZW5kKCAkKCA
954nPGk+JywgeyAnY2xhc3MnOiAnbWVudV9pY29uIGljb24tMXggd3BiY19pY25fd2FybmluZycsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9ICkgKVxuXHRcdFx0LmFwcGVuZCggJCggJzxzcGFuPicgKS50ZXh0KCBtZXNzYWdlIHx8IGNvbmZpZy52YWxpZGF0aW9uX2Vycm9yIHx8IGNvbmZpZy5lcnJvciApIClcblx0XHRcdC5pbnNlcnRBZnRlciggJGFuY2hvciApO1xuXHR9XG5cblx0LyoqIFJldHVybiBvciBpbml0aWFsaXplIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG93bmVkIGJ5IG9uZSBuYXRpdmUgZm9ybS4gKi9cblx0ZnVuY3Rpb24gZ2V0X3RpbWVfdmFsaWRhdGlvbl9zdGF0ZSggJG5hdGl2ZSApIHtcblx0XHR2YXIgc3RhdGUgPSAkbmF0aXZlLmRhdGEoICd3cGJjLWFwcG9pbnRtZW50LXRpbWUtdmFsaWRhdGlvbicgKTtcblx0XHRpZiAoICEgc3RhdGUgKSB7XG5cdFx0XHRzdGF0ZSA9IHtcblx0XHRcdFx0c2VxdWVuY2U6IDAsXG5cdFx0XHRcdHNpZ25hdHVyZTogJycsXG5cdFx0XHRcdHN0YXR1czogJ2luY29tcGxldGUnLFxuXHRcdFx0XHRyZXF1ZXN0OiBudWxsLFxuXHRcdFx0XHRwcm9taXNlOiBudWxsLFxuXHRcdFx0XHR0aW1lcjogbnVsbCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5X3NlcXVlbmNlOiAwLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHlfcmVxdWVzdDogbnVsbCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5X3RpbWVyOiBudWxsLFxuXHRcdFx0XHRhdmFpbGFibGVfc2xvdHM6IHt9XG5cdFx0XHR9O1xuXHRcdFx0JG5hdGl2ZS5kYXRhKCAnd3BiYy1hcHBvaW50bWVudC10aW1lLXZhbGlkYXRpb24nLCBzdGF0ZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblxuXHQvKiogUmVzdG9yZSBvbmx5IG9wdGlvbiBzdGF0ZSBwcmV2aW91c2x5IG93bmVkIGJ5IHRoZSBBcHBvaW50bWVudCBmaWx0ZXIuICovXG5cdGZ1bmN0aW9uIGNsZWFyX2FwcG9pbnRtZW50X2Rpc2FibGVkX3RpbWVzKCAkc3RhcnQgKSB7XG5cdFx0JHN0YXJ0LmZpbmQoICdvcHRpb25bZGF0YS13cGJjLWFwcG9pbnRtZW50LXVuYXZhaWxhYmxlPVwiMVwiXScgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgJG9wdGlvbiA9ICQoIHRoaXMgKTtcblx0XHRcdGlmICggISAkb3B0aW9uLmhhc0NsYXNzKCAnYm9va2VkJyApICkge1xuXHRcdFx0XHQkb3B0aW9uLnByb3AoICdkaXNhYmxlZCcsIGZhbHNlICk7XG5cdFx0XHR9XG5cdFx0XHQkb3B0aW9uLnJlbW92ZUF0dHIoICdkYXRhLXdwYmMtYXBwb2ludG1lbnQtdW5hdmFpbGFibGUnICk7XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqIFJlYnVpbGQgdGhlIG9wdGlvbmFsIHBsYXRlLXN0eWxlIHBpY2tlciBmcm9tIHRoZSBmaWx0ZXJlZCBuYXRpdmUgc2VsZWN0LiAqL1xuXHRmdW5jdGlvbiByZWZyZXNoX3N0YXJ0X3R
954pbWVfcGlja2VyKCAkc3RhcnQgKSB7XG5cdFx0aWYgKCAkc3RhcnQubGVuZ3RoICYmIHR5cGVvZiAkc3RhcnQud3BiY190aW1lc2VsZWN0b3IgPT09ICdmdW5jdGlvbicgJiYgJHN0YXJ0Lm5leHRBbGwoICcud3BiY190aW1lc19zZWxlY3RvcicgKS5sZW5ndGggKSB7XG5cdFx0XHQkc3RhcnQud3BiY190aW1lc2VsZWN0b3IoKTtcblx0XHR9XG5cdH1cblxuXHQvKiogUmVhZCBhbGwgb3B0aW9ucyBzdGlsbCBhbGxvd2VkIGJ5IHRoZSBvcmRpbmFyeSBCb29raW5nIENhbGVuZGFyIGVuZ2luZS4gKi9cblx0ZnVuY3Rpb24gZ2V0X2NvcmVfYXZhaWxhYmxlX3N0YXJ0X3RpbWVzKCAkc3RhcnQgKSB7XG5cdFx0dmFyIHZhbHVlcyA9IFtdO1xuXHRcdCRzdGFydC5maW5kKCAnb3B0aW9uJyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciAkb3B0aW9uID0gJCggdGhpcyApO1xuXHRcdFx0dmFyIHZhbHVlID0gU3RyaW5nKCAkb3B0aW9uLnZhbCgpIHx8ICcnICk7XG5cdFx0XHR2YXIgYXBwb2ludG1lbnRfZGlzYWJsZWQgPSAnMScgPT09IFN0cmluZyggJG9wdGlvbi5hdHRyKCAnZGF0YS13cGJjLWFwcG9pbnRtZW50LXVuYXZhaWxhYmxlJyApIHx8ICcnICk7XG5cdFx0XHRpZiAoIC9eXFxkezEsMn06XFxkezJ9KD86OlxcZHsyfSk/JC8udGVzdCggdmFsdWUgKSAmJiAoICEgJG9wdGlvbi5wcm9wKCAnZGlzYWJsZWQnICkgfHwgKCBhcHBvaW50bWVudF9kaXNhYmxlZCAmJiAhICRvcHRpb24uaGFzQ2xhc3MoICdib29rZWQnICkgKSApICkge1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fVxuXG5cdC8qKiBDb252ZXJ0IGEgYnJvd3NlciB0aW1lIHN0cmluZyB0byBtaW51dGVzIGZyb20gdGhlIHN0YXJ0IG9mIGl0cyBkYXkuICovXG5cdGZ1bmN0aW9uIGRlYnVnX3RpbWVfdG9fbWludXRlcyggdGltZV92YWx1ZSApIHtcblx0XHR2YXIgcGFydHMgPSBTdHJpbmcoIHRpbWVfdmFsdWUgfHwgJycgKS5zcGxpdCggJzonICk7XG5cdFx0aWYgKCBwYXJ0cy5sZW5ndGggPCAyICkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiAoIE51bWJlciggcGFydHNbIDAgXSApICogNjAgKSArIE51bWJlciggcGFydHNbIDEgXSApO1xuXHR9XG5cblx0LyoqIEZvcm1hdCBkZWJ1ZyB0aW1lIHdoaWxlIHJldGFpbmluZyBhIHByZXZpb3VzL25leHQtZGF5IGJvdW5kYXJ5LiAqL1xuXHRmdW5jdGlvbiBkZWJ1Z19mb3JtYXRfbWludXRlcyggdG90YWxfbWludXRlcyApIHtcblx0XHR2YXIgZGF5X29mZnNldCA9IDA7XG5cdFx0d2hpbGUgKCB0b3RhbF9taW51dGVzIDwgMCApIHtcblx0XHRcdHRvdGFsX21pbnV0ZXMgKz0gMTQ0MDtcblx0XHRcdGRheV9vZmZzZXQtLTtcblx0XHR9XG5cdFx0d2hpbGUgKCB0b3RhbF9taW51dGVzID49IDE0NDAgKSB7XG5cdFx0XHR0b3RhbF9taW51dGVzIC09IDE0NDA7XG5cdFx0XHRkYXlfb2Zmc2V0Kys7XG5cdFx0fVxuXHRcdHZhciBob3VycyA9ICggJzAnICsgTWF0aC5mbG9vciggdG90YWxfbWludXRlcyAvIDYwICkgKS5zbGljZSggLTIgKTtcblx0XHR2YXIgbWludXRlcyA9ICggJzAnICsgKCB0b3RhbF9taW51dGVzICUgNjAgKSApLnNsaWNlKCAtMiApO1xuXHRcdHJldHVybiBob3VycyArICc6JyArIG1pbnV0ZXMgKyAoIGRheV9vZmZzZXQgPyAnICgnICsgKCBkYXlfb2Zmc2V0ID4gMCA/ICcrJyA6ICcnICkgKyBkYXlfb2Zmc2V0ICsgJyBkYXkpJyA6ICcnICk7XG5cdH1cblxuXHQvKiogRXhwbGFpbiB0aGUgYXN5bmNocm9ub3VzIFNlcnZpY2UtYXdhcmUgYXZhaWxhYmlsaXR5IHBhc3MgaW4gdGhlIGNvbnNvbGUuICovXG5cdGZ1bmN0aW9uIGxvZ19zdGFydF90aW1lX2ZpbHRlcl9yZXF1ZXN0KCAkbmF0aXZlLCBkYXRlcywgc3RhcnRfdGltZXMgKSB7XG5cdFx0aWYgKCAhIHdpbmRvdy5jb25zb2xlIHx8IHR5cGVvZiB3aW5kb3cuY29uc29sZS5pbmZvICE9PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR3aW5kb3cuY29uc29sZS5pbmZvKFxuXHRcdFx0J1tCb29raW5nIENhbGVuZGFyIEFwcG9pbnRtZW50XSBSZWNoZWNraW5nIFN0YXJ0IFRpbWVzIHdpdGggU2VydmljZSBkdXJhdGlvbiBhbmQgYnVmZmVycy4gVGhlIGluaXRpYWwgbGlzdCBjb21lcyBmcm9tIFByb3ZpZGVyIGNhbGVuZGFyIGF2YWlsYWJpbGl0eSBhbmQgbWF5IG5vdyBiZSByZWR1Y2VkLicsXG5cdFx0XHR7XG5cdFx0XHRcdHNlcnZpY2VfaWQ6IE51bWJlciggJG5hdGl2ZS5kYXRhKCAnc2VydmljZS1pZCcgKSB8fCAwICksXG5cdFx0XHRcdHByb3ZpZGVyX2lkOiBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKSxcblx0XHRcdFx0ZGF0ZXM6IGRhdGVzLnNsaWNlKCAwICksXG5cdFx0XHRcdGluaXRpYWxfc3RhcnRfdGltZXM6IHN0YXJ0X3RpbWVzLnNsaWNlKCAwIClcblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cblx0LyoqIExvZyBvbmx5IHNjaGVkdWxpbmcgZGF0YSBuZWVkZWQgdG8gdW5kZXJzdGFuZCByZW1vdmVkIFN0YXJ0IFRpbWVzLiAqL1xuXHRmdW5jdGlvbiBsb2dfc3RhcnRfdGltZV9maWx0ZXJfcmVzdWx0KCAkbmF0aXZlLCBkYXRlcywgZGF0YSApIHtcblx0XHRpZiAoICEgd2luZG93LmNvbnNvbGUgfHwgdHlwZW9mIHdpbmRvdy5jb25zb2xlLmluZm8gIT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHZhciBidWZmZXJfYmVmb3JlID0gTnVtYmVyKCBkYXRhLmJ1ZmZlcl9iZWZvcmUgfHwgMCApO1xuXHRcdHZhciBidWZmZXJfYWZ0ZXIgPSBOdW1iZXIoIGRhdGEuYnVmZmVyX2FmdGVyIHx8IDAgKTtcblx0XHR2YXIgYmxvY2tlZCA9IFtdO1xuXHRcdE9iamVjdC5rZXlzKCBkYXRhLnNsb3RzIHx8IHt9ICkuZm9yRWFjaCggZnVuY3Rpb24gKCBzdGFydF90aW1lICkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IGRhdGEuc2xvdHNbIHN0YXJ0X3RpbWUgXTtcblx0XHRcdGlmICggISByZXN1bHQgfHwgZmFsc2UgIT09IHJlc3VsdC52YWxpZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGVuZF90aW1lID0gU3RyaW5nKCByZXN1bHQuZW5kX3RpbW
954UgfHwgJycgKTtcblx0XHRcdHZhciBzdGFydF9taW51dGVzID0gZGVidWdfdGltZV90b19taW51dGVzKCBzdGFydF90aW1lICk7XG5cdFx0XHR2YXIgZW5kX21pbnV0ZXMgPSBkZWJ1Z190aW1lX3RvX21pbnV0ZXMoIGVuZF90aW1lICk7XG5cdFx0XHRibG9ja2VkLnB1c2goIHtcblx0XHRcdFx0c3RhcnRfdGltZTogc3RhcnRfdGltZSxcblx0XHRcdFx0YXBwb2ludG1lbnRfdGltZTogZW5kX3RpbWUgPyBzdGFydF90aW1lICsgJyAtICcgKyBlbmRfdGltZSA6IHN0YXJ0X3RpbWUsXG5cdFx0XHRcdHByb3ZpZGVyX3Jlc2VydmVkOiBudWxsICE9PSBzdGFydF9taW51dGVzICYmIG51bGwgIT09IGVuZF9taW51dGVzXG5cdFx0XHRcdFx0PyBkZWJ1Z19mb3JtYXRfbWludXRlcyggc3RhcnRfbWludXRlcyAtIGJ1ZmZlcl9iZWZvcmUgKSArICcgLSAnICsgZGVidWdfZm9ybWF0X21pbnV0ZXMoIGVuZF9taW51dGVzICsgYnVmZmVyX2FmdGVyIClcblx0XHRcdFx0XHQ6ICcnLFxuXHRcdFx0XHRyZWFzb246IHJlc3VsdC5tZXNzYWdlIHx8IHJlc3VsdC5jb2RlIHx8IGNvbmZpZy52YWxpZGF0aW9uX2Vycm9yXG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXG5cdFx0d2luZG93LmNvbnNvbGUuaW5mbyhcblx0XHRcdCdbQm9va2luZyBDYWxlbmRhciBBcHBvaW50bWVudF0gU2VydmljZS1hd2FyZSBTdGFydCBUaW1lIGNoZWNrIGNvbXBsZXRlZC4nLFxuXHRcdFx0e1xuXHRcdFx0XHRzZXJ2aWNlX2lkOiBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3NlcnZpY2UtaWQnICkgfHwgMCApLFxuXHRcdFx0XHRwcm92aWRlcl9pZDogTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdwcm92aWRlci1pZCcgKSB8fCAwICksXG5cdFx0XHRcdGRhdGVzOiBkYXRlcy5zbGljZSggMCApLFxuXHRcdFx0XHRkdXJhdGlvbl9taW51dGVzOiBOdW1iZXIoIGRhdGEuZHVyYXRpb24gfHwgMCApLFxuXHRcdFx0XHRidWZmZXJfYmVmb3JlX21pbnV0ZXM6IGJ1ZmZlcl9iZWZvcmUsXG5cdFx0XHRcdGJ1ZmZlcl9hZnRlcl9taW51dGVzOiBidWZmZXJfYWZ0ZXIsXG5cdFx0XHRcdGJsb2NrZWRfc3RhcnRfdGltZXM6IGJsb2NrZWQubWFwKCBmdW5jdGlvbiAoIGl0ZW0gKSB7IHJldHVybiBpdGVtLnN0YXJ0X3RpbWU7IH0gKVxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0aWYgKCBibG9ja2VkLmxlbmd0aCAmJiB0eXBlb2Ygd2luZG93LmNvbnNvbGUudGFibGUgPT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHR3aW5kb3cuY29uc29sZS50YWJsZSggYmxvY2tlZCApO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBBcHBseSBvbmUgc2VydmVyIHJlc3BvbnNlIHdpdGhvdXQgZXhwb3NpbmcgYW5vdGhlciBjdXN0b21lcidzIGJvb2tpbmcuICovXG5cdGZ1bmN0aW9uIGFwcGx5X2F2YWlsYWJsZV9zdGFydF90aW1lcyggJG5hdGl2ZSwgc2xvdHMgKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IGdldF90aW1lX3NlbGVjdGlvbiggJG5hdGl2ZSApO1xuXHRcdHZhciAkc3RhcnQgPSBzZWxlY3Rpb24uJHN0YXJ0O1xuXHRcdHZhciBzZWxlY3RlZF92YWx1ZSA9IHNlbGVjdGlvbi5zdGFydF90aW1lO1xuXHRcdHZhciBzZWxlY3RlZF9tZXNzYWdlID0gJyc7XG5cdFx0Y2xlYXJfYXBwb2ludG1lbnRfZGlzYWJsZWRfdGltZXMoICRzdGFydCApO1xuXG5cdFx0JHN0YXJ0LmZpbmQoICdvcHRpb24nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyICRvcHRpb24gPSAkKCB0aGlzICk7XG5cdFx0XHR2YXIgdmFsdWUgPSBTdHJpbmcoICRvcHRpb24udmFsKCkgfHwgJycgKTtcblx0XHRcdHZhciByZXN1bHQgPSBzbG90cyAmJiBzbG90c1sgdmFsdWUgXSA/IHNsb3RzWyB2YWx1ZSBdIDogbnVsbDtcblx0XHRcdGlmICggcmVzdWx0ICYmIGZhbHNlID09PSByZXN1bHQudmFsaWQgJiYgISAkb3B0aW9uLmhhc0NsYXNzKCAnYm9va2VkJyApICkge1xuXHRcdFx0XHQkb3B0aW9uLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKS5hdHRyKCAnZGF0YS13cGJjLWFwcG9pbnRtZW50LXVuYXZhaWxhYmxlJywgJzEnICk7XG5cdFx0XHRcdGlmICggc2VsZWN0ZWRfdmFsdWUgPT09IHZhbHVlICkge1xuXHRcdFx0XHRcdHNlbGVjdGVkX21lc3NhZ2UgPSByZXN1bHQubWVzc2FnZSB8fCBjb25maWcudmFsaWRhdGlvbl9lcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdGlmICggc2VsZWN0ZWRfbWVzc2FnZSApIHtcblx0XHRcdCRzdGFydC52YWwoICcnICk7XG5cdFx0XHRzaG93X3RpbWVfbm90aWNlKCAkbmF0aXZlLCBzZWxlY3Rpb24sIHNlbGVjdGVkX21lc3NhZ2UgKTtcblx0XHR9XG5cdFx0cmVmcmVzaF9zdGFydF90aW1lX3BpY2tlciggJHN0YXJ0ICk7XG5cdH1cblxuXHQvKiogRmlsdGVyIHRoZSBjb21wbGV0ZSBTdGFydCBUaW1lIGxpc3Qgd2l0aCBvbmUgYm91bmRlZCBzZXJ2ZXIgcmVxdWVzdC4gKi9cblx0ZnVuY3Rpb24gbG9hZF9hdmFpbGFibGVfc3RhcnRfdGltZXMoICRuYXRpdmUgKSB7XG5cdFx0dmFyIHN0YXRlID0gZ2V0X3RpbWVfdmFsaWRhdGlvbl9zdGF0ZSggJG5hdGl2ZSApO1xuXHRcdHZhciAkc3RhcnQgPSBnZXRfc3RhcnRfdGltZV9maWVsZCggJG5hdGl2ZSApO1xuXHRcdHZhciBkYXRlcyA9IGdldF9zZWxlY3RlZF9kYXRlcyggJG5hdGl2ZSApO1xuXHRcdHZhciBzdGFydF90aW1lcyA9IGdldF9jb3JlX2F2YWlsYWJsZV9zdGFydF90aW1lcyggJHN0YXJ0ICk7XG5cdFx0dmFyIHNlcXVlbmNlID0gKytzdGF0ZS5hdmFpbGFiaWxpdHlfc2VxdWVuY2U7XG5cblx0XHRpZiAoIHN0YXRlLmF2YWlsYWJpbGl0eV9yZXF1ZXN0ICYmIDQgIT09IHN0YXRlLmF2YWlsYWJpbGl0eV9yZXF1ZXN0LnJlYWR5U3RhdGUgKSB7XG5cdFx0XHRzdGF0ZS5hdmFpbGFiaWxpdHlfcmVxdWVzdC5hYm9ydCgpO1xuXHRcdH1cblx0XHRpZiAoICEgJHN0YXJ0Lmxlbmd0aCB8fCAhIGRhdGVzLmxlbmd0aCB8fCAhIHN0YXJ0X3RpbWVzLmxlbmd0aCApIHtcblx0XHRcdGNsZWFyX2FwcG9pbnRtZW50X2Rpc2FibGVkX3RpbWVzKCAkc3RhcnQgKTtcblx0XHRcdHJlZnJlc2hfc3RhcnRfdGltZV9waWNrZXIoICRzdGFydCApO1xuXHRcdFx0c3RhdGUuYXZhaWxhYmxlX3Nsb3RzID0ge307XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxvZ19zdGFydF90aW1lX2ZpbHRlcl9yZXF1ZXN0KCAkbmF0aXZlLCBkYXRlcywgc3RhcnRfdGltZXMgKTtcblxuXHRcdHN0YXRlLmF2YWlsYWJpbGl0eV9yZXF1ZXN0ID0gJC5wb3N0KCBjb25maWcuYWpheF91cmwsIHtcblx0XHRcdGFjdGlvbjogY29uZmlnLnZhbGlkYXRlX2FjdGlvbixcblx0XHRcdG5vbmNlOiBjb25maWcubm9uY2UsXG5cdFx0XHRzZXJ2aWNlX2lkOiBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3NlcnZpY2UtaWQnICkgfHwgMCApLFxuXHRcdFx0cHJvdmlkZXJfaWQ6IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncHJvdmlkZXItaWQnICkgfHwgMCApLFxuXHRcdFx0Y29udGV4dF90b2tlbjogU3RyaW5nKCAkbmF0aXZlLmF0dHIoICdkYXRhLWFwcG9pbnRtZW50LWNvbnRleHQtdG9rZW4nICkgfHwgJycgKSxcblx0XHRcdGRhdGVzOiBkYXRlcyxcblx0XHRcdHN0YXJ0X3R
954pbWVzOiBzdGFydF90aW1lc1xuXHRcdH0gKTtcblx0XHRzdGF0ZS5hdmFpbGFiaWxpdHlfcmVxdWVzdC5kb25lKCBmdW5jdGlvbiAoIHJlc3BvbnNlICkge1xuXHRcdFx0aWYgKCBzZXF1ZW5jZSAhPT0gc3RhdGUuYXZhaWxhYmlsaXR5X3NlcXVlbmNlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgZGF0YSA9IHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgPyByZXNwb25zZS5kYXRhIDoge307XG5cdFx0XHRpZiAoICEgcmVzcG9uc2UgfHwgISByZXNwb25zZS5zdWNjZXNzIHx8ICEgZGF0YS5zbG90cyApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUuYXZhaWxhYmxlX3Nsb3RzID0gZGF0YS5zbG90cztcblx0XHRcdGxvZ19zdGFydF90aW1lX2ZpbHRlcl9yZXN1bHQoICRuYXRpdmUsIGRhdGVzLCBkYXRhICk7XG5cdFx0XHRhcHBseV9hdmFpbGFibGVfc3RhcnRfdGltZXMoICRuYXRpdmUsIGRhdGEuc2xvdHMgKTtcblx0XHR9ICkuZmFpbCggZnVuY3Rpb24gKCB4aHIsIHN0YXR1cyApIHtcblx0XHRcdGlmICggJ2Fib3J0JyA9PT0gc3RhdHVzIHx8IHNlcXVlbmNlICE9PSBzdGF0ZS5hdmFpbGFiaWxpdHlfc2VxdWVuY2UgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNsZWFyX2FwcG9pbnRtZW50X2Rpc2FibGVkX3RpbWVzKCAkc3RhcnQgKTtcblx0XHRcdHJlZnJlc2hfc3RhcnRfdGltZV9waWNrZXIoICRzdGFydCApO1xuXHRcdFx0c3RhdGUuYXZhaWxhYmxlX3Nsb3RzID0ge307XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqIERlYm91bmNlIHRoZSB3aG9sZS1saXN0IGZpbHRlciBhZnRlciBjb3JlIGF2YWlsYWJpbGl0eSBoYXMgcmVmcmVzaGVkLiAqL1xuXHRmdW5jdGlvbiBzY2hlZHVsZV9hdmFpbGFibGVfc3RhcnRfdGltZXMoICRuYXRpdmUgKSB7XG5cdFx0dmFyIHN0YXRlID0gZ2V0X3RpbWVfdmFsaWRhdGlvbl9zdGF0ZSggJG5hdGl2ZSApO1xuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHN0YXRlLmF2YWlsYWJpbGl0eV90aW1lciApO1xuXHRcdHN0YXRlLmF2YWlsYWJpbGl0eV90aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRsb2FkX2F2YWlsYWJsZV9zdGFydF90aW1lcyggJG5hdGl2ZSApO1xuXHRcdH0sIDMwICk7XG5cdH1cblxuXHQvKiogVmFsaWRhdGUgY3VycmVudCBTZXJ2aWNlIGR1cmF0aW9uL2J1ZmZlcnMgdGhyb3VnaCB0aGUgYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIuICovXG5cdGZ1bmN0aW9uIHZhbGlkYXRlX3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSBnZXRfdGltZV9zZWxlY3Rpb24oICRuYXRpdmUgKTtcblx0XHR2YXIgc3RhdGUgPSBnZXRfdGltZV92YWxpZGF0aW9uX3N0YXRlKCAkbmF0aXZlICk7XG5cdFx0aWYgKCAhIHNlbGVjdGlvbi5jb21wbGV0ZSApIHtcblx0XHRcdGlmICggc3RhdGUucmVxdWVzdCAmJiA0ICE9PSBzdGF0ZS5yZXF1ZXN0LnJlYWR5U3RhdGUgKSB7XG5cdFx0XHRcdHN0YXRlLnJlcXVlc3QuYWJvcnQoKTtcblx0XHRcdH1cblx0XHRcdHN0YXRlLnNpZ25hdHVyZSA9IHNlbGVjdGlvbi5zaWduYXR1cmU7XG5cdFx0XHRzdGF0ZS5zdGF0dXMgPSAnaW5jb21wbGV0ZSc7XG5cdFx0XHRzdGF0ZS5wcm9taXNlID0gbnVsbDtcblx0XHRcdGNsZWFyX3RpbWVfbm90aWNlKCAkbmF0aXZlICk7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoIGZhbHNlLCAnaW5jb21wbGV0ZScgKS5wcm9taXNlKCk7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0aW9uLnNpZ25hdHVyZSA9PT0gc3RhdGUuc2lnbmF0dXJlICYmICd2YWxpZCcgPT09IHN0YXRlLnN0YXR1cyApIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSggdHJ1ZSwgJ3ZhbGlkJyApLnByb21pc2UoKTtcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3Rpb24uc2lnbmF0dXJlID09PSBzdGF0ZS5zaWduYXR1cmUgJiYgJ2ludmFsaWQnID09PSBzdGF0ZS5zdGF0dXMgKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoIGZhbHNlLCAnaW52YWxpZCcgKS5wcm9taXNlKCk7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0aW9uLnNpZ25hdHVyZSA9PT0gc3RhdGUuc2lnbmF0dXJlICYmICdwZW5kaW5nJyA9PT0gc3RhdGUuc3RhdHVzICYmIHN0YXRlLnByb21pc2UgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUucHJvbWlzZTtcblx0XHR9XG5cdFx0aWYgKCBzdGF0ZS5yZXF1ZXN0ICYmIDQgIT09IHN0YXRlLnJlcXVlc3QucmVhZHlTdGF0ZSApIHtcblx0XHRcdHN0YXRlLnJlcXVlc3QuYWJvcnQoKTtcblx0XHR9XG5cblx0XHR2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cdFx0dmFyIHNlcXVlbmNlID0gKytzdGF0ZS5zZXF1ZW5jZTtcblx0XHRzdGF0ZS5zaWduYXR1cmUgPSBzZWxlY3Rpb24uc2lnbmF0dXJlO1xuXHRcdHN0YXRlLnN0YXR1cyA9ICdwZW5kaW5nJztcblx0XHRzdGF0ZS5wcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdGNsZWFyX3RpbWVfbm90aWNlKCAkbmF0aXZlICk7XG5cdFx0c3RhdGUucmVxdWVzdCA9ICQucG9zdCggY29uZmlnLmFqYXhfdXJsLCB7XG5cdFx0XHRhY3Rpb246IGNvbmZpZy52YWxpZGF0ZV9hY3Rpb24sXG5cdFx0XHRub25jZTogY29uZmlnLm5vbmNlLFxuXHRcdFx0c2VydmljZV9pZDogTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdzZXJ2aWNlLWlkJyApIHx8IDAgKSxcblx0XHRcdHByb3ZpZGVyX2lkOiBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKSxcblx0XHRcdGNvbnRleHRfdG9rZW46IFN0cmluZyggJG5hdGl2ZS5hdHRyKCAnZGF0YS1hcHBvaW50bWVudC1jb250ZXh0LXRva2VuJyApIHx8ICcnICksXG5cdFx0XHRkYXRlczogc2VsZWN0aW9uLmRhdGVzLFxuXHRcdFx0c3RhcnRfdGltZTogc2VsZWN0aW9uLnN0YXJ0X3RpbWVcblx0XHR9ICk7XG5cdFx0c3RhdGUucmVxdWVzdC5kb25lKCBmdW5jdGlvbiAoIHJlc3BvbnNlICkge1xuXHRcdFx0aWYgKCBzZXF1ZW5jZSAhPT0gc3RhdGUuc2VxdWVuY2UgfHwgc2VsZWN0aW9uLnNpZ25hdHVyZSAhPT0gZ2V0X3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICkuc2lnbmF0dXJlICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoICdzdGFsZScgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGRhdGEgPSByZXNwb25zZSAmJiByZXNwb25zZS5kYXRhID8gcmVz
954cG9uc2UuZGF0YSA6IHt9O1xuXHRcdFx0aWYgKCByZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHRydWUgPT09IGRhdGEudmFsaWQgKSB7XG5cdFx0XHRcdHN0YXRlLnN0YXR1cyA9ICd2YWxpZCc7XG5cdFx0XHRcdGNsZWFyX3RpbWVfbm90aWNlKCAkbmF0aXZlICk7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoIHRydWUsICd2YWxpZCcgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUuc3RhdHVzID0gJ2ludmFsaWQnO1xuXHRcdFx0c2hvd190aW1lX25vdGljZSggJG5hdGl2ZSwgc2VsZWN0aW9uLCBkYXRhLm1lc3NhZ2UgfHwgY29uZmlnLnZhbGlkYXRpb25fZXJyb3IgKTtcblx0XHRcdGRlZmVycmVkLnJlc29sdmUoIGZhbHNlLCAnaW52YWxpZCcgKTtcblx0XHR9ICkuZmFpbCggZnVuY3Rpb24gKCB4aHIsIHN0YXR1cyApIHtcblx0XHRcdGlmICggJ2Fib3J0JyA9PT0gc3RhdHVzIHx8IHNlcXVlbmNlICE9PSBzdGF0ZS5zZXF1ZW5jZSApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KCAnc3RhbGUnICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHZhciByZXNwb25zZSA9IHhoci5yZXNwb25zZUpTT047XG5cdFx0XHR2YXIgbWVzc2FnZSA9IHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5tZXNzYWdlID8gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIDogY29uZmlnLnZhbGlkYXRpb25fZXJyb3I7XG5cdFx0XHRzdGF0ZS5zdGF0dXMgPSAnaW52YWxpZCc7XG5cdFx0XHRzaG93X3RpbWVfbm90aWNlKCAkbmF0aXZlLCBzZWxlY3Rpb24sIG1lc3NhZ2UgKTtcblx0XHRcdGRlZmVycmVkLnJlc29sdmUoIGZhbHNlLCAnaW52YWxpZCcgKTtcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gc3RhdGUucHJvbWlzZTtcblx0fVxuXG5cdC8qKiBEZWJvdW5jZSB2YWxpZGF0aW9uIGFmdGVyIGNhbGVuZGFyIG9yIFN0YXJ0IFRpbWUgY2hhbmdlcy4gKi9cblx0ZnVuY3Rpb24gc2NoZWR1bGVfdGltZV92YWxpZGF0aW9uKCAkbmF0aXZlICkge1xuXHRcdHZhciBzdGF0ZSA9IGdldF90aW1lX3ZhbGlkYXRpb25fc3RhdGUoICRuYXRpdmUgKTtcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCBzdGF0ZS50aW1lciApO1xuXHRcdHN0YXRlLnN0YXR1cyA9ICdjaGFuZ2VkJztcblx0XHRjbGVhcl90aW1lX25vdGljZSggJG5hdGl2ZSApO1xuXHRcdGlmICggISBpc190aW1lX3NlbGVjdGlvbl9zdGFnZV9hY3RpdmUoIGdldF90aW1lX3NlbGVjdGlvbiggJG5hdGl2ZSApICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHN0YXRlLnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhbGlkYXRlX3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICk7XG5cdFx0fSwgMTIwICk7XG5cdH1cblxuXHQvKiogQmxvY2sgZm9yd2FyZCB3aXphcmQgbmF2aWdhdGlvbiB1bnRpbCB0aGUgY3VycmVudCB0aW1lIHByZWZsaWdodCBwYXNzZXMuICovXG5cdGZ1bmN0aW9uIGNhcHR1cmVfd2l6YXJkX25hdmlnYXRpb24oIGV2ZW50LCAkbmF0aXZlICkge1xuXHRcdHZhciAkYnV0dG9uID0gJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggJy53cGJjX3dpemFyZF9zdGVwX2J1dHRvbicgKTtcblx0XHRpZiAoICEgJGJ1dHRvbi5sZW5ndGggfHwgISAkLmNvbnRhaW5zKCAkbmF0aXZlLmdldCggMCApLCAkYnV0dG9uLmdldCggMCApICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICggJGJ1dHRvbi5nZXQoIDAgKS53cGJjX2FwcG9pbnRtZW50X3ByZWZsaWdodF9ieXBhc3MgKSB7XG5cdFx0XHQkYnV0dG9uLmdldCggMCApLndwYmNfYXBwb2ludG1lbnRfcHJlZmxpZ2h0X2J5cGFzcyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0YXJnZXRfbWF0Y2ggPSBTdHJpbmcoICRidXR0b24uYXR0ciggJ2NsYXNzJyApIHx8ICcnICkubWF0Y2goIC93cGJjX3dpemFyZF9zdGVwXyhcXGQrKS8gKTtcblx0XHR2YXIgY3VycmVudF9tYXRjaCA9IFN0cmluZyggJGJ1dHRvbi5jbG9zZXN0KCAnLndwYmNfd2l6YXJkX3N0ZXAnICkuYXR0ciggJ2NsYXNzJyApIHx8ICcnICkubWF0Y2goIC93cGJjX3dpemFyZF9zdGVwKFxcZCspLyApO1xuXHRcdGlmICggISB0YXJnZXRfbWF0Y2ggfHwgKCBjdXJyZW50X21hdGNoICYmIE51bWJlciggdGFyZ2V0X21hdGNoWzFdICkgPD0gTnVtYmVyKCBjdXJyZW50X21hdGNoWzFdICkgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgc2VsZWN0aW9uID0gZ2V0X3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICk7XG5cdFx0dmFyICRjdXJyZW50X3N0ZXAgPSAkYnV0dG9uLmNsb3Nlc3QoICcud3BiY193aXphcmRfc3RlcCcgKTtcblx0XHR2YXIgJHRpbWVfc3RlcCA9IHNlbGVjdGlvbi4kc3RhcnQuY2xvc2VzdCggJy53cGJjX3dpemFyZF9zdGVwJyApO1xuXHRcdGlmICggJHRpbWVfc3RlcC5sZW5ndGggJiYgJGN1cnJlbnRfc3RlcC5sZW5ndGggJiYgJHRpbWVf
954c3RlcC5nZXQoIDAgKSAhPT0gJGN1cnJlbnRfc3RlcC5nZXQoIDAgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCAhIHNlbGVjdGlvbi5jb21wbGV0ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIHN0YXRlID0gZ2V0X3RpbWVfdmFsaWRhdGlvbl9zdGF0ZSggJG5hdGl2ZSApO1xuXHRcdGlmICggc2VsZWN0aW9uLnNpZ25hdHVyZSA9PT0gc3RhdGUuc2lnbmF0dXJlICYmICd2YWxpZCcgPT09IHN0YXRlLnN0YXR1cyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdHZhbGlkYXRlX3RpbWVfc2VsZWN0aW9uKCAkbmF0aXZlICkuZG9uZSggZnVuY3Rpb24gKCB2YWxpZCApIHtcblx0XHRcdGlmICggdmFsaWQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKCAkYnV0dG9uLmdldCggMCApICkgKSB7XG5cdFx0XHRcdCRidXR0b24uZ2V0KCAwICkud3BiY19hcHBvaW50bWVudF9wcmVmbGlnaHRfYnlwYXNzID0gdHJ1ZTtcblx0XHRcdFx0JGJ1dHRvbi5nZXQoIDAgKS5jbGljaygpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBBdHRhY2ggaXNvbGF0ZWQgYnVmZmVyIHByZWZsaWdodCBiZWhhdmlvciB0byBvbmUgbmF0aXZlIEFwcG9pbnRtZW50IGZvcm0uICovXG5cdGZ1bmN0aW9uIGluaXRpYWxpemVfdGltZV9wcmVmbGlnaHQoICRuYXRpdmUgKSB7XG5cdFx0aWYgKCAhIGNvbmZpZy5hamF4X3VybCB8fCAhIGNvbmZpZy52YWxpZGF0ZV9hY3Rpb24gfHwgISAkbmF0aXZlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIG5hdGl2ZV9lbGVtZW50ID0gJG5hdGl2ZS5nZXQoIDAgKTtcblx0XHRpZiAoIG5hdGl2ZV9lbGVtZW50LndwYmNfYXBwb2ludG1lbnRfdGltZV9wcmVmbGlnaHRfcmVhZHkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG5hdGl2ZV9lbGVtZW50LndwYmNfYXBwb2ludG1lbnRfdGltZV9wcmVmbGlnaHRfcmVhZHkgPSB0cnVlO1xuXHRcdG5hdGl2ZV9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cdFx0XHRjYXB0dXJlX3dpemFyZF9uYXZpZ2F0aW9uKCBldmVudCwgJG5hdGl2ZSApO1xuXHRcdH0sIHRydWUgKTtcblx0XHQkbmF0aXZlLm9uKCAnY2hhbmdlLndwYmNfYXBwb2ludG1lbnRfdGltZV9wcmVmbGlnaHQnLCAnW25hbWVePVwic3RhcnR0aW1lXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0c2NoZWR1bGVfdGltZV92YWxpZGF0aW9uKCAkbmF0aXZlICk7XG5cdFx0fSApO1xuXHRcdCRuYXRpdmUub24oICdkYXRlX3NlbGVjdGVkLndwYmNfYXBwb2ludG1lbnRfdGltZV9wcmVmbGlnaHQgd3BiY19ob29rX3RpbWVzbG90c19kaXNhYmxlZC53cGJjX2FwcG9pbnRtZW50X3RpbWVfcHJlZmxpZ2h0JywgZnVuY3Rpb24gKCBldmVudCwgcHJvdmlkZXJfaWQgKSB7XG5cdFx0XHRpZiAoIE51bWJlciggcHJvdmlkZXJfaWQgfHwgMCApID09PSBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKSApIHtcblx0XHRcdFx0c2NoZWR1bGVfYXZhaWxhYmxlX3N0YXJ0X3RpbWVzKCAkbmF0aXZlICk7XG5cdFx0XHRcdHNjaGVkdWxlX3RpbWVfdmFsaWRhdGlvbiggJG5hdGl2ZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRzY2hlZHVsZV9hdmFpbGFibGVfc3RhcnRfdGltZXMoICRuYXRpdmUgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NrIGEgbmF0aXZlIGR1cmF0aW9uIGZpZWxkIHRvIHRoZSBzZWxlY3RlZCBTZXJ2aWNlIGR1cmF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgY29yZSBzYXZlIGhhbmRsZXIgaW5kZXBlbmRlbnRseSBkZXJpdmVzIGR1cmF0aW9uIGZyb20gdGhlIFNlcnZpY2Ugcm93O1xuXHQgKiB0aGlzIGNsaWVudCBzdGVwIG9ubHkga2VlcHMgdGhlIHZpc2libGUgZm9ybSBhbmQgc2VyaWFsaXplZCBkYXRhIGFsaWduZWQuXG5cdCAqL1xuXHRmdW5jdGlvbiBwcmVwYXJlX25hdGl2ZV9mb3JtKCAkc2NvcGUgKSB7XG5cdFx0dmFyICRuYXRpdmUgPSAkc2NvcGUuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAhICRuYXRpdmUubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICggISByZWdpc3Rlcl9uYXRpdmVfZm9ybSggJG5hdGl2ZSApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciByZXNvdXJjZV9pZCA9IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncHJvdmlkZXItaWQnICkgfHwgMCApO1xuXHRcdHZhciBkdXJhdGlvbiA9IFN0cmluZyggJG5hdGl2ZS5kYXRhKCAnZHVyYXRpb24nICkgfHwgJycgKTtcblx0XHR2YXIgZmllbGRfbmFtZSA9ICdkdXJhdGlvbnRpbWUnICsgcmVzb3VyY2VfaWQ7XG5cdFx0dmFyICRmb3JtID0gJG5hdGl2ZS5maW5kKCAnI2Jvb2tpbmdfZm9ybScgKyByZXNvdXJjZV9pZCApO1xuXHRcdCRmb3JtLmZpbmQoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19kdXJhdGlvbl9wcm94eScgKS5yZW1vdmUoKTtcblx0XHR2YXIgJGR1cmF0aW9uX2ZpZWxkcyA9ICRmb3JtLmZpbmQoICdbbmFtZT1cIicgKyBmaWVsZF9uYW1lICsgJ1wiXSwgW25hbWU9XCInICsgZmllbGRfbmFtZSArICdbXVwiXScgKTtcblx0XHR2YXIgJGRlcml2ZWRfdGltZV9maWVsZHMgPSAkZm9ybS5maW5kKCAnW25hbWU9XCJlbmR0aW1lJyArIHJlc291cmNlX2lkICsgJ1wiXSwgW25hbWU9XCJlbmR0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdLCBbbmFtZT1cInJhbmdldGltZScgKyByZXNvdXJjZV9pZCArICdcIl0sIFtuYW1lPVwicmFuZ2V0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdJyApO1xuXG5cdFx0JGR1cmF0aW9uX2ZpZWxkcy5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgJGZpZWxkID0gJCggdGhpcyApO1xuXHRcdFx0aWYgKCAkZmllbGQuaXMoICdzZWxlY3QnICkgJiYgISAkZmllbGQuZmluZCggJ29wdGlvblt2YWx1ZT1cIicgKyBkdXJhdGlvbi5yZXBsYWNlKCAvXCIvZywgJ1xcXFxcIicgKSArICdcIl0nICkubGVuZ3RoICkge1xuXHRcdFx0XHQkZmllbGQuYXBwZW5kKCAkKCA
954nPG9wdGlvbj4nLCB7IHZhbHVlOiBkdXJhdGlvbiwgdGV4dDogZHVyYXRpb24gfSApICk7XG5cdFx0XHR9XG5cdFx0XHQkZmllbGQudmFsKCBkdXJhdGlvbiApLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKS5hdHRyKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xuXHRcdFx0JGZpZWxkLmNsb3Nlc3QoICcud3BkZXYtZm9ybS1jb250cm9sLXdyYXAnICkuYWRkQ2xhc3MoICd3cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2ZpeGVkX2R1cmF0aW9uX2ZpZWxkJyApO1xuXHRcdH0gKTtcblx0XHQkZGVyaXZlZF90aW1lX2ZpZWxkcy5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgJGZpZWxkID0gJCggdGhpcyApO1xuXHRcdFx0JGZpZWxkLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKS5hdHRyKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xuXHRcdFx0JGZpZWxkLmNsb3Nlc3QoICcud3BkZXYtZm9ybS1jb250cm9sLXdyYXAnICkuYWRkQ2xhc3MoICd3cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2ZpeGVkX2R1cmF0aW9uX2ZpZWxkJyApO1xuXHRcdH0gKTtcblxuXHRcdGlmICggISAkZHVyYXRpb25fZmllbGRzLmxlbmd0aCApIHtcblx0XHRcdHZhciAkZHVyYXRpb25fcHJveHkgPSAkKCAnPHNlbGVjdD4nLCB7XG5cdFx0XHRcdG5hbWU6IGZpZWxkX25hbWUsXG5cdFx0XHRcdCdjbGFzcyc6ICd3cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2R1cmF0aW9uX3ZhbHVlJyxcblx0XHRcdFx0J2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuXHRcdFx0XHR0YWJpbmRleDogJy0xJyxcblx0XHRcdFx0J2RhdGEtd3BiYy1hcHBvaW50bWVudC1nZW5lcmF0ZWQnOiAnMSdcblx0XHRcdH0gKS5hcHBlbmQoICQoICc8b3B0aW9uPicsIHsgdmFsdWU6IGR1cmF0aW9uLCB0ZXh0OiBkdXJhdGlvbiwgc2VsZWN0ZWQ6IHRydWUgfSApICk7XG5cdFx0XHQkZm9ybS5hcHBlbmQoXG5cdFx0XHRcdCQoICc8c3Bhbj4nLCB7XG5cdFx0XHRcdFx0J2NsYXNzJzogJ3dwZGV2LWZvcm0tY29udHJvbC13cmFwIHdwYmNfYm9va2luZ19hcHBvaW50bWVudF9fZml4ZWRfZHVyYXRpb25fZmllbGQgd3BiY19ib29raW5nX2FwcG9pbnRtZW50X19kdXJhdGlvbl9wcm94eScsXG5cdFx0XHRcdFx0J2FyaWEtaGlkZGVuJzogJ3RydWUnXG5cdFx0XHRcdH0gKS5hcHBlbmQoICRkdXJhdGlvbl9wcm94eSApXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGluaXRpYWxpemVfdGltZV9wcmVmbGlnaHQoICRuYXRpdmUgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqIENvbnZlcnQgYSBzY3JpcHQgVVJMIHRvIHRoZSBzYW1lIGFic29sdXRlIHJlcHJlc2VudGF0aW9uIGFzIERPTSBzY3JpcHQuc3JjLiAqL1xuXHRmdW5jdGlvbiBnZXRfYWJzb2x1dGVfc2NyaXB0X3VybCggdXJsICkge1xuXHRcdHZhciBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYScgKTtcblx0XHRhbmNob3IuaHJlZiA9IFN0cmluZyggdXJsIHx8ICcnICk7XG5cdFx0cmV0dXJuIGFuY2hvci5ocmVmO1xuXHR9XG5cblx0LyoqIEV4ZWN1dGUgcmVuZGVyZXIgc2NyaXB0cyBzZXF1ZW50aWFsbHkgd2hpbGUgdGhlIHJlcXVlc3Qgc3RpbGwgb3ducyB0aGUgc3RhZ2UuICovXG5cdGZ1bmN0aW9uIGV4ZWN1dGVfc2NyaXB0cyggc2NyaXB0cywgb3duc19zdGFnZSApIHtcblx0XHR2YXIgc2VxdWVuY2UgPSAkLkRlZmVycmVkKCkucmVzb2x2ZSgpLnByb21pc2UoKTtcblxuXHRcdCQuZWFjaCggc2NyaXB0cywgZnVuY3Rpb24gKCBpbmRleCwgc2NyaXB0ICkge1xuXHRcdFx0c2VxdWVuY2UgPSBzZXF1ZW5jZS50aGVuKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICggISBvd25zX3N0YWdlKCkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCAnJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggc2NyaXB0LnNyYyApIHtcblx0XHRcdFx0XHR2YXIgYWJzb2x1dGVfdXJsID0gZ2V0X2Fic29sdXRlX3NjcmlwdF91cmwoIHNjcmlwdC5zcmMgKTtcblx0XHRcdFx0XHRpZiAoIGxvYWRlZF9zY3JpcHRfdXJsc1sgYWJzb2x1dGVfdXJsIF0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJC5hamF4KCB7IHVybDogYWJzb2x1dGVfdXJsLCBkYXRhVHlwZTogJ3NjcmlwdCcsIGNhY2hlOiB0cnVlIH0gKS50aGVuKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRsb2FkZWRfc2NyaXB0X3VybHNbIGFic29sdXRlX3VybCBdID0gdHJ1ZTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBzY3JpcHQuY29kZSApIHtcblx0XHRcdFx0XHQkLmdsb2JhbEV2YWwoIHNjcmlwdC5jb2RlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gc2VxdWVuY2U7XG5cdH1cblxuXHQvKiogSW5pdGlhbGl6ZSBjb250cm9scyB3aG9zZSBjb3JlIGhhbmRsZXJzIG5vcm1hbGx5IGJpbmQgb24gZG9jdW1lbnQgcmVhZHkuICovXG5cdGZ1bmN0aW9uIGluaXRpYWxpemVfYWpheF9mb3JtX2NvbnRyb2xzKCkge1xuXHRcdGlmICggdHlwZW9mIHdpbmRvdy53cGJjX2hvb2tfX2luaXRfYm9va2luZ19mb3JtX3dpemFyZF9idXR0b25zID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0d2luZG93LndwYmNfaG9va19faW5pdF9ib29raW5nX2Zvcm1fd2l6YXJkX2J1dHRvbnMoKTtcblx0XHR9XG5cdH1cblxuXHQvKiogRGVzdHJveSBuYXRpdmUgY2FsZW5kYXIgaW5zdGFuY2VzIGFuZCB1bnJlZ2lzdGVyIGNvbnRleHQgYmVmb3JlIHJlbW92YWwuICovXG5cdGZ1bmN0aW9uIGNsZWFudXBfbmF0aXZlX2Zvcm0oICRyb290ICkge1xuXHRcdCRyb290LmZpbmQoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19uYXRpdmVfZm9ybScgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgJG5hdGl2ZSA9ICQoIHRoaXMgKTtcblx0XHRcdHZhciByZXNvdXJjZV9pZCA9IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncHJvdmlkZXItaWQnICkgfHwgMCApO1xuXHRcdFx0dmFyICRjYWxlbmRhciA9ICRuYXRpdmUuZmluZCggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICk7XG5cblx0XHRcdHVucmVnaXN0ZXJfbmF0aXZlX2Zvcm0oICRuYXRpdmUgKTtcblx0XHRcdGlmICggISByZXNvdXJjZV9pZCB8fCAhICRjYWxlbmRhci5sZW5ndGggfHwgISAkLmRhdGVwaWNrIHx8IHR5cGVvZiAkY2FsZW5kYXIuZGF0ZXBpY2sgIT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gdHlwZW9mICQuZGF0ZXBpY2suX2dldEluc3QgPT09ICdmdW5jdGlvbicgPyAkLmRhdGVwaWNrLl9nZXRJbnN0KCAkY2FsZW5kYXIuZ2V0KCAwICkgKSA6IG51bGw7XG5cdFx0XHRcdGlmICggaW5zdGFuY2UgKSB7XG5cdFx0XHRcdFx0JGNhbGVuZGFyLmRhdGVwaWNrKCAnZGVzdHJveScgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXHRcdFx0XHQkY2FsZW5kYXIucmVtb3ZlQ2xhc3MoICdoYXNEYXRlcGljaycgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHQvKiogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBTZXJ2aWNlIHdoZW4gbmF2aWdhdGluZyBiYWNrIG9uZSBzdGFnZS4gKi9cblx0ZnVuY3Rpb24gcmVzdG9yZV9zZXJ2aWNlX3NlbGVjdGlvbiggJHJvb3QgKSB7XG5cdFx0dmFyIHNlcnZpY2VfaWQgPSBOdW1iZXIoICRyb290LmF0dHIoICdkYXRhLXNlbGVjdGVkLXNlcnZpY2UtaWQnICkgfHwgMCApO1xuXHRcdGlmICggISBzZXJ2aWNlX2lkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgJGlucHV0ID0gJHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX3NlbGVjdGlvbl9mb3JtIFtuYW1lPVwid3BiY19hcHBvaW50bWVudF9zZXJ2aWNlXCJdW3ZhbHVlPVwiJyArIHNlcnZpY2VfaWQgKyAnXCJdJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAkaW5wdXQubGVuZ3RoICkge1xuXHRcdFx0JGlucHV0LnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmNsb3Nlc3QoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19jaG9pY2UnICkuYWRk
954Q2xhc3MoICdpcy1zZWxlY3RlZCcgKTtcblx0XHR9XG5cdH1cblxuXHQvKiogRm9jdXMgdGhlIG5ldyBzdGFnZSBoZWFkaW5nIHdpdGhvdXQgZm9yY2luZyBtb3Rpb24gZm9yIHJlZHVjZWQtbW90aW9uIHVzZXJzLiAqL1xuXHRmdW5jdGlvbiBmb2N1c19zdGFnZSggJHJvb3QgKSB7XG5cdFx0dmFyICR0YXJnZXQgPSAkcm9vdC5maW5kKCAnPiAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19zdGFnZSAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19oZWFkaW5nIGgzLCA+IC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX3N0YWdlIC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25vdGljZScgKS5maXJzdCgpO1xuXHRcdGlmICggJHRhcmdldC5sZW5ndGggKSB7XG5cdFx0XHQkdGFyZ2V0LmF0dHIoICd0YWJpbmRleCcsICctMScgKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdCR0YXJnZXQuZ2V0KCAwICkuZm9jdXMoIHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9ICk7XG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cdFx0XHRcdCR0YXJnZXQudHJpZ2dlciggJ2ZvY3VzJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggJHJvb3QuZ2V0KCAwICkgJiYgdHlwZW9mICRyb290LmdldCggMCApLnNjcm9sbEludG9WaWV3ID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0dmFyIHJlZHVjZV9tb3Rpb24gPSB3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSggJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJyApLm1hdGNoZXM7XG5cdFx0XHQkcm9vdC5nZXQoIDAgKS5zY3JvbGxJbnRvVmlldyggeyBiZWhhdmlvcjogcmVkdWNlX21vdGlvbiA/ICdhdXRvJyA6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0gKTtcblx0XHR9XG5cdH1cblxuXHQvKiogUmV0dXJuIGEgcmVqZWN0ZWQgcHJvbWlzZSBjYXJyeWluZyBvbmUgY29udHJvbGxlZCBpbml0aWFsaXphdGlvbiBtZXNzYWdlLiAqL1xuXHRmdW5jdGlvbiByZWplY3RlZF9zdGFnZSggbWVzc2FnZSApIHtcblx0XHR2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cdFx0ZGVmZXJyZWQucmVqZWN0KCB7IHdwYmNfbWVzc2FnZTogbWVzc2FnZSB9ICk7XG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKiBSZXBsYWNlIGEgc3RhZ2Ugd2hpbGUgZ3VhcmFudGVlaW5nIERPTS1iZWZvcmUtc2NyaXB0IGluaXRpYWxpemF0aW9uIG9yZGVyLiAqL1xuXHRmdW5jdGlvbiByZXBsYWNlX3N0YWdlKCAkcm9vdCwgaHRtbCwgc3RhZ2UsIHByb3ZpZGVyX2lkLCByZXF1ZXN0X2lkICkge1xuXHRcdGlmICggISBpc19jdXJyZW50X3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICkgKSB7XG5cdFx0XHRyZXR1cm4gcmVqZWN0ZWRfc3RhZ2UoICcnICk7XG5cdFx0fVxuXHRcdGlmICggJ2Jvb2tpbmcnID09PSBzdGFnZSAmJiBoYXNfZHVwbGljYXRlX3Byb3ZpZGVyX2Zvcm0oICRyb290LCBwcm92aWRlcl9pZCApICkge1xuXHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCBjb25maWcuZHVwbGljYXRlX3Byb3ZpZGVyICk7XG5cdFx0fVxuXG5cdFx0dmFyIHBhcnNlZCA9ICQucGFyc2VIVE1MKCBTdHJpbmcoIGh0bWwgfHwgJycgKSwgZG9jdW1lbnQsIHRydWUgKSB8fCBbXTtcblx0XHR2YXIgc2NyaXB0cyA9IFtdO1xuXHRcdHZhciAkY29udGFpbmVyID0gJCggJzxkaXY+JyApLmFwcGVuZCggcGFyc2VkICk7XG5cblx0XHQkY29udGFpbmVyLmZpbmQoICdzY3JpcHQnICkuYWRkQmFjayggJ3NjcmlwdCcgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzY3JpcHRzLnB1c2goIHsgc3JjOiB0aGlzLnNyYyB8fCAnJywgY29kZTogdGhpcy5zcmMgPyAnJyA6ICggdGhpcy50ZXh0IHx8IHRoaXMudGV4dENvbnRlbnQgfHwgJycgKSB9ICk7XG5cdFx0XHQkKCB0aGlzICkucmVtb3ZlKCk7XG5cdFx0fSApO1xuXG5cdFx0Y2xlYW51cF9uYXRpdmVfZm9ybSggJHJvb3QgKTtcblx0XHQkcm9vdC5hdHRyKCAnZGF0YS1hcHBvaW50bWVudC1zdGFnZScsIHN0YWdlICk7XG5cdFx0JHJvb3QuZmluZCggJz4gLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc3RhZ2UnICkuZW1wdHkoKS5hcHBlbmQoICRjb250YWluZXIuY29udGVudHMoKSApO1xuXG5cdFx0aWYgKCAhIHByZXBhcmVfbmF0aXZlX2Zvcm0oICRyb290ICkgKSB7XG5cdFx0XHRjbGVhbnVwX25hdGl2ZV9mb3JtKCAkcm9vdCApO1xuXHRcdFx0JHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtIDppbnB1dCcgKS5wcm9wKCAnZGlzYWJsZWQnLCB0cnVlICk7XG5cdFx0XHRyZXR1cm4gcmVqZWN0ZWRfc3RhZ2UoIGNvbmZpZy5pbml0aWFsaXphdGlvbl9lcnJvciB8fCBjb25maWcuZXJyb3IgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXhlY3V0ZV9zY3JpcHRzKCBzY3JpcHRzLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApO1xuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoICEgaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApICkge1xuXHRcdFx0XHRyZXR1cm4gcmVqZWN0ZWRfc3RhZ2UoICcnICk7XG5cdFx0XHR9XG5cdFx0XHRpbml0aWFsaXplX2FqYXhfZm9ybV9jb250cm9scygpO1xuXHRcdFx0aWYgKCAnc2VydmljZScgPT09IHN0YWdlICkge1xuXHRcdFx0XHRyZXN0b3JlX3NlcnZpY2Vfc2VsZWN0aW9uKCAkcm9vdCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBEZXRlcm1pbmUgd2hldGhlciBhbiBBSkFYIGNhbGxiYWNrIHN0aWxsIG93bnMgdGhlIGNvbXBvbmVudCBzdGF0ZS4gKi9cblx0ZnVuY3Rpb24gaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApIHtcblx0XHRyZXR1cm4gTnVtYmVyKCAkcm9vdC5kYXRhKCAnd3BiYy1hcHBvaW50bWVudC1yZXF1ZXN0LWlkJyApIHx8IDAgKSA9PT0gTnVtYmVyKCByZXF1ZXN0X2lkICk7XG5cdH1cblxuXHQvKiogRmluaXNoIG9ubHkgdGhlIGN1cnJlbnQgcmVxdWVzdCBzbyBzdGFsZSBjYWxsYmFja3MgY2Fubm90IGFsdGVyIHR
954oZSBVSS4gKi9cblx0ZnVuY3Rpb24gZmluaXNoX3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICkge1xuXHRcdGlmICggISBpc19jdXJyZW50X3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdCRyb290LnJlbW92ZURhdGEoICd3cGJjLWFwcG9pbnRtZW50LXJlcXVlc3QnICk7XG5cdFx0c2V0X2xvYWRpbmcoICRyb290LCBmYWxzZSApO1xuXHR9XG5cblx0LyoqIFJlcXVlc3QgYW5kIHJlbmRlciB0aGUgbmV4dCBBcHBvaW50bWVudCB3b3JrZmxvdyBzdGFnZS4gKi9cblx0ZnVuY3Rpb24gcmVzb2x2ZV9zdGFnZSggJHJvb3QsIHNlcnZpY2VfaWQsIHByb3ZpZGVyX2lkICkge1xuXHRcdGlmICggISAkcm9vdCB8fCAhICRyb290Lmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZXJ2aWNlX2lkID0gTnVtYmVyKCBzZXJ2aWNlX2lkIHx8IDAgKTtcblx0XHRwcm92aWRlcl9pZCA9IE51bWJlciggcHJvdmlkZXJfaWQgfHwgMCApO1xuXHRcdGlmICggc2VydmljZV9pZCApIHtcblx0XHRcdCRyb290LmF0dHIoICdkYXRhLXNlbGVjdGVkLXNlcnZpY2UtaWQnLCBzZXJ2aWNlX2lkICk7XG5cdFx0fVxuXHRcdGlmICggcHJvdmlkZXJfaWQgKSB7XG5cdFx0XHQkcm9vdC5hdHRyKCAnZGF0YS1zZWxlY3RlZC1wcm92aWRlci1pZCcsIHByb3ZpZGVyX2lkICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByZXZpb3VzX3JlcXVlc3QgPSAkcm9vdC5kYXRhKCAnd3BiYy1hcHBvaW50bWVudC1yZXF1ZXN0JyApO1xuXHRcdHZhciByZXF1ZXN0X2lkID0gTnVtYmVyKCAkcm9vdC5kYXRhKCAnd3BiYy1hcHBvaW50bWVudC1yZXF1ZXN0LWlkJyApIHx8IDAgKSArIDE7XG5cdFx0JHJvb3QuZGF0YSggJ3dwYmMtYXBwb2ludG1lbnQtcmVxdWVzdC1pZCcsIHJlcXVlc3RfaWQgKTtcblx0XHRpZiAoIHByZXZpb3VzX3JlcXVlc3QgJiYgcHJldmlvdXNfcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0ICkge1xuXHRcdFx0cHJldmlvdXNfcmVxdWVzdC5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdGNsZWFyX2Vycm9yKCAkcm9vdCApO1xuXHRcdHNldF9sb2FkaW5nKCAkcm9vdCwgdHJ1ZSApO1xuXHRcdHZhciByZXF1ZXN0ID0gJC5wb3N0KCBjb25maWcuYWpheF91cmwsIHtcblx0XHRcdGFjdGlvbjogY29uZmlnLmFjdGlvbixcblx0XHRcdG5vbmNlOiBjb25maWcubm9uY2UsXG5cdFx0XHRjb25maWdfdG9rZW46ICRyb290LmF0dHIoICdkYXRhLWNvbmZpZy10b2tlbicgKSB8fCAnJyxcblx0XHRcdHNlcnZpY2VfaWQ6IHNlcnZpY2VfaWQsXG5cdFx0XHRwcm92aWRlcl9pZDogcHJvdmlkZXJfaWRcblx0XHR9ICk7XG5cdFx0JHJvb3QuZGF0YSggJ3dwYmMtYXBwb2ludG1lbnQtcmVxdWVzdCcsIHJlcXVlc3QgKTtcblxuXHRcdHJlcXVlc3QuZG9uZSggZnVuY3Rpb24gKCByZXNwb25zZSApIHtcblx0XHRcdGlmICggISBpc19jdXJyZW50X3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICkgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggISByZXNwb25zZSB8fCAhIHJlc3BvbnNlLnN1Y2Nlc3MgfHwgISByZXNwb25zZS5kYXRhICkge1xuXHRcdFx0XHRzaG93X2Vycm9yKFxuXHRcdFx0XHRcdCRyb290LFxuXHRcdFx0XHRcdHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5tZXNzYWdlID8gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIDogY29uZmlnLmVycm9yLFxuXHRcdFx0XHRcdHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgPyByZXNwb25zZS5kYXRhLmFjdGlvbl91cmwgOiAnJyxcblx0XHRcdFx0XHRyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5hY3Rpb25fbGFiZWwgOiAnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRmaW5pc2hfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc3RhZ2UgPSByZXNwb25zZS5kYXRhLnN0YWdlIHx8ICcnO1xuXHRcdFx0dmFyIHJlcGxhY2VtZW50ID0gcmVwbGFjZV9zdGFnZSggJHJvb3QsIHJlc3BvbnNlLmRhdGEuaHRtbCwgc3RhZ2UsIHJlc3BvbnNlLmRhdGEucHJvdmlkZXJfaWQsIHJlcXVlc3RfaWQgKTtcblx0XHRcdHJlcGxhY2VtZW50LmRvbmUoIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCAhIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBOdW1iZXIoIHJlc3BvbnNlLmRhdGEuc2VydmljZV9pZCB8fCAwICkgKSB7XG5cdFx0XHRcdFx0JHJvb3QuYXR0ciggJ2RhdGEtc2VsZWN0ZWQtc2VydmljZS1pZCcsIE51bWJlciggcmVzcG9uc2UuZGF0YS5zZXJ2aWNlX2lkICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIE51bWJlciggcmVzcG9uc2UuZGF0YS5wcm92aWRlcl9pZCB8fCAwICkgKSB7XG5cdFx0XHRcdFx0JHJvb3QuYXR0ciggJ2RhdGEtc2VsZWN0ZWQtcHJvdmlkZXItaWQnLCBOdW1iZXIoIHJlc3BvbnNlLmRhdGEucHJvdmlkZXJfaWQgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZpbmlzaF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApO1xuXHRcdFx0XHRmb2N1c19zdGFnZSggJHJvb3QgKTtcblx0XHRcdH0gKS5mYWlsKCBmdW5jdGlvbiAoIGVycm9yICkge1xuXHRcdFx0XHRpZiAoICEgaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgbWVzc2FnZSA9IGVycm9yICYmIGVycm9yLndwYmNfbWVzc2FnZSA/IGVycm9yLndwYmNfbWVzc2FnZSA6ICggY29uZmlnLmluaXRpYWxpemF0aW9uX2Vycm9yIHx8IGNvbmZpZy5lcnJvciApO1xuXHRcdFx0XHRzaG93X2Vycm9yKCAkcm9vdCwgbWVzc2FnZSApO1xuXHRcdFx0XHRmaW5pc2hfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKTtcblx0XHRcdH0gKTtcblx0XHR9ICkuZmFpbCggZnVuY3Rpb24gKCB4aHIsIHN0YXR1cyApIHtcblx0XHRcdGlmICggJ2Fib3J0JyA9PT0gc3RhdHVzIHx8ICEgaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2VKU09OO1xuXHRcdFx0c2hvd19lcnJvcihcblx0XHRcdFx0JHJvb3QsXG5cdFx0XHRcdHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5tZXNzYWdlID8gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIDogY29uZmlnLmVycm9yLFxuXHRcdFx0XHRyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhID8gcmVz
954cG9uc2UuZGF0YS5hY3Rpb25fdXJsIDogJycsXG5cdFx0XHRcdHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgPyByZXNwb25zZS5kYXRhLmFjdGlvbl9sYWJlbCA6ICcnXG5cdFx0XHQpO1xuXHRcdFx0ZmluaXNoX3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqIEhhbmRsZSBTZXJ2aWNlIGFuZCBQcm92aWRlciBmYWxsYmFjayBmb3JtcyB0aHJvdWdoIEFKQVguICovXG5cdCQoIGRvY3VtZW50ICkub24oICdzdWJtaXQnLCAnLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc2VsZWN0aW9uX2Zvcm0nLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXHRcdGlmICggISBjb25maWcuYWpheF91cmwgfHwgISBjb25maWcuYWN0aW9uICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHZhciAkZm9ybSA9ICQoIHRoaXMgKTtcblx0XHR2YXIgJHJvb3QgPSAkZm9ybS5jbG9zZXN0KCAnLndwYmNfYm9va2luZ19hcHBvaW50bWVudCcgKTtcblx0XHRyZXNvbHZlX3N0YWdlKCAkcm9vdCwgZ2V0X3NlbGVjdGVkX2lkKCAkZm9ybSwgJ3dwYmNfYXBwb2ludG1lbnRfc2VydmljZScgKSwgZ2V0X3NlbGVjdGVkX2lkKCAkZm9ybSwgJ3dwYmNfYXBwb2ludG1lbnRfcHJvdmlkZXInICkgKTtcblx0fSApO1xuXG5cdC8qKiBLZWVwIHBsYXRlIHNlbGVjdGlvbiBzdHlsaW5nIGluZGVwZW5kZW50IGZyb20gQ1NTIDpoYXMoKSBzdXBwb3J0LiAqL1xuXHQkKCBkb2N1bWVudCApLm9uKCAnY2hhbmdlJywgJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZSA+IGlucHV0JywgZnVuY3Rpb24gKCkge1xuXHRcdHZhciAkaW5wdXQgPSAkKCB0aGlzICk7XG5cdFx0JGlucHV0LmNsb3Nlc3QoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19jaG9pY2VzJyApLmZpbmQoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19jaG9pY2UnICkucmVtb3ZlQ2xhc3MoICdpcy1zZWxlY3RlZCcgKTtcblx0XHQkaW5wdXQuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZScgKS5hZGRDbGFzcyggJ2lzLXNlbGVjdGVkJyApO1xuXHR9ICk7XG5cblx0LyoqIEZpbHRlciBTZXJ2aWNlIGFuZCBQcm92aWRlciBjYXJkcyB3aXRob3V0IGNoYW5naW5nIHRoZSBzaWduZWQgY2F0YWxvZy4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ2lucHV0IHNlYXJjaCcsICdbZGF0YS13cGJjLWFwcG9pbnRtZW50LWNhdGFsb2ctc2VhcmNoXScsIGZ1bmN0aW9uICgpIHtcblx0XHRmaWx0ZXJfYXBwb2ludG1lbnRfY2F0YWxvZyggJCggdGhpcyApLmNsb3Nlc3QoICdbZGF0YS13cGJjLWFwcG9pbnRtZW50LWNhdGFsb2ddJyApICk7XG5cdH0gKTtcblxuXHQvKiogUmV0dXJuIHRvIFNlcnZpY2Ugc2VsZWN0aW9uIHdoaWxlIHByZXNlcnZpbmcgdGhlIGxhc3QgdmFsaWQgU2VydmljZS4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnQgW2RhdGEtYXBwb2ludG1lbnQtYmFjaz1cInNlcnZpY2VcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyICRyb290ID0gJCggdGhpcyApLmNsb3Nlc3QoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50JyApO1xuXHRcdGlmICggJHJvb3QuaGFzQ2xhc3MoICdpcy1sb2FkaW5nJyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZXNvbHZlX3N0YWdlKCAkcm9vdCwgMCwgMCApO1xuXHR9ICk7XG5cblx0LyoqIFJldHVybiB0byB0aGUgZmlyc3Qgc2VsZWN0YWJsZSBBcHBvaW50bWVudCBzdGFnZSB3aXRob3V0IHJlbG9hZGluZyB0aGUgcGFnZS4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnQgW2RhdGEtd3BiYy1hcHBvaW50bWVudC1hY3Rpb249XCJzdGFydC1vdmVyXCJdLCAud3BiY19ib29raW5nX2FwcG9pbnRtZW50IC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2NoYW5nZScsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cdFx0aWYgKCAhIGNvbmZpZy5hamF4X3VybCB8fCAhIGNvbmZpZy5hY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dmFyICRyb290ID0gJCggdGhpcyApLmNsb3Nlc3QoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50JyApO1xuXHRcdGlmICggJHJvb3QuaGFzQ2xhc3MoICdpcy1sb2FkaW5nJyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQkcm9vdC5yZW1vdmVBdHRyKCAnZGF0YS1zZWxlY3RlZC1zZXJ2aWNlLWlkIGRhdGEtc2VsZWN0ZWQtcHJvdmlkZXItaWQnICk7XG5cdFx0cmVzb2x2ZV9zdGFnZSggJHJvb3QsIDAsIDAgKTtcblx0fSApO1xuXG5cdC8qKiBBZGQgdGhlIHJlZ2lzdGVyZWQgc2lnbmVkIGFuZCBzZXJ2ZXItYXV0aG9yaXplZCBjb250ZXh0IHRvIHRoZSBjb3JlIGJvb2tpbmcgcmVxdWVzdC4gKi9cblx0JCggJ2JvZHknICkub24oICd3cGJjX2JlZm9yZV9ib29raW5nX2NyZWF0ZS53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnQnLCBmdW5jdGlvbiAoIGV2ZW50LCByZXNvdXJjZV9pZCwgcGFyYW1zICkge1xuXHRcdHZhciBjb250ZXh0ID0gZ2V0X25hdGl2ZV9jb250ZXh0KCByZXNvdXJjZV9pZCApO1xuXHRcdGlmICggISBjb250ZXh0ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwYXJhbXMuc2VydmljZV9pZCA9IGNvbnRleHQuc2VydmljZV9pZDtcblx0XHRwYXJhbXMuYXBwb2ludG1lbnRfc2VydmljZV9yZXF1aXJlZCA9IDE7XG5cdFx0cGFyYW1zLmFwcG9pbnRtZW50X2NvbnRleHRfdG9rZW4gPSBjb250ZXh0LmNvbnRleHRfdG9rZW47XG5cdFx0cGFyYW1zLmFsbG93X3Bhc3QgPSBjb250ZXh0LmFsbG93X3Bhc3Q7XG5cdH0gKTtcblxuXHQvKiogQWRkIHRoZSBzaWduZWQgQXBwb2ludG1lbnQgcGFpciB0byB0aGUgZXhpc3RpbmcgbGl2ZS1jb3N0IHJlcXVlc3QuICovXG5cdCQoIGRvY3VtZW50ICkub24oICd3cGJjX2JlZm9yZV9jb3N0X3JlcXVlc3Qud3BiY19ib29raW5nX2FwcG9pbnRtZW50JywgZnVuY3Rpb24gKCBldmVudCwgcmVzb3VyY2VfaWQsIHBhcmFtcyApIHtcblx0XHR2YXIgY29udGV4dCA9IGdldF9uYXRpdmVfY29udGV4dCggcmVzb3VyY2VfaWQgKTtcblx0XHRpZiAoICEgY29udGV4dCB8fCAhIHBhcmFtcyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cGFyYW1zLmFwcG9pbnRtZW50X3NlcnZpY2VfaWQgPSBjb250ZXh0LnNlcnZpY2VfaWQ7XG5cdFx0cGFyYW1zLmFwcG9pbnRtZW50X2NvbnRleHRfdG9rZW4gPSBjb250ZXh0LmNvbnRleHRfdG9rZW47XG5cdH0gKTtcblxuXHQkKCBmdW5jdGlvbiAoKSB7XG5cdFx0JCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnQnICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyICRyb290ID0gJCggdGhpcyApO1xuXHRcdFx0JHJvb3QuZmluZCggJ1tkYXRhLXdwYmMtYXBwb2ludG1lbnQtY2F0YWxvZ10nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRmaWx0ZXJfYXBwb2ludG1lbnRfY2F0YWxvZyggJCggdGhpcyApICk7XG5cdFx0XHR9ICk7XG5cdFx0XHR2YXIgJG5hdGl2ZSA9ICRyb290LmZpbmQoICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19uYXRpdmVfZm9ybScgKS5maXJzdCgpO1xuXHRcdFx0aWYgKCAkbmF0aXZlLmxlbmd0aCApIHtcblx0XHRcdFx0JHJvb3QuYXR0ciggJ2RhdGEtc2VsZWN0ZWQtc2VydmljZS1pZCcsIE51bWJlciggJG5hdGl2ZS5kYXRhKCAnc2VydmljZS1pZCcgKSB8fCAwICkgKTtcblx0XHRcdFx0JHJvb3QuYXR0ciggJ2RhdGEtc2VsZWN0ZWQtcHJvdmlkZXItaWQnLCBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhIHByZXBhcmVfbmF0aXZlX2Zvcm0oICRyb290ICkgKSB7XG5cdFx0XHRcdHZhciBkdXBsaWNhdGUgPSAkbmF0aXZlLmxlbmd0aCAmJi
954BoYXNfZHVwbGljYXRlX3Byb3ZpZGVyX2Zvcm0oICRyb290LCBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Byb3ZpZGVyLWlkJyApIHx8IDAgKSApO1xuXHRcdFx0XHRjbGVhbnVwX25hdGl2ZV9mb3JtKCAkcm9vdCApO1xuXHRcdFx0XHQkcm9vdC5maW5kKCAnLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fbmF0aXZlX2Zvcm0gOmlucHV0JyApLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKTtcblx0XHRcdFx0c2hvd19lcnJvciggJHJvb3QsIGR1cGxpY2F0ZSA/IGNvbmZpZy5kdXBsaWNhdGVfcHJvdmlkZXIgOiBjb25maWcuaW5pdGlhbGl6YXRpb25fZXJyb3IgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn0gKSggd2luZG93LCBqUXVlcnkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxDQUFFLFVBQVdBLE1BQU0sRUFBRUMsQ0FBQyxFQUFHO0VBQ3hCLFlBQVk7O0VBRVosSUFBSUMsTUFBTSxHQUFHRixNQUFNLENBQUNHLCtCQUErQixJQUFJLENBQUMsQ0FBQztFQUN6RCxJQUFJQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7RUFDL0IsSUFBSUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0VBRTNCSixDQUFDLENBQUUsYUFBYyxDQUFDLENBQUNLLElBQUksQ0FBRSxZQUFZO0lBQ3BDRCxrQkFBa0IsQ0FBRUUsTUFBTSxDQUFFLElBQUksQ0FBQ0MsR0FBRyxJQUFJLEVBQUcsQ0FBQyxDQUFFLEdBQUcsSUFBSTtFQUN0RCxDQUFFLENBQUM7O0VBRUg7RUFDQSxTQUFTQyxlQUFlQSxDQUFFQyxLQUFLLEVBQUVDLElBQUksRUFBRztJQUN2QyxPQUFPQyxNQUFNLENBQUVGLEtBQUssQ0FBQ0csSUFBSSxDQUFFLFNBQVMsR0FBR0YsSUFBSSxHQUFHLHFCQUFxQixHQUFHQSxJQUFJLEdBQUcsbUJBQW9CLENBQUMsQ0FBQ0csS0FBSyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLENBQUMsSUFBSSx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

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