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

add_appointment_page.js in Booking Calendar 11.8, at includes/page-add-appointment/_out/add_appointment_page.js

323 lines 51.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /** Add Appointment administrator inspector and non-submitting helper tools. */
4 (function ($) {
5 'use strict';
6
7 var summary_timer = 0;
8 var labels = window.wpbc_add_appointment_page_config || {};
9
10 /** Apply the administrator page context before any Provider calendar loads. */
11 function apply_booking_context() {
12 if ('undefined' === typeof window._wpbc) {
13 return;
14 }
15 window._wpbc.set_other_param('this_page_booking_hash', '');
16 window._wpbc.set_other_param('this_page_allow_past', labels.allowPast ? 1 : 0);
17 window._wpbc.set_other_param('this_page_allow_past_arr', labels.allowPastDateArr || []);
18 }
19
20 /** Switch one shared right-sidebar panel. */
21 function switch_right_panel($tab) {
22 var panel_id = $tab.attr('aria-controls');
23 var $tabs = $tab.closest('.wpbc_add_appointment__rightbar_tabs').find('[role="tab"]');
24 var $panels = $('.wpbc_add_appointment__rightbar').find('[role="tabpanel"]');
25 $tabs.attr('aria-selected', 'false');
26 $tab.attr('aria-selected', 'true');
27 $panels.attr({
28 hidden: true,
29 'aria-hidden': 'true'
30 });
31 $('#' + panel_id).removeAttr('hidden').attr('aria-hidden', 'false');
32 }
33
34 /** Return trimmed visible text from the first matching element. */
35 function get_text($root, selector) {
36 return String($root.find(selector).first().text() || '').replace(/\s+/g, ' ').trim();
37 }
38
39 /** Return the display value of one native Booking Form field. */
40 function get_field_value($field) {
41 var value;
42 if (!$field.length) {
43 return '';
44 }
45 if ($field.is('select')) {
46 value = $field.find('option:selected').text();
47 } else {
48 value = $field.val();
49 }
50 return String(value || '').replace(/\s+/g, ' ').trim();
51 }
52
53 /** Update one summary value and its empty-state presentation. */
54 function set_summary_value(key, value) {
55 var $target = $('[data-wpbc-add-appointment-summary="' + key + '"]');
56 var is_empty = '' === String(value || '').trim();
57 $target.text(is_empty ? labels.emptyLabel || 'Not selected' : value);
58 $target.toggleClass('is-empty', is_empty);
59 }
60
61 /**
62 * Expand one Settings inspector group through the shared collapsible API.
63 *
64 * @param {string} group_name Group data key.
65 * @param {string} focus_selector Optional control to focus after expansion.
66 * @return {void}
67 */
68 function open_inspector_group(group_name, focus_selector) {
69 var $group = $('.wpbc_add_appointment__inspector_overview .wpbc_ui__collapsible_group[data-group="' + group_name + '"]').first();
70 var root;
71 var api;
72 if (!$group.length) {
73 return;
74 }
75 root = $group.closest('.wpbc_collapsible').get(0);
76 api = root && root.__wpbc_collapsible_instance;
77 if (api && 'function' === typeof api.expand) {
78 api.expand($group.get(0));
79 } else {
80 $group.siblings('.wpbc_ui__collapsible_group').each(function () {
81 var $sibling = $(this);
82 $sibling.removeClass('is-open');
83 $sibling.children('.group__header').attr('aria-expanded', 'false');
84 $sibling.children('.group__fields').attr({
85 hidden: true,
86 'aria-hidden': 'true'
87 });
88 });
89 $group.addClass('is-open');
90 $group.children('.group__header').attr('aria-expanded', 'true');
91 $group.children('.group__fields').removeAttr('hidden').attr('aria-hidden', 'false');
92 }
93 window.requestAnimationFrame(function () {
94 $group.get(0).scrollIntoView({
95 behavior: 'smooth',
96 block: 'start'
97 });
98 if (focus_selector) {
99 window.setTimeout(function () {
100 $(focus_selector).first().trigger('focus');
101 }, 250);
102 }
103 });
104 }
105
106 /** Format the effective before/after Service buffers. */
107 function get_buffer_summary($source) {
108 var before = $source.attr('data-buffer-before');
109 var after = $source.attr('data-buffer-after');
110 if ('undefined' === typeof before) {
111 before = $source.attr('data-summary-buffer-before');
112 after = $source.attr('data-summary-buffer-after');
113 }
114 if ('undefined' === typeof before || 'undefined' === typeof after) {
115 return '';
116 }
117 return String(before) + ' / ' + String(after) + ' ' + (labels.minutesLabel || 'min');
118 }
119
120 /** Read the most useful customer identity from the loaded Booking Form. */
121 function get_customer_summary($form) {
122 var first = get_field_value($form.find('[name^="firstname"]').first());
123 var last = get_field_value($form.find('[name^="secondname"], [name^="lastname"]').first());
124 var email = get_field_value($form.find('[name^="email"]').first());
125 var name = String(first + ' ' + last).trim();
126 return name || email;
127 }
128
129 /** Mirror live Appointment and native Booking Form values into the inspector. */
130 function refresh_summary() {
131 var $root = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment').first();
132 var $native = $root.find('.wpbc_booking_appointment__native_form').first();
133 var $form = $native.find('form').first();
134 var $service = $root.find('input[name="wpbc_appointment_service"]:checked').closest('.wpbc_booking_appointment__choice');
135 var $provider = $root.find('input[name="wpbc_appointment_provider"]:checked').closest('.wpbc_booking_appointment__choice');
136 var $selected = $root.find('.wpbc_booking_appointment__selected').first();
137 var $detail_source = $provider.length ? $provider : $service.length ? $service : $selected;
138 var stage = $root.attr('data-appointment-stage') || 'service';
139 var step = get_text($root, '.wpbc_booking_appointment__progress_step.is-active .wpbc_booking_appointment__progress_label');
140 var service = $service.attr('data-summary-service') || $selected.attr('data-summary-service') || '';
141 var provider = $provider.attr('data-summary-provider') || '';
142 var duration = $detail_source.attr('data-summary-duration') || '';
143 var price = $detail_source.attr('data-summary-price') || '';
144 if ($native.length) {
145 service = $native.attr('data-service-title') || service;
146 provider = $native.attr('data-provider-title') || provider;
147 duration = $native.attr('data-duration-label') || duration;
148 price = $native.attr('data-service-cost-label') || price;
149 $detail_source = $native;
150 }
151 set_summary_value('step', step || stage);
152 set_summary_value('service', service);
153 set_summary_value('provider', provider);
154 set_summary_value('duration', duration);
155 set_summary_value('buffers', get_buffer_summary($detail_source));
156 set_summary_value('price', price);
157 set_summary_value('date', get_field_value($form.find('[id^="date_booking"]').first()));
158 set_summary_value('time', get_field_value($form.find('[name^="starttime"]').first()));
159 set_summary_value('customer', get_customer_summary($form));
160 set_summary_value('form', $native.attr('data-form-slug') || '');
161 set_summary_value('emails', $('#is_send_email_for_pending').is(':checked') ? labels.enabledLabel || 'Enabled' : labels.disabledLabel || 'Disabled');
162 $('[data-wpbc-add-appointment-start-over]').prop('hidden', 'service' === stage);
163 $('[data-wpbc-add-appointment-autofill]').prop('disabled', !$form.length);
164 }
165
166 /** Debounce summary work during large AJAX Booking Form DOM insertions. */
167 function schedule_summary_refresh() {
168 window.clearTimeout(summary_timer);
169 summary_timer = window.setTimeout(refresh_summary, 20);
170 }
171
172 /** Fill sample customer fields in the current form without submitting it. */
173 function auto_fill_booking_form() {
174 var $form = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment__native_form form').first();
175 if (!$form.length) {
176 return;
177 }
178 $form.find('input, textarea, select').each(function () {
179 var $field = $(this);
180 var name = String($field.attr('name') || '').toLowerCase();
181 var type = String($field.attr('type') || '').toLowerCase();
182 var ignored = /date_booking|starttime|endtime|durationtime|rangetime|captcha|coupon|service_id|appointment_/.test(name);
183 var value = '';
184 if (ignored || $field.is(':disabled') || 'hidden' === type || 'button' === type || 'submit' === type || 'radio' === type) {
185 return;
186 }
187 if ('checkbox' === type) {
188 if ($field.prop('required')) {
189 $field.prop('checked', true).trigger('change');
190 }
191 return;
192 }
193 if ($field.is('select')) {
194 if (!$field.val()) {
195 var $option = $field.find('option:not(:disabled)').filter(function () {
196 return '' !== String($(this).val() || '');
197 }).first();
198 if ($option.length) {
199 $field.val($option.val()).trigger('change');
200 }
201 }
202 return;
203 }
204 if (/^firstname/.test(name)) {
205 value = 'John';
206 } else if (/^(secondname|lastname)/.test(name)) {
207 value = 'Smith';
208 } else if (/^email/.test(name) || 'email' === type) {
209 value = '[email protected]';
210 } else if (/^phone/.test(name) || 'tel' === type) {
211 value = '0000000000';
212 } else if ($field.is('textarea')) {
213 value = '---';
214 }
215 if (value && !$field.val()) {
216 $field.val(value).trigger('input').trigger('change');
217 }
218 });
219 schedule_summary_refresh();
220 }
221
222 /** Copy the authoritative Appointment correction into its convenience slider. */
223 function synchronize_cost_correction_range() {
224 var $number_field = $('#wpbc_add_appointment_cost_correction');
225 var $range = $('[data-wpbc-admin-cost-correction-range="1"]').first();
226 var number_value;
227 if (!$number_field.length || !$range.length) {
228 return;
229 }
230 number_value = Number($number_field.val());
231 if ('' === String($number_field.val() || '').trim() || !isFinite(number_value)) {
232 $range.val('0');
233 return;
234 }
235 $range.val(String(number_value));
236 }
237
238 /** Copy the convenience slider into the authoritative Appointment number input. */
239 function synchronize_cost_correction_number() {
240 var $number_field = $('#wpbc_add_appointment_cost_correction');
241 var $range = $('[data-wpbc-admin-cost-correction-range="1"]').first();
242 if (!$number_field.length || !$range.length) {
243 return;
244 }
245 $number_field.val($range.val()).trigger('input');
246 }
247
248 /** Clear an unsaved or successfully submitted Appointment correction draft. */
249 function clear_cost_correction() {
250 var $number_field = $('#wpbc_add_appointment_cost_correction');
251 if (!$number_field.length) {
252 return;
253 }
254 $number_field.val('');
255 synchronize_cost_correction_range();
256 }
257
258 /**
259 * Add an explicitly entered correction to the active Appointment request.
260 *
261 * The inspector is outside the AJAX-inserted native Booking Form. Requiring
262 * the submitted Provider to match the active Appointment form prevents this
263 * page-only draft from affecting an unrelated booking-create event.
264 *
265 * @param {Event} event jQuery event.
266 * @param {number} resource_id Submitted Provider resource ID.
267 * @param {Object} params Mutable booking-create request parameters.
268 * @return {void}
269 */
270 function add_cost_correction_to_appointment_request(event, resource_id, params) {
271 var number_field = document.getElementById('wpbc_add_appointment_cost_correction');
272 var $native_form = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment__native_form[data-provider-id="' + Number(resource_id || 0) + '"]').first();
273 var raw_cost;
274 if (!params || !number_field || !$native_form.length) {
275 return;
276 }
277 delete params.wpbc_admin_cost_correction;
278 raw_cost = String(number_field.value || '').trim();
279 if ('' === raw_cost || !number_field.checkValidity()) {
280 return;
281 }
282 params.wpbc_admin_cost_correction = raw_cost;
283 }
284 $(document).on('click', '.wpbc_add_appointment__rightbar_tabs [role="tab"]', function (event) {
285 event.preventDefault();
286 switch_right_panel($(this));
287 });
288 $(document).on('click', '[data-wpbc-add-appointment-start-over]', function () {
289 clear_cost_correction();
290 var $action = $('.wpbc_add_appointment__canvas [data-wpbc-appointment-action="start-over"]').first();
291 if (!$action.length) {
292 $action = $('.wpbc_add_appointment__canvas [data-appointment-back="service"]').first();
293 }
294 if ($action.length) {
295 $action.trigger('click');
296 }
297 });
298 $(document).on('click', '.wpbc_add_appointment__canvas [data-wpbc-appointment-action="start-over"]', clear_cost_correction);
299 $(document).on('click', '[data-wpbc-add-appointment-open-group]', function (event) {
300 event.preventDefault();
301 open_inspector_group($(this).attr('data-wpbc-add-appointment-open-group'), $(this).attr('data-wpbc-add-appointment-focus') || '');
302 });
303 $(document).on('click', '[data-wpbc-add-appointment-autofill]', auto_fill_booking_form);
304 $(document).on('input change wpbc_booking_date_or_option_selected', '.wpbc_add_appointment__canvas, #is_send_email_for_pending', schedule_summary_refresh);
305 $(document).on('input', '#wpbc_add_appointment_cost_correction', synchronize_cost_correction_range);
306 $(document).on('input', '.wpbc_add_appointment__cost_correction [data-wpbc-admin-cost-correction-range="1"]', synchronize_cost_correction_number);
307 $('body').on('wpbc_before_booking_create.wpbc_add_appointment_cost_correction', add_cost_correction_to_appointment_request);
308 $('body').on('wpbc_booking_form_submit_success.wpbc_add_appointment_cost_correction', clear_cost_correction);
309 $(function () {
310 var stage = document.querySelector('.wpbc_add_appointment__canvas .wpbc_booking_appointment__stage');
311 apply_booking_context();
312 refresh_summary();
313 synchronize_cost_correction_range();
314 if (stage && window.MutationObserver) {
315 new MutationObserver(schedule_summary_refresh).observe(stage, {
316 childList: true,
317 subtree: true
318 });
319 }
320 });
321 })(jQuery);
322 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1hZGQtYXBwb2ludG1lbnQvX291dC9hZGRfYXBwb2ludG1lbnRfcGFnZS5qcyIsIm5hbWVzIjpbIiQiLCJzdW1tYXJ5X3RpbWVyIiwibGFiZWxzIiwid2luZG93Iiwid3BiY19hZGRfYXBwb2ludG1lbnRfcGFnZV9jb25maWciLCJhcHBseV9ib29raW5nX2NvbnRleHQiLCJfd3BiYyIsInNldF9vdGhlcl9wYXJhbSIsImFsbG93UGFzdCIsImFsbG93UGFzdERhdGVBcnIiLCJzd2l0Y2hfcmlnaHRfcGFuZWwiLCIkdGFiIiwicGFuZWxfaWQiLCJhdHRyIiwiJHRhYnMiLCJjbG9zZXN0IiwiZmluZCIsIiRwYW5lbHMiLCJoaWRkZW4iLCJyZW1vdmVBdHRyIiwiZ2V0X3RleHQiLCIkcm9vdCIsInNlbGVjdG9yIiwiU3RyaW5nIiwiZmlyc3QiLCJ0ZXh0IiwicmVwbGFjZSIsInRyaW0iLCJnZXRfZmllbGRfdmFsdWUiLCIkZmllbGQiLCJ2YWx1ZSIsImxlbmd0aCIsImlzIiwidmFsIiwic2V0X3N1bW1hcnlfdmFsdWUiLCJrZXkiLCIkdGFyZ2V0IiwiaXNfZW1wdHkiLCJlbXB0eUxhYmVsIiwidG9nZ2xlQ2xhc3MiLCJvcGVuX2luc3BlY3Rvcl9ncm91cCIsImdyb3VwX25hbWUiLCJmb2N1c19zZWxlY3RvciIsIiRncm91cCIsInJvb3QiLCJhcGkiLCJnZXQiLCJfX3dwYmNfY29sbGFwc2libGVfaW5zdGFuY2UiLCJleHBhbmQiLCJzaWJsaW5ncyIsImVhY2giLCIkc2libGluZyIsInJlbW92ZUNsYXNzIiwiY2hpbGRyZW4iLCJhZGRDbGFzcyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJibG9jayIsInNldFRpbWVvdXQiLCJ0cmlnZ2VyIiwiZ2V0X2J1ZmZlcl9zdW1tYXJ5IiwiJHNvdXJjZSIsImJlZm9yZSIsImFmdGVyIiwibWludXRlc0xhYmVsIiwiZ2V0X2N1c3RvbWVyX3N1bW1hcnkiLCIkZm9ybSIsImxhc3QiLCJlbWFpbCIsIm5hbWUiLCJyZWZyZXNoX3N1bW1hcnkiLCIkbmF0aXZlIiwiJHNlcnZpY2UiLCIkcHJvdmlkZXIiLCIkc2VsZWN0ZWQiLCIkZGV0YWlsX3NvdXJjZSIsInN0YWdlIiwic3RlcCIsInNlcnZpY2UiLCJwcm92aWRlciIsImR1cmF0aW9uIiwicHJpY2UiLCJlbmFibGVkTGFiZWwiLCJkaXNhYmxlZExhYmVsIiwicHJvcCIsInNjaGVkdWxlX3N1bW1hcnlfcmVmcmVzaCIsImNsZWFyVGltZW91dCIsImF1dG9fZmlsbF9ib29raW5nX2Zvcm0iLCJ0b0xvd2VyQ2FzZSIsInR5cGUiLCJpZ25vcmVkIiwidGVzdCIsIiRvcHRpb24iLCJmaWx0ZXIiLCJzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UiLCIkbnVtYmVyX2ZpZWxkIiwiJHJhbmdlIiwibnVtYmVyX3ZhbHVlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fbnVtYmVyIiwiY2xlYXJfY29zdF9jb3JyZWN0aW9uIiwiYWRkX2Nvc3RfY29ycmVjdGlvbl90b19hcHBvaW50bWVudF9yZXF1ZXN0IiwiZXZlbnQiLCJyZXNvdXJjZV9pZCIsInBhcmFtcyIsIm51bWJlcl9maWVsZCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCIkbmF0aXZlX2Zvcm0iLCJyYXdfY29zdCIsIndwYmNfYWRtaW5fY29zdF9jb3JyZWN0aW9uIiwiY2hlY2tWYWxpZGl0eSIsIm9uIiwicHJldmVudERlZmF1bHQiLCIkYWN0aW9uIiwicXVlcnlTZWxlY3RvciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2UtYWRkLWFwcG9pbnRtZW50L19zcmMvYWRkX2FwcG9pbnRtZW50X3BhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEFkZCBBcHBvaW50bWVudCBhZG1pbmlzdHJhdG9yIGluc3BlY3RvciBhbmQgbm9uLXN1Ym1pdHRpbmcgaGVscGVyIHRvb2xzLiAqL1xuKCBmdW5jdGlvbiAoICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgc3VtbWFyeV90aW1lciA9IDA7XG5cdHZhciBsYWJlbHMgPSB3aW5kb3cud3BiY19hZGRfYXBwb2ludG1lbnRfcGFnZV9jb25maWcgfHwge307XG5cblx0LyoqIEFwcGx5IHRoZSBhZG1pbmlzdHJhdG9yIHBhZ2UgY29udGV4dCBiZWZvcmUgYW55IFByb3ZpZGVyIGNhbGVuZGFyIGxvYWRzLiAqL1xuXHRmdW5jdGlvbiBhcHBseV9ib29raW5nX2NvbnRleHQoKSB7XG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHdpbmRvdy5fd3BiYyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR3aW5kb3cuX3dwYmMuc2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2Jvb2tpbmdfaGFzaCcsICcnICk7XG5cdFx0d2luZG93Ll93cGJjLnNldF9vdGhlcl9wYXJhbSggJ3RoaXNfcGFnZV9hbGxvd19wYXN0JywgbGFiZWxzLmFsbG93UGFzdCA/IDEgOiAwICk7XG5cdFx0d2luZG93Ll93cGJjLnNldF9vdGhlcl9wYXJhbSggJ3RoaXNfcGFnZV9hbGxvd19wYXN0X2FycicsIGxhYmVscy5hbGxvd1Bhc3REYXRlQXJyIHx8IFtdICk7XG5cdH1cblxuXHQvKiogU3dpdGNoIG9uZSBzaGFyZWQgcmlnaHQtc2lkZWJhciBwYW5lbC4gKi9cblx0ZnVuY3Rpb24gc3dpdGNoX3JpZ2h0X3BhbmVsKCAkdGFiICkge1xuXHRcdHZhciBwYW5lbF9pZCA9ICR0YWIuYXR0ciggJ2FyaWEtY29udHJvbHMnICk7XG5cdFx0dmFyICR0YWJzID0gJHRhYi5jbG9zZXN0KCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19yaWdodGJhcl90YWJzJyApLmZpbmQoICdbcm9sZT1cInRhYlwiXScgKTtcblx0XHR2YXIgJHBhbmVscyA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX3JpZ2h0YmFyJyApLmZpbmQoICdbcm9sZT1cInRhYnBhbmVsXCJdJyApO1xuXG5cdFx0JHRhYnMuYXR0ciggJ2FyaWEtc2VsZWN0ZWQnLCAnZmFsc2UnICk7XG5cdFx0JHRhYi5hdHRyKCAnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyApO1xuXHRcdCRwYW5lbHMuYXR0ciggeyBoaWRkZW46IHRydWUsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9ICk7XG5cdFx0JCggJyMnICsgcGFuZWxfaWQgKS5yZW1vdmVBdHRyKCAnaGlkZGVuJyApLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0fVxuXG5cdC8qKiBSZXR1cm4gdHJpbW1lZCB2aXNpYmxlIHRleHQgZnJvbSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudC4gKi9cblx0ZnVuY3Rpb24gZ2V0X3RleHQoICRyb290LCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gU3RyaW5nKCAkcm9vdC5maW5kKCBzZWxlY3RvciApLmZpcnN0KCkudGV4dCgpIHx8ICcnICkucmVwbGFjZSggL1xccysvZywgJyAnICkudHJpbSgpO1xuXHR9XG5cblx0LyoqIFJldHVybiB0aGUgZGlzcGxheSB2YWx1ZSBvZiBvbmUgbmF0aXZlIEJvb2tpbmcgRm9ybSBmaWVsZC4gKi9cblx0ZnVuY3Rpb24gZ2V0X2ZpZWxkX3ZhbHVlKCAkZmllbGQgKSB7XG5cdFx0dmFyIHZhbHVlO1xuXG5cdFx0aWYgKCAhICRmaWVsZC5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdGlmICggJGZpZWxkLmlzKCAnc2VsZWN0JyApICkge1xuXHRcdFx0dmFsdWUgPSAkZmllbGQuZmluZCggJ29wdGlvbjpzZWxlY3RlZCcgKS50ZXh0KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbHVlID0gJGZpZWxkLnZhbCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiBTdHJpbmcoIHZhbHVlIHx8ICcnICkucmVwbGFjZSggL1xccysvZywgJyAnICkudHJpbSgpO1xuXHR9XG5cblx0LyoqIFVwZGF0ZSBvbmUgc3VtbWFyeSB2YWx1ZSBhbmQgaXRzIGVtcHR5LXN0YXRlIHByZXNlbnRhdGlvbi4gKi9cblx0ZnVuY3Rpb24gc2V0X3N1bW1hcnlfdmFsdWUoIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyICR0YXJnZXQgPSAkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3VtbWFyeT1cIicgKyBrZXkgKyAnXCJdJyApO1xuXHRcdHZhciBpc19lbXB0eSA9ICcnID09PSBTdHJpbmcoIHZhbHVlIHx8ICcnICkudHJpbSgpO1xuXG5cdFx0JHRhcmdldC50ZXh0KCBpc19lbXB0eSA/ICggbGFiZWxzLmVtcHR5TGFiZWwgfHwgJ05vdCBzZWxlY3RlZCcgKSA6IHZhbHVlICk7XG5cdFx0JHRhcmdldC50b2dnbGVDbGFzcyggJ2lzLWVtcHR5JywgaXNfZW1wdHkgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHBhbmQgb25lIFNldHRpbmdzIGluc3BlY3RvciBncm91cCB0aHJvdWdoIHRoZSBzaGFyZWQgY29sbGFwc2libGUgQVBJLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBfbmFtZSBHcm91cCBkYXRhIGtleS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZvY3VzX3NlbGVjdG9yIE9wdGlvbmFsIGNvbnRyb2wgdG8gZm9jdXMgYWZ0ZXIgZXhwYW5zaW9uLlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gb3Blbl9pbnNwZWN0b3JfZ3JvdXAoIGdyb3VwX25hbWUsIGZvY3VzX3NlbGVjdG9yICkge1xuXHRcdHZhciAkZ3JvdXAgPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19pbnNwZWN0b3Jfb3ZlcnZpZXcgLndwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwW2RhdGEtZ3JvdXA9XCInICsgZ3JvdXBfbmFtZSArICdcIl0nICkuZmlyc3QoKTtcblx0XHR2YXIgcm9vdDtcblx0XHR2YXIgYXBpO1xuXG5cdFx0aWYgKCAhICRncm91cC5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cm9vdCA9ICRncm91cC5jbG9zZXN0KCAnLndwYmNfY29sbGFwc2libGUnICkuZ2V0KCAwICk7XG5cdFx0YXBpID0gcm9vdCAmJiByb290Ll9fd3BiY19jb2xsYXBzaWJsZV9pbnN0YW5jZTtcblxuXHRcdGlmICggYXBpICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhcGkuZXhwYW5kICkge1xuXHRcdFx0YXBpLmV4cGFuZCggJGdyb3VwLmdldCggMCApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRncm91cC5zaWJsaW5ncyggJy53cGJjX3VpX19jb2xsYXBzaWJsZV9ncm91cCcgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciAkc2libGluZyA9ICQoIHRoaXMgKTtcblx0XHRcdFx0JHNpYmxpbmcucmVtb3ZlQ2xhc3MoICdpcy1vcGVuJyApO1xuXHRcdFx0XHQkc2libGluZy5jaGlsZHJlbiggJy5ncm91cF9faGVhZGVyJyApLmF0dHIoICdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyApO1xuXHRcdFx0XHQkc2libGluZy5jaGlsZHJlbiggJy5ncm91cF9fZmllbGRzJyApLmF0dHIoIHsgaGlkZGVuOiB0cnVlLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSApO1xuXHRcdFx0fSApO1xuXHRcdFx0JGdyb3VwLmFkZENsYXNzKCAnaXMtb3BlbicgKTtcblx0XHRcdCRncm91cC5jaGlsZHJlbiggJy5ncm91cF9faGVhZGVyJyApLmF0dHIoICdhcmlhLWV4cGFuZGVkJywgJ3RydWUnICk7XG5cdFx0XHQkZ3JvdXAuY2hpbGRyZW4oICcuZ3JvdXBfX2ZpZWxkcycgKS5yZW1vdmVBdHRyKCAnaGlkZGVuJyApLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0XHR9XG5cblx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHQkZ3JvdXAuZ2V0KCAwICkuc2Nyb2xsSW50b1ZpZXcoIHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9ICk7XG5cdFx0XHRpZiAoIGZvY3VzX3NlbGVjdG9yICkge1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCQoIGZvY3VzX3NlbGVjdG9yICkuZmlyc3QoKS50cmlnZ2VyKCAnZm9jdXMnICk7XG5cdFx0XHRcdH0sIDI1MCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBGb3JtYXQgdGhlIGVmZmVjdGl2ZSBiZWZvcmUvYWZ0ZXIgU2VydmljZSBidWZmZXJzLiAqL1xuXHRmdW5jdGlvbiBnZXRfYnVmZmVyX3N1bW1hcnkoICRzb3VyY2UgKSB7XG5cdFx0dmFyIGJlZm9yZSA9ICRzb3VyY2UuYXR0ciggJ2RhdGEtYnVmZmVyLWJlZm9yZScgKTtcblx0XHR2YXIgYWZ0ZXIgPSAkc291cmNlLmF0dHIoICdkYXRhLWJ1ZmZlci1hZnRlcicgKTtcblxuXHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiZWZvcmUgKSB7XG5cdFx0XHRiZWZvcmUgPSAkc291cmNlLmF0dHIoICdkYXRhLXN1bW1hcnktYnVmZmVyLWJlZm9yZScgKTtcblx0XHRcdGFmdGVyID0gJHNvdXJjZS5hdHRyKCAnZGF0YS1zdW1tYXJ5LWJ1ZmZlci1hZnRlcicgKTtcblx0XHR9XG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGJlZm9yZSB8fCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGFmdGVyICkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdHJldHVybiBTdHJpbmcoIGJlZm9yZSApICsgJyAvICcgKyBTdHJpbmcoIGFmdGVyICkgKyAnICcgKyAoIGxhYmVscy5taW51dGVzTGFiZWwgfHwgJ21pbicgKTtcblx0fVxuXG5cdC8qKiBSZWFkIHRoZSBtb3N0IHVzZWZ1bCBjdXN0b21lciBpZGVudGl0eSBmcm9tIHRoZSBsb2FkZWQgQm9va2luZyBGb3JtLiAqL1xuXHRmdW5jdGlvbiBnZXRfY3VzdG9tZXJfc3VtbWFyeSggJGZvcm0gKSB7XG5cdFx0dmFyIGZpcnN0ID0gZ2V0X2ZpZWxkX3ZhbHVlKCAkZm9ybS5maW5kKCAnW25hbWVePVwiZmlyc3RuYW1lXCJdJyApLmZpcnN0KCkgKTtcblx0XHR2YXIgbGFzdCA9IGdldF9maWVsZF92YWx1ZSggJGZvcm0uZmluZCggJ1tuYW1lXj1cInNlY29uZG5hbWVcIl0sIFtuYW1lXj1cImxhc3RuYW1lXCJdJyApLmZpcnN0KCkgKTtcblx0XHR2YXIgZW1haWwgPSBnZXRfZmllbGRfdmFsdWUoICRmb3JtLmZpbmQoICdbbmFtZV49XCJlbWFpbFwiXScgKS5maXJzdCgpICk7XG5cdFx0dmFyIG5hbWUgPSBTdHJpbmcoIGZpcnN0ICsgJyAnICsgbGFzdCApLnRyaW0oKTtcblxuXHRcdHJldHVybiBuYW1lIHx8IGVtYWlsO1xuXHR9XG5cblx0LyoqIE1pcnJvciBsaXZlIEFwcG9pbnRtZW50IGFuZCBuYXRpdmUgQm9va2luZyBGb3JtIHZhbHVlcyBpbnRvIHRoZSBpbnNwZWN0b3IuICovXG5cdGZ1bmN0aW9uIHJlZnJlc2hfc3VtbWFyeSgpIHtcblx0XHR2YXIgJHJvb3QgPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgLndwYmNfYm9va2luZ19hcHBvaW50bWVudCcgKS5maXJzdCgpO1xuXHRcdHZhciAkbmF0aXZlID0gJHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtJyApLmZpcnN0KCk7XG5cdFx0dmFyICRmb3JtID0gJG5hdGl2ZS5maW5kKCAnZm9ybScgKS5maXJzdCgpO1xuXHRcdHZhciAkc2VydmljZSA9ICRyb290LmZpbmQoICdpbnB1dFtuYW1lPVwid3BiY19hcHBvaW50bWVudF9zZXJ2aWNlXCJdOmNoZWNrZWQnICkuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZScgKTtcblx0XHR2YXIgJHByb3ZpZGVyID0gJHJvb3QuZmluZCggJ2lucHV0W25hbWU9XCJ3cGJjX2FwcG9pbnRtZW50X3Byb3ZpZGVyXCJdOmNoZWNrZWQnICkuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZScgKTtcblx0XHR2YXIgJHNlbGVjdGVkID0gJHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX3NlbGVjdGVkJyApLmZpcnN0KCk7XG5cdFx0dmFyICRkZXRhaWxfc291cmNlID0gJHByb3ZpZGVyLmxlbmd0aCA/ICRwcm92aWRlciA6ICggJHNlcnZpY2UubGVuZ3RoID8gJHNlcnZpY2UgOiAkc2VsZWN0ZWQgKTtcblx0XHR2YXIgc3RhZ2UgPSAkcm9vdC5hdHRyKCAnZGF0YS1hcHBvaW50bWVudC1zdGFnZScgKSB8fCAnc2VydmljZSc7XG5cdFx0dmFyIHN0ZXAgPSBnZXRfdGV4dCggJHJvb3QsICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19wcm9ncmVzc19zdGVwLmlzLWFjdGl2ZSAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19wcm9ncmVzc19sYWJlbCcgKTtcblx0XHR2YXIgc2VydmljZSA9ICRzZXJ2aWNlLmF0dHIoICdkYXRhLXN1bW1hcnktc2VydmljZScgKSB8fCAkc2VsZWN0ZWQuYXR0ciggJ2RhdGEtc3VtbWFyeS1zZXJ2aWNlJyApIHx8ICcnO1xuXHRcdHZhciBwcm92aWRlciA9ICRwcm92aWRlci5hdHRyKCAnZGF0YS1zdW1tYXJ5LXByb3ZpZGVyJyApIHx8ICcnO1xuXHRcdHZhciBkdXJhdGlvbiA9ICRkZXRhaWxfc291cmNlLmF0dHIoICdkYXRhLXN1bW1hcnktZHVyYXRpb24nICkgfHwgJyc7XG5cdFx0dmFyIHByaWNlID0gJGRldGFpbF9zb3VyY2UuYXR0ciggJ2RhdGEtc3VtbWFyeS1wcmljZScgKSB8fCAnJztcblxuXHRcdGlmICggJG5hdGl2ZS5sZW5ndGggKSB7XG5cdFx0XHRzZXJ2aWNlID0gJG5hdGl2ZS5hdHRyKCAnZGF0YS1zZXJ2aWNlLXRpdGxlJyApIHx8IHNlcnZpY2U7XG5cdFx0XHRwcm92aWRlciA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtcHJvdmlkZXItdGl0bGUnICkgfHwgcHJvdmlkZXI7XG5cdFx0XHRkdXJhdGlvbiA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtZHVyYXRpb24tbGFiZWwnICkgfHwgZHVyYXRpb247XG5cdFx0XHRwcmljZSA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtc2VydmljZS1jb3N0LWxhYmVsJyApIHx8IHByaWNlO1xuXHRcdFx0JGRldGFpbF9zb3VyY2UgPSAkbmF0aXZlO1xuXHRcdH1cblxuXHRcdHNldF9zdW1tYXJ5X3ZhbHVlKCAnc3RlcCcsIHN0ZXAgfHwgc3RhZ2UgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ3NlcnZpY2UnLCBzZXJ2aWNlICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdwcm92aWRlcicsIHByb3ZpZGVyICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdkdXJhdGlvbicsIGR1cmF0aW9uICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdidWZmZXJzJywgZ2V0X2J1ZmZlcl9zdW1tYXJ5KCAkZGV0YWlsX3NvdXJjZSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdwcmljZScsIHByaWNlICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdkYXRlJywgZ2V0X2ZpZWxkX3ZhbHVlKCAkZm9ybS5maW5kKCAnW2lkXj1cImRhdGVfYm9va2luZ1wiXScgKS5maXJzdCgpICkgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ3RpbWUnLCBnZXRfZmllbGRfdmFsdWUoICRmb3JtLmZpbmQoICdbbmFtZV49XCJzdGFydHRpbWVcIl0nICkuZmlyc3QoKSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdjdXN0b21lcicsIGdldF9jdXN0b21lcl9zdW1tYXJ5KCAkZm9ybSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdmb3JtJywgJG5hdGl2ZS5hdHRyKCAnZGF0YS1mb3JtLXNsdWcnICkgfHwgJycgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ2VtYWlscycsICQoICcjaXNfc2VuZF9lbWFpbF9mb3JfcGVuZGluZycgKS5pcyggJzpjaGVja2VkJyApID8gKCBsYWJlbHMuZW5hYmxlZExhYmVsIHx8ICdFbmFibGVkJyApIDogKCBsYWJlbHMuZGlzYWJsZWRMYWJlbCB8fCAnRGlzYWJsZWQnICkgKTtcblx0XHQkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3RhcnQtb3Zlcl0nICkucHJvcCggJ2hpZGRlbicsICdzZXJ2aWNlJyA9PT0gc3RhZ2UgKTtcblx0XHQkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtYXV0b2ZpbGxdJyApLnByb3AoICdkaXNhYmxlZCcsICEgJGZvcm0ubGVuZ3RoICk7XG5cdH1cblxuXHQvKiogRGVib3VuY2Ugc3VtbWFyeSB3b3JrIGR1cmluZyBsYXJnZSBBSkFYIEJvb2tpbmcgRm9ybSBET00gaW5zZXJ0aW9ucy4gKi9cblx0ZnVuY3Rpb24gc2NoZWR1bGVfc3VtbWFyeV9yZWZyZXNoKCkge1xuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHN1bW1hcnlfdGltZXIgKTtcblx0XHRzdW1tYXJ5X3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIHJlZnJlc2hfc3VtbWFyeSwgMjAgKTtcblx0fVxuXG5cdC8qKiBGaWxsIHNhbXBsZSBjdXN0b21lciBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZm9ybSB3aXRob3V0IHN1Ym1pdHRpbmcgaXQuICovXG5cdGZ1bmN0aW9uIGF1dG9fZmlsbF9ib29raW5nX2Zvcm0oKSB7XG5cdFx0dmFyICRmb3JtID0gJCggJy53cGJjX2FkZF9hcHBvaW50bWVudF9fY2FudmFzIC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtIGZvcm0nICkuZmlyc3QoKTtcblxuXHRcdGlmICggISAkZm9ybS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JGZvcm0uZmluZCggJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0JyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciAkZmllbGQgPSAkKCB0aGlzICk7XG5cdFx0XHR2YXIgbmFtZSA9IFN0cmluZyggJGZpZWxkLmF0dHIoICduYW1lJyApIHx8ICcnICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHZhciB0eXBlID0gU3RyaW5nKCAkZmllbGQuYXR0ciggJ3R5cGUnICkgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dmFyIGlnbm9yZWQgPSAvZGF0ZV9ib29raW5nfHN0YXJ0dGltZXxlbmR0aW1lfGR1cmF0aW9udGltZXxyYW5nZXRpbWV8Y2FwdGNoYXxjb3Vwb258c2VydmljZV9pZHxhcHBvaW50bWVudF8vLnRlc3QoIG5hbWUgKTtcblx0XHRcdHZhciB2YWx1ZSA9ICcnO1xuXG5cdFx0XHRpZiAoIGlnbm9yZWQgfHwgJGZpZWxkLmlzKCAnOmRpc2FibGVkJyApIHx8ICdoaWRkZW4nID09PSB0eXBlIHx8ICdidXR0b24nID09PSB0eXBlIHx8ICdzdWJtaXQnID09PSB0eXBlIHx8ICdyYWRpbycgPT09IHR5cGUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggJ2NoZWNrYm94JyA9PT0gdHlwZSApIHtcblx0XHRcdFx0aWYgKCAkZmllbGQucHJvcCggJ3JlcXVpcmVkJyApICkge1xuXHRcdFx0XHRcdCRmaWVsZC5wcm9wKCAnY2hlY2tlZCcsIHRydWUgKS50cmlnZ2VyKCAnY2hhbmdlJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggJGZpZWxkLmlzKCAnc2VsZWN0JyApICkge1xuXHRcdFx0XHRpZiAoICEgJGZpZWxkLnZhbCgpICkge1xuXHRcdFx0XHRcdHZhciAkb3B0aW9uID0gJGZpZWxkLmZpbmQoICdvcHRpb246bm90KDpkaXNhYmxlZCknICkuZmlsdGVyKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJycgIT09IFN0cmluZyggJCggdGhpcyApLnZhbCgpIHx8ICcnICk7XG5cdFx0XHRcdFx0fSApLmZpcnN0KCk7XG5cdFx0XHRcdFx0aWYgKCAkb3B0aW9uLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdCRmaWVsZC52YWwoICRvcHRpb24udmFsKCkgKS50cmlnZ2VyKCAnY2hhbmdlJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIC9eZmlyc3RuYW1lLy50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdHZhbHVlID0gJ0pvaG4nO1xuXHRcdFx0fSBlbHNlIGlmICggL14oc2Vjb25kbmFtZXxsYXN0bmFtZSkvLnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0dmFsdWUgPSAnU21pdGgnO1xuXHRcdFx0fSBlbHNlIGlmICggL15lbWFpbC8udGVzdCggbmFtZSApIHx8ICdlbWFpbCcgPT09IHR5cGUgKSB7XG5cdFx0XHRcdHZhbHVlID0gJ2JsYW5rQHdwYm9va2luZ21hbmFnZXIuY29tJztcblx0XHRcdH0gZWxzZSBpZiAoIC9ecGhvbmUvLnRlc3QoIG5hbWUgKSB8fCAndGVsJyA9PT0gdHlwZSApIHtcblx0XHRcdFx0dmFsdWUgPSAnMDAwMDAwMDAwMCc7XG5cdFx0XHR9IGVsc2UgaWYgKCAkZmllbGQuaXMoICd0ZXh0YXJlYScgKSApIHtcblx0XHRcdFx0dmFsdWUgPSAnLS0tJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWx1ZSAmJiAhICRmaWVsZC52YWwoKSApIHtcblx0XHRcdFx0JGZpZWxkLnZhbCggdmFsdWUgKS50cmlnZ2VyKCAnaW5wdXQnICkudHJpZ2dlciggJ2NoYW5nZScgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRzY2hlZHVsZV9zdW1tYXJ5X3JlZnJlc2goKTtcblx0fVxuXG5cdC8qKiBDb3B5IHRoZSBhdXRob3JpdGF0aXZlIEFwcG9pbnRtZW50IGNvcnJlY3Rpb24gaW50byBpdHMgY29udmVuaWVuY2Ugc2xpZGVyLiAqL1xuXHRmdW5jdGlvbiBzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UoKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgJHJhbmdlID0gJCggJ1tkYXRhLXdwYmMtYWRtaW4tY29zdC1jb3JyZWN0aW9uLXJhbmdlPVwiMVwiXScgKS5maXJzdCgpO1xuXHRcdHZhciBudW1iZXJfdmFsdWU7XG5cblx0XHRpZiAoICEgJG51bWJlcl9maWVsZC5sZW5ndGggfHwgISAkcmFuZ2UubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG51bWJlcl92YWx1ZSA9IE51bWJlciggJG51bWJlcl9maWVsZC52YWwoKSApO1xuXHRcdGlmICggJycgPT09IFN0cmluZyggJG51bWJlcl9maWVsZC52YWwoKSB8fCAnJyApLnRyaW0oKSB8fCAhIGlzRmluaXRlKCBudW1iZXJfdmFsdWUgKSApIHtcblx0XHRcdCRyYW5nZS52YWwoICcwJyApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRyYW5nZS52YWwoIFN0cmluZyggbnVtYmVyX3ZhbHVlICkgKTtcblx0fVxuXG5cdC8qKiBDb3B5IHRoZSBjb252ZW5pZW5jZSBzbGlkZXIgaW50byB0aGUgYXV0aG9yaXRhdGl2ZSBBcHBvaW50bWVudCBudW1iZXIgaW5wdXQuICovXG5cdGZ1bmN0aW9uIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9udW1iZXIoKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgJHJhbmdlID0gJCggJ1tkYXRhLXdwYmMtYWRtaW4tY29zdC1jb3JyZWN0aW9uLXJhbmdlPVwiMVwiXScgKS5maXJzdCgpO1xuXG5cdFx0aWYgKCAhICRudW1iZXJfZmllbGQubGVuZ3RoIHx8ICEgJHJhbmdlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkbnVtYmVyX2ZpZWxkLnZhbCggJHJhbmdlLnZhbCgpICkudHJpZ2dlciggJ2lucHV0JyApO1xuXHR9XG5cblx0LyoqIENsZWFyIGFuIHVuc2F2ZWQgb3Igc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCBBcHBvaW50bWVudCBjb3JyZWN0aW9uIGRyYWZ0LiAqL1xuXHRmdW5jdGlvbiBjbGVhcl9jb3N0X2NvcnJlY3Rpb24oKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblxuXHRcdGlmICggISAkbnVtYmVyX2ZpZWxkLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkbnVtYmVyX2ZpZWxkLnZhbCggJycgKTtcblx0XHRzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gZXhwbGljaXRseSBlbnRlcmVkIGNvcnJlY3Rpb24gdG8gdGhlIGFjdGl2ZSBBcHBvaW50bWVudCByZXF1ZXN0LlxuXHQgKlxuXHQgKiBUaGUgaW5zcGVjdG9yIGlzIG91dHNpZGUgdGhlIEFKQVgtaW5zZXJ0ZWQgbmF0aXZlIEJvb2tpbmcgRm9ybS4gUmVxdWlyaW5nXG5cdCAqIHRoZSBzdWJtaXR0ZWQgUHJvdmlkZXIgdG8gbWF0Y2ggdGhlIGFjdGl2ZSBBcHBvaW50bWVudCBmb3JtIHByZXZlbnRzIHRoaXNcblx0ICogcGFnZS1vbmx5IGRyYWZ0IGZyb20gYWZmZWN0aW5nIGFuIHVucmVsYXRlZCBib29raW5nLWNyZWF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgalF1ZXJ5IGV2ZW50LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb3VyY2VfaWQgU3VibWl0dGVkIFByb3ZpZGVyIHJlc291cmNlIElELlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIE11dGFibGUgYm9va2luZy1jcmVhdGUgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRkX2Nvc3RfY29ycmVjdGlvbl90b19hcHBvaW50bWVudF9yZXF1ZXN0KCBldmVudCwgcmVzb3VyY2VfaWQsIHBhcmFtcyApIHtcblx0XHR2YXIgbnVtYmVyX2ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2FkZF9hcHBvaW50bWVudF9jb3N0X2NvcnJlY3Rpb24nICk7XG5cdFx0dmFyICRuYXRpdmVfZm9ybSA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19uYXRpdmVfZm9ybVtkYXRhLXByb3ZpZGVyLWlkPVwiJyArIE51bWJlciggcmVzb3VyY2VfaWQgfHwgMCApICsgJ1wiXScgKS5maXJzdCgpO1xuXHRcdHZhciByYXdfY29zdDtcblxuXHRcdGlmICggISBwYXJhbXMgfHwgISBudW1iZXJfZmllbGQgfHwgISAkbmF0aXZlX2Zvcm0ubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSBwYXJhbXMud3BiY19hZG1pbl9jb3N0X2NvcnJlY3Rpb247XG5cdFx0cmF3X2Nvc3QgPSBTdHJpbmcoIG51bWJlcl9maWVsZC52YWx1ZSB8fCAnJyApLnRyaW0oKTtcblx0XHRpZiAoICcnID09PSByYXdfY29zdCB8fCAhIG51bWJlcl9maWVsZC5jaGVja1ZhbGlkaXR5KCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cGFyYW1zLndwYmNfYWRtaW5fY29zdF9jb3JyZWN0aW9uID0gcmF3X2Nvc3Q7XG5cdH1cblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19yaWdodGJhcl90YWJzIFtyb2xlPVwidGFiXCJdJywgZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHN3aXRjaF9yaWdodF9wYW5lbCggJCggdGhpcyApICk7XG5cdH0gKTtcblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3RhcnQtb3Zlcl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0Y2xlYXJfY29zdF9jb3JyZWN0aW9uKCk7XG5cdFx0dmFyICRhY3Rpb24gPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgW2RhdGEtd3BiYy1hcHBvaW50bWVudC1hY3Rpb249XCJzdGFydC1vdmVyXCJdJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAhICRhY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0JGFjdGlvbiA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyBbZGF0YS1hcHBvaW50bWVudC1iYWNrPVwic2VydmljZVwiXScgKS5maXJzdCgpO1xuXHRcdH1cblx0XHRpZiAoICRhY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0JGFjdGlvbi50cmlnZ2VyKCAnY2xpY2snICk7XG5cdFx0fVxuXHR9ICk7XG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyBbZGF0YS13cGJjLWFwcG9pbnRtZW50LWFjdGlvbj1cInN0YXJ0LW92ZXJcIl0nLCBjbGVhcl9jb3N0X2NvcnJlY3Rpb24gKTtcblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtb3Blbi1ncm91cF0nLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0b3Blbl9pbnNwZWN0b3JfZ3JvdXAoICQoIHRoaXMgKS5hdHRyKCAnZGF0YS13cGJjLWFkZC1hcHBvaW50bWVudC1vcGVuLWdyb3VwJyApLCAkKCB0aGlzICkuYXR0ciggJ2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtZm9jdXMnICkgfHwgJycgKTtcblx0fSApO1xuXG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICdbZGF0YS13cGJjLWFkZC1hcHBvaW50bWVudC1hdXRvZmlsbF0nLCBhdXRvX2ZpbGxfYm9va2luZ19mb3JtICk7XG5cdCQoIGRvY3VtZW50ICkub24oICdpbnB1dCBjaGFuZ2Ugd3BiY19ib29raW5nX2RhdGVfb3Jfb3B0aW9uX3NlbGVjdGVkJywgJy53cGJjX2FkZF9hcHBvaW50bWVudF9fY2FudmFzLCAjaXNfc2VuZF9lbWFpbF9mb3JfcGVuZGluZycsIHNjaGVkdWxlX3N1bW1hcnlfcmVmcmVzaCApO1xuXHQkKCBkb2N1bWVudCApLm9uKCAnaW5wdXQnLCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9yYW5nZSApO1xuXHQkKCBkb2N1bWVudCApLm9uKCAnaW5wdXQnLCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jb3N0X2NvcnJlY3Rpb24gW2RhdGEtd3BiYy1hZG1pbi1jb3N0LWNvcnJlY3Rpb24tcmFuZ2U9XCIxXCJdJywgc3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX251bWJlciApO1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYmVmb3JlX2Jvb2tpbmdfY3JlYXRlLndwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIGFkZF9jb3N0X2NvcnJlY3Rpb25fdG9fYXBwb2ludG1lbnRfcmVxdWVzdCApO1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYm9va2luZ19mb3JtX3N1Ym1pdF9zdWNjZXNzLndwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIGNsZWFyX2Nvc3RfY29ycmVjdGlvbiApO1xuXG5cdCQoIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgc3RhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc3RhZ2UnICk7XG5cdFx0YXBwbHlfYm9va2luZ19jb250ZXh0KCk7XG5cdFx0cmVmcmVzaF9zdW1tYXJ5KCk7XG5cdFx0c3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX3JhbmdlKCk7XG5cdFx0aWYgKCBzdGFnZSAmJiB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciApIHtcblx0XHRcdG5ldyBNdXRhdGlvbk9ic2VydmVyKCBzY2hlZHVsZV9zdW1tYXJ5X3JlZnJlc2ggKS5vYnNlcnZlKCBzdGFnZSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSApO1xuXHRcdH1cblx0fSApO1xufSApKCBqUXVlcnkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLENBQUUsVUFBV0EsQ0FBQyxFQUFHO0VBQ2hCLFlBQVk7O0VBRVosSUFBSUMsYUFBYSxHQUFHLENBQUM7RUFDckIsSUFBSUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLGdDQUFnQyxJQUFJLENBQUMsQ0FBQzs7RUFFMUQ7RUFDQSxTQUFTQyxxQkFBcUJBLENBQUEsRUFBRztJQUNoQyxJQUFLLFdBQVcsS0FBSyxPQUFPRixNQUFNLENBQUNHLEtBQUssRUFBRztNQUMxQztJQUNEO0lBRUFILE1BQU0sQ0FBQ0csS0FBSyxDQUFDQyxlQUFlLENBQUUsd0JBQXdCLEVBQUUsRUFBRyxDQUFDO0lBQzVESixNQUFNLENBQUNHLEtBQUssQ0FBQ0MsZUFBZSxDQUFFLHNCQUFzQixFQUFFTCxNQUFNLENBQUNNLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO0lBQ2hGTCxNQUFNLENBQUNHLEtBQUssQ0FBQ0MsZUFBZSxDQUFFLDBCQUEwQixFQUFFTCxNQUFNLENBQUNPLGdCQUFnQixJQUFJLEVBQUcsQ0FBQztFQUMxRjs7RUFFQTtFQUNBLFNBQVNDLGtCQUFrQkEsQ0FBRUMsSUFBSSxFQUFHO0lBQ25DLElBQUlDLFFBQVEsR0FBR0QsSUFBSSxDQUFDRSxJQUFJLENBQUUsZUFBZ0IsQ0FBQztJQUMzQyxJQUFJQyxLQUFLLEdBQUdI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W119
323